《2022年乘矩阵式键盘使用[参 .pdf》由会员分享,可在线阅读,更多相关《2022年乘矩阵式键盘使用[参 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4乘 4矩阵式键盘在单片机中的应用-C 语言下图为 4*4 键盘的结果图,用单片机的P1口接 44 矩阵键盘,接法如图所示, 用数码管显示按键的值, 按下键 S1,数码管显示 0,按下 S2,数码管显示 1,按下 S16,显示 F。先看程序代码:#include #include #define uint unsigned int #define uchar unsigned char uchar code table16 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,
2、0 x79, 0 x71;/八段数码管对应 0F 值。void Delay_1ms(uint i)/1ms 延时 uchar x, j; for(j=0;ji;j+) for(x=0;x=148;x+); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - void delay()/消除按键抖动延时 int i,j; for(i=0; i=10; i+) for(j=0; j=2; j+) ; uchar Keyscan(void)
3、 uchar i,j, temp, Buffer4 = 0 xfe, 0 xfd, 0 xfb, 0 xf7; for(j=0; j4; j+) P1 = Bufferj; delay(); temp = 0 x10; for(i=0; i4; i+) if(!(P1 & temp) return (i+j*4); temp = 1; void Main(void) uchar Key_V alue; /读出的键值while(1) P1 = 0 xf0; if(P1 != 0 xf0) Delay_1ms(15); /按键消抖if(P1 != 0 xf0) Key_Value = Keysca
4、n(); P0 = tableKey_Value;/P0 口输出数据到 数码管 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - 代码分析:程序从 Main 开始执行, Key_Value 用来存放Keyscan();的返回值,Key_Value 为 1,则数码管会显示1。进入 while 循环: P1 = 0 xf0 ;if(P1 != 0 xf0) Delay_1ms(15); if(P1 != 0 xf0) Key_Valu
5、e = Keyscan(); P0 = tableKey_Value;/P0口输出数据到 数码管P1 的高四位为 1,低四位为 0,说明 P1 口高四位作输入,低四位作输出并且输出的值为 0。这时,可以把低四位看做是接地。如果没有按键按下时,由于P1口外接电阻和 VCC,高四位作输入,输入的值一直是1, if 条件不会成立,P1的值一直会是 0 xf0,Keyscan()函数一直不会被调用, 数码管不会显示任何值。下图是单片机的 P1 口外接电阻图:但当某一个按键按下时,不妨假设按键S1 按下,这时,由于低四位是0,当做接地,高四位作输入,由于S1 接通, P10和 P14接通,由于 P10为
6、地,必然导致 P14也为地, 从 P14读入的值必然为零,此时 P1=1110 0000 , 不再等于 11110000 ,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - 进入 IF。调用 Delay_1ms(15);延时一段时间,消除开关抖动,如果延时过后,开关仍是闭合的,P1 != 0 xf0 仍然成立,调用Keyscan()函数。uchar Keyscan(void) uchar i,j, temp, Buffer4 =
7、0 xfe, 0 xfd, 0 xfb, 0 xf7; for(j=0; j4; j+) P1 = Bufferj; delay(); temp = 0 x10; for(i=0; i4; i+) if(!(P1 & temp) return (i+j*4); temp = 1; Buffer4里面放的是: 1111 1110 , 1111 1101 ,1111 1011 ,1111 0111 进入第一个 FOR 循环,j=0,把 1111 1110 输出到 P1 口,此时,为了找到是哪个按键按下了,只留一位作输出,输出0 ,作为地。调用delay();延时,现在P1口的值为多少?此时,开关S
8、1 仍闭合,高四位值还为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 = table0= 0011 1111 。对应八段数码管的结构图知,显示0。DP 为最高位, G,F,E,D,C,B,A 为低位。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -