C51单片机05(键盘).ppt

上传人:夺命阿水 文档编号:236189 上传时间:2023-03-10 格式:PPT 页数:23 大小:631.50KB
返回 下载 相关 举报
C51单片机05(键盘).ppt_第1页
第1页 / 共23页
C51单片机05(键盘).ppt_第2页
第2页 / 共23页
C51单片机05(键盘).ppt_第3页
第3页 / 共23页
C51单片机05(键盘).ppt_第4页
第4页 / 共23页
C51单片机05(键盘).ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《C51单片机05(键盘).ppt》由会员分享,可在线阅读,更多相关《C51单片机05(键盘).ppt(23页珍藏版)》请在课桌文档上搜索。

1、第5讲 单片机键盘,独立按键,独立按键触发的中断,#includevoid main()TCON=0 x00;/设置外部中断为电平触发方式EA=1;/中断总控开放EX0=1;/外部中断INT0开放EX1=1;/外部中断INT1开放P0=0 x00;/数码管不显示任何内容while(1);/等待中断发生void keypress0()interrupt 0/外部中断INT0服务程序P0=0 x3f;/数码管0显示数字0P2=0 x00;void keypress1()interrupt 2/外部中断INT1服务程序P0=0 x06;/数码管1显示数字1P2=0 x01;,练习,用查询方式检测独立

2、按键S19是否按下,若第一次按下,LED0发光;第二次按下,LED0熄灭,循环往复。,程序代码,#include#define uchar unsigned char#define uint unsigned intsbit KEY1=P32;/独立按键S19连接的端口sbit LED0=P00;/独立发光二极管连接端口void Delay(uint milisec)/延时10msuint i,j;for(i=0;imilisec;i+)for(j=0;j1827;j+);,程序代码,void KEY()if(KEY1=0)/如果检测到有键按下Delay(2);/20毫秒软件防抖if(KEY1

3、=0)/再次确认是否有键按下 LED0=LED0;/LED显示取反Delay(50);/延时0.5秒再进行下次按键的检测void Main(void)while(1)KEY();/查询方式持续检测是否有键按下,练习,用查询方式检测独立按键S19按下的次数,并在数码管LED7上显示,最大计数值为9,超过9则从0开始重新计数。,#include#define uchar unsigned char#define uint unsigned intuchar code table16=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6

4、f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;sbit KEY1=P32;/独立按键S19连接的端口uint k=0;void Delay(uint milisec)/延时10msuint i,j;for(i=0;imilisec;i+)for(j=0;j1827;j+);,void Main(void)uint k=0;P2=0 x07;while(1)if(KEY1=0)/如果检测到有键按下 Delay(2);/20毫秒软件防抖 if(KEY1=0)/再次确认是否有键按下 k+;/计数 if(k9)k=0;P0=tablek;/获取LED段位码 Delay(5

5、0);/延时500ms再进行下次按键的检测,练习,按下独立键S19,使独立发光二极管LED8发光1秒,然后自行熄灭(利用定时器实现准确定时),练习,连续多次按下独立键S19,使独立发光二极管LED0LED8依次轮流发光,到头以后能自行返回开始,循环执行,4*4 键盘阵列,若无键按下,读回的低4位为全“1”,0,1,1,1,练习,用查询方式扫描4*4键盘阵列,在最右侧数码管LED(LED7)上显示用户按键的位置(0F),分析是否有键按下,先向P0口输出0 xf0(高四位列选为全1,低四位行选为全0),然后读回由于P0口输出有锁存,若无键按下,从P0口读回应该仍为0 xf0,低四位行选保持全0若读

6、回值不为0 xf0,即低四位行选不为全0,说明有键按下,1,1,1,1,0,0,0,0,1,分析是哪个键按下,双重循环先选定一列,再逐行扫描,获得键位置码将键位置码送到LED7显示,第0次扫描,P1输出0 xef(11101111),0,1,1,1,1,1,1,1,第0次读回P1,P1&00000001,结果不为0第1次读回P1,P1&00000010,结果不为0第2次读回P1,P1&00000100,结果不为0第3次读回P1,P1&00001000,结果不为0,说明按下的键不在P14对应的列,第1次扫描,P1输出0 xdf(11011111),1,0,1,1,1,1,1,1,第0次读回P1,

7、P1&00000001,结果不为0第1次读回P1,P1&00000010,结果不为0第2次读回P1,P1&00000100,结果不为0第3次读回P1,P1&00001000,结果不为0,说明按下的键不在P15对应的列,第2次扫描,P1输出0 xbf(10111111),1,1,0,1,1,1,1,1,第0次读回P1,P1&00000001,结果不为0第1次读回P1,P1&00000010,结果为0找到了按键所在的列(2)与行(1),说明按下的键在P16对应的列,0,程序代码,#include#include#define uint unsigned int#define uchar unsig

8、ned charuchar 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,0 x79,0 x71;void Delay_1ms(uint i)/1ms延时uchar x,j;for(j=0;ji;j+)for(x=0;x=148;x+);void delay()/一个很短的延时int i,j;for(i=0;i=20;i+);,键盘扫描的关键代码,uchar Keyscan(void)/返回一个0F的键位置码uchar i,j,temp;uchar

9、 Buffer4=0 xef,0 xdf,0 xbf,0 x7f;for(j=0;j4;j+)/从第0列开始,逐列扫描P1=Bufferj;/向P1口输出列扫描码(高4位含有一个0)delay();/短暂延时,等待 P1 口的状态稳定temp=0 x01;/从第0行开始,逐行扫描 for(i=0;i4;i+)if(!(P1/左移一位,扫描下一行,主程序,void Main(void)uchar Key_Value;/读出的键值while(1)P1=0 xf0;/检测是否有键按下if(P1!=0 xf0)/若有键按下 Delay_1ms(15);/等待15ms,按键消抖 if(P1!=0 xf0)/确实有键按下 Key_Value=Keyscan();/获得键位置码 P0=tableKey_Value;/获取段位码P2=0 x07;/在LED7显示键盘输入的值,练习,在4*4 键盘阵列中逐次按键,在数码管LED中按右对齐方式显示按下的键(最多8次),Thank you,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号