《(52)--5章用并行口设计键盘电路(5).ppt》由会员分享,可在线阅读,更多相关《(52)--5章用并行口设计键盘电路(5).ppt(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章 输出、输入接口(5 5)并口键盘电路5.3.25.3.2用并行口设计键盘电路用并行口设计键盘电路 每个按键的状态需变成数每个按键的状态需变成数字量字量“0 0”和和“1 1”,这可用一个,这可用一个开关实现开关实现。行值的确定可采用行行值的确定可采用行扫描法。扫描法。0000 键盘处理程序的任务是:键盘处理程序的任务是:l 确定有无键按下;确定有无键按下;l 判哪一个键按下,判哪一个键按下,l 键的功能是什么;键的功能是什么;l 还要消除按键在闭合或断开时的抖动。还要消除按键在闭合或断开时的抖动。每个按键的编码每个按键的编码(即即“列列 行行”值值):EEDEBE7EEDDDBD7DE
2、BDBBB7BE7D7B777 01110111Y返回键编码返回键编码读读P1.4P1.7值值置行扫描初值置行扫描初值扫描位从扫描位从P1口输出口输出P1口高四位、低四位口高四位、低四位相或得键编码相或得键编码扫到最后一行扫到最后一行?NN(有键按下)有键按下)N开始开始P1.0P1.3输出输出0延时去抖动延时去抖动P1.4P1.7全为全为1?P1.4P1.7全为全为1?YY(无键按下无键按下)该行有键按下该行有键按下?形成下行扫描码形成下行扫描码NYC C语言程序如下:语言程序如下:语言程序如下:语言程序如下:#include#include#define unsigned char uch
3、ar#define unsigned char ucharvoid delay();void delay();/声明延时程序声明延时程序声明延时程序声明延时程序uchar KeyMonitor();uchar KeyMonitor();/声明键盘监测程序声明键盘监测程序声明键盘监测程序声明键盘监测程序uchar KeyCoding();uchar KeyCoding();/声明按键编码程序声明按键编码程序声明按键编码程序声明按键编码程序main()main()uchar Keycode=0;uchar Keycode=0;while(1)while(1)if(KeyMonitor()!=0)i
4、f(KeyMonitor()!=0)/监测到按键监测到按键监测到按键监测到按键Keycode=KeyCoding();Keycode=KeyCoding();/按键编码按键编码按键编码按键编码delay();delay();/下次监测前延时下次监测前延时下次监测前延时下次监测前延时 void delay()void delay()/延时程序延时程序延时程序延时程序 uchar i;uchar i;for(i=200;i0;i-);for(i=200;i0;i-);uchar KeyMonitor()uchar KeyMonitor()/键盘监测程序键盘监测程序键盘监测程序键盘监测程序 P1=0
5、 xF0;P1=0 xF0;/低低低低4 4位输出位输出位输出位输出0 0,高,高,高,高4 4位输出位输出位输出位输出1 1,以便检测,以便检测,以便检测,以便检测if(P1&0 xF0)!=0 xF0)if(P1&0 xF0)!=0 xF0)/P1/P1高高高高4 4位不全为位不全为位不全为位不全为1 1,有键按下,有键按下,有键按下,有键按下 delay();delay();/延时去抖延时去抖延时去抖延时去抖 P1=0 xF0;P1=0 xF0;if(P1&0 xF0)!=0 xF0)if(P1&0 xF0)!=0 xF0)/确认有键按下确认有键按下确认有键按下确认有键按下 return
6、(1);return(1);/返回返回返回返回1 1 else return(0);else return(0);/无键按下,返回无键按下,返回无键按下,返回无键按下,返回0 0 uchar KeyCoding()uchar KeyCoding()/按键编码程序按键编码程序按键编码程序按键编码程序 uchar rowcode,scancode;uchar rowcode,scancode;scancode=0 xFE;scancode=0 xFE;/置行扫描初值置行扫描初值置行扫描初值置行扫描初值P1=scancode;P1=scancode;/输出行扫描值输出行扫描值输出行扫描值输出行扫描值
7、while(P1!=0 xEF)while(P1!=0 xEF)/循环,直至最后一行扫描完毕循环,直至最后一行扫描完毕循环,直至最后一行扫描完毕循环,直至最后一行扫描完毕 P1=scancode;P1=scancode;if(P1&0 xF0)!=0 xF0)if(P1&0 xF0)!=0 xF0)/当前行有键按下当前行有键按下当前行有键按下当前行有键按下 rowcode=P1&0 xF0;rowcode=P1&0 xF0;/暂存按键列码暂存按键列码暂存按键列码暂存按键列码 scancode=scancode&0 x0F;scancode=scancode&0 x0F;/暂存按键行码暂存按键行码暂存按键行码暂存按键行码 return(scancode|rowcode);return(scancode|rowcode);/返回按键编码返回按键编码返回按键编码返回按键编码 else else scancode=(scancode1)|0 x01;scancode=(scancode1)|0 x01;/当前行无键按下当前行无键按下当前行无键按下当前行无键按下 /形成下行扫描码形成下行扫描码形成下行扫描码形成下行扫描码return(0return(0););/所有行均未检测到按键,返回所有行均未检测到按键,返回所有行均未检测到按键,返回所有行均未检测到按键,返回0 0 THE END!
限制150内