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为低位。