4乘4矩阵式键盘使用
- 格式:doc
- 大小:97.00 KB
- 文档页数:4
4乘4矩阵式键盘在单片机中的应用--C语言
下图为4*4键盘的结果图,用单片机的P1口接4×4矩阵键盘,接法如图所示,用数码管显示按键的值,按下键S1,数码管显示0,按下S2,数码管显示1,按下S16,显示F。
先看程序代码:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,
0x71};//八段数码管对应0—F值。
void Delay_1ms(uint i)//1ms延时
{
uchar x, j;
for(j=0;j
for(x=0;x<=148;x++);
}
void delay()//消除按键抖动延时
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0; j<4; j++)
{
P1 = Buffer[j];
delay();
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
return (i+j*4);
}
temp <<= 1;
}
}
}
void Main(void)
{
uchar Key_Value; //读出的键值
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
{
Delay_1ms(15); //按键消抖
if(P1 != 0xf0)
{
Key_Value = Keyscan();
}
}
P0 = table[Key_Value];//P0口输出数据 到 数码管
}
}
代码分析:
程序从Main开始执行,Key_Value用来存放Keyscan();的返回值,Key_Value为1,则数码管会显示1。进入while循环:
P1 = 0xf0 ;
if(P1 != 0xf0)
{
Delay_1ms(15);
if(P1 != 0xf0)
{
Key_Value = Keyscan();
}
}
P0 = table[Key_Value];//P0口输出数据 到 数码管
P1的高四位为1,低四位为0,说明P1口高四位作输入,低四位作输出并且输出的值为0。这时,可以把低四位看做是接地。如果没有按键按下时,由于P1口外接电阻和VCC,高四位作输入,输入的值一直是1, if条件不会成立,P1的值一直会是0xf0,Keyscan()函数一直不会被调用,数码管不会显示任何值。
下图是单片机的P1口外接电阻图:
但当某一个按键按下时,不妨假设按键S1按下,这时,由于低四位是0,当做接地,高四位作输入,由于S1接通,P10和P14接通,由于P10为地,必然导致P14也为地,从P14读入的值必然为零,此时P1=1110 0000,不再等于11110000,进入IF。调用Delay_1ms(15);延时一段时间,消除开关抖动,如果延时过后,开关仍是闭合的, P1 != 0xf0仍然成立,调用Keyscan()函数。
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0; j<4; j++)
{
P1 = Buffer[j];
delay();
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
return (i+j*4);
}
temp <<= 1;
}
}
}
Buffer[4]里面放的是:1111 1110,1111 1101,1111 1011,1111 0111
进入第一个FOR循环,j=0,把1111 1110输出到P1口,此时,为了找到是哪个按键按下了,只留一位作输出,输出0 ,作为地。调用delay();延时,现在P1口的值为多少?此时,开关S1仍闭合,高四位值还为1110 低四位中的三个输入,没有别的开关闭合,仍是高电平1,而另一位作输出,为0。这样P1的值为
1110 1110,此时的temp=0001 0000,进入第二个FOR。Temp和P1按位与,其结果为0,再取非,IF 条件成立,return i+j*4,两个循环都是第一次执行,i=0,j=0。返回值为0。此时Keyscan()函数执行结束,返回主函数,Key_Value得到返回值0,而P0 = table[0]= 0011 1111。对应八段数码管的结构图知,显示0。
DP为最高位,G,F,E,D,C,B,A为低位。