课件第10章-键盘接口.ppt
- 文档编号:18783984
- 上传时间:2023-11-12
- 格式:PPT
- 页数:66
- 大小:3.96MB
课件第10章-键盘接口.ppt
《课件第10章-键盘接口.ppt》由会员分享,可在线阅读,更多相关《课件第10章-键盘接口.ppt(66页珍藏版)》请在冰点文库上搜索。
键盘接口,第十章键盘接口,知识目标:
掌握独立式与行列式键盘的工作原是,理解键盘接口程序的编制方法;掌握按键抖动的原因及处理方法。
技能目标:
能设计两种键盘电路,会编写简单的独立式键盘程序。
素质目标:
养成扩展嵌入式系统芯片外围相关知识的习惯。
项目四数字万年历的设计,要求:
设计一单片机控制的数字万年历。
它采用液晶显示,可以显示年、月、日、星期,小时、分钟、秒及当前的温度等信息。
1、项目介绍:
此项目涉及键盘、显示接口的问题,还要用到数字温度传感器DS18B20及时间芯片DS1302。
所涉及的知识广泛,综合性也很强。
只要认真、耐心地去边做边学,一定会提高综合编程能力及调试能力,达到单片机助理工程师甚至是工程师的水平。
2、电路图,如图13.22所示。
实际连接中要将DS18B20的中间一个引脚通过4.7K的电阻上拉到电源正极。
图13.22万年历总仿真电路图,3、元件清单,单片机-AT89S52LCD-SMC1602ALCM数字温度传感器-18B20(或1820)TO封装时间芯片-DS1302晶振-12MHZ、32.768KHZ电阻:
10K、10K可调、10K排阻、4.7K各一个电容:
10uF、30pF*2、电池:
1.5V*2(或3V)可充电(带电池座)按键*5,项目四任务1万年历键盘的设计,要求设计4个输入键的键盘,它能调整日期、时间。
任务分析:
万年历中的时间或日期要经常进行效正,这里就牵涉到从外部输入到单片机信息的问题,即人要输入接口。
键盘基本问题,键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等;而靠软件来识别的称为非编码键盘;非编码键盘有分为:
独立式非编码键盘和行列式非编码键盘。
在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘。
键的识别,即如何识别键盘的问题。
键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。
单片机使用的按键是一种常开型的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。
按键,按键在闭合和断开时,触点会存在抖动现象:
键的抖动,图10.1键盘抖动示意图,抖动时间一般为510ms。
抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。
抖动的去除可以采用硬件的办法,也可以软件的办法。
硬件去抖动的方法这里不予介绍,可参考数字电路相关的书籍。
软件去抖动的方法其实就是利用延时来去掉这一抖动时间,在具体程序设计中再讨论,独立式键盘,图10.2独立键盘电路图,独立式按键是指各按键相互独立地接通一条输入数据线。
当任何一个键按下时,与之相连的输入数据线即可读入数据0,而没有按下时读入1。
图10.2独立键盘电路图独立式键盘的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题。
设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图如图10.2所示,键号从上到下分别为07。
C语言程序清单:
#includevoidkey()unsignedchark;P0=0xff;/输入时P0口置全1k=P0;/读取按键状态if(k=0xff)/无键按下,返回return;delay20ms();/有键按下,延时去抖k=P0;if(k=0xff)/确认键按下return;/抖动引起,返回while(P0!
=0xff);/等待键释放,switch(k)case:
0xfe/0号键按下时执行程序段break;case:
0xfd/1号键按下时执行程序段break;/26号键程序省略case:
0x7f/7号键按下时执行程序段break;,行列式键盘,为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。
每一水平线(行线)与垂直线(列线)的交叉处通过一个按键来连通。
将IO口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。
利用这种结构只需N条行线和M条列线,即可组成具有NM个按键的键盘。
键值:
按键闭合时的数值,键模:
按键代表的数值。
特点:
占用IO口线较少,但软件将较为复杂。
矩阵式键盘按键的识别:
行扫描法及线反转法工作原理,1.扫描法2.线反转法,图10.3矩阵键盘电路图,一、扫描法,判别键盘中有无键按下。
向行线输出全0,读入列线状态。
如果有键按下,总有一列线被拉至低电平,从而使列输入不全为1。
查找按下键所在位置。
依次给行线送低电平,查列线状态。
全为1,则所按下的键不在此行;否则所按下的键必在此行且是在与零电平列线相交的交点上的那个键。
图10.3矩阵键盘电路图对按键位置进行编码。
找到所按下按键的行列位置后,对按键进行编码,即求得按键键值。
二、线反转法,1、判断哪一列有键压下写端口(0xf0):
行线电平=0;列线电平=1。
读端口进行判断:
若P3=0xf0没有按键压下;若P30xf0某列有键压下K1,2、判断哪一行有键压下写端口(0x0f):
行线电平=1;列线电平=0。
读端口进行判断:
若P3=0x0f没有按键压下;若P30x0f某行有键压下K23、将K1与K2相“或”并存于K2(形成键值)闭合键所在行、列的状态均为0,其余皆为1。
第一行的键值:
11101110、11011110、10111110、01111110整个键盘的键值(对应为0-F):
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77,4、利用查表比对法求出闭合按键的键模。
将各键的键值依次存放在一个数组中,其顺序号就是键模。
charkey_buf=0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77;利用循环变量i控制比对过程,两者相等时的i就是闭合键的键模。
0123eedebe7e4567edddbd7d89ABebdbbb7bCDEFe7d7b777,行列式键盘扫描流程及程序,要求:
44行列式键盘按下任意按键后,LED显示器上显示该键的键模(0F)。
图10.444行列式键盘仿真电路,仿真电路图,图10.444行列式键盘仿真电路,程序流程图,图10.5行列式键盘程序流程图,线反转法,#includecharled_mod=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/共阴段码表charkey_buf=0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77;/键盘编码表,chargetKey(void);voiddelay(unsignedinttime)unsignedintj=0;for(;time0;time-)for(j=0;j125;j+);,voidmain(void)charkey=0;P2=0x00;while
(1)key=getKey();/获取键盘键值if(key!
=-1)/如果有键按下,P2=led_modkey;/在P2口显示相应的键值(0-F)delay(10);elseP2=0x00;/如果没有键按下,则不显示。
chargetKey(void)chark1=0,k2=0,i=0;P1=0xf0;/输出行扫描码delay(10);if(P1!
=0xf0)/如果有键按下k1=P1;/读取列键值delay(10);if(P1=k1)/如果值不变P1=0x0f;/输出列扫描码delay(10);,k2=P1;/读取行键值k2=k2|k1;/合成行列键值for(i=0;i16;i+)if(key_bufi=k2)returni;/查表,得到键值,并返回键值(0-F)return-1;/如果没有键按下,则返回-1,扫描法,/P1口接4*4键盘作为输入,P2口输出。
按下0号键数码管显示0,按下1号键数码管显示1,以此类推。
#include#include#defineucharunsignedchar#defineuintunsignedintucharcodenum=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;voiddelays(void);ucharkbscan(void);,voidmain()ucharkey,temp;while
(1)key=kbscan();switch(key)case0x11:
temp=0;break;,case0x21:
temp=1;break;case0x41:
temp=2;break;case0x81:
temp=3;break;case0x12:
temp=4;break;case0x22:
temp=5;break;case0x42:
temp=6;break;case0x82:
temp=7;break;case0x14:
temp=8;break;case0x24:
temp=9;break;case0x44:
temp=10;break;case0x84:
temp=11;break;case0x18:
temp=12;break;case0x28:
temp=13;break;case0x48:
temp=14;break;case0x88:
temp=15;break;default:
temp=16;break;,P2=numtemp;delays();/键消抖的延时函数voiddelays(void)uchari;for(i=255;i0;i-);,/键扫描函数ucharkbscan(void)ucharscancode,recode;P1=0xf0;if(P1/逐行扫描的初值,while(scancode/无键按下,返回值为0,项目训练4(作业):
在P3口增加几个按键,使之可以调整班级、学号。
万年历中键盘的设计,键盘功能及在主程序中的作用,万年历中要调整的量是日期与时间,这里采用了4个按键,其功能分别是调整选择(即在年、月、日、星期、小时、分钟、钞中的选择一项调整)、增加、减少、确认(即确信调整完毕,保存调整的结果并退出调整功能)。
在所有程序之前对四个按键的定义是:
sbitSet=P20;/模式切换键sbitUp=P21;/加法按钮sbitDown=P22;/减法按钮sbitout=P23;/立刻跳出调整模式按钮,键盘功能及在主程序中的作用,sbitSet=P20;/模式切换键sbitUp=P21;/加法按钮sbitDown=P22;/减法按钮sbitout=P23;/立刻跳出调整模式按钮,#include#include/#includeLCD1602.h/#includeDS1302.h#defineuintunsignedint#defineucharunsignedcharsbitDS1302_CLK=P17;/实时时钟时钟线引脚sbitDS1302_IO=P16;/实时时钟数据线引脚sbitDS1302_RST=P15;/实时时钟复位线引脚sbitwireless_1=P30;sbitwireless_2=P31;sbitwireless_3=P32;sbitwireless_4=P33;sbitACC0=ACC0;sbitACC7=ACC7;charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;/秒,分,时到日,月,年位闪的计数sbitSet=P20;/模式切换键sbitUp=P21;/加法按钮sbitDown=P22;/减法按钮sbitout=P23;/立刻跳出调整模式按钮sbitDQ=P10;/温度传送数据IO口chardone,count,temp,flag,up_flag,down_flag;/uchartemp_value;/温度值ucharTempBuffer5,week_value2;/,万年历主程序流程图,main()flag=1;/时钟停止标志LCD_Initial();/液晶初始化Init_DS18B20();/DS18B20初始化Initial_DS1302();/时钟芯片初始化up_flag=0;down_flag=0;done=0;/进入默认液晶显示,while
(1)while(done=1)keydone();/进入调整模式while(done=0)show_time();/液晶显示数据flag=0;Setkey();/扫描各功能键,键盘扫描程序,voidSetkey()/模式选择按键Set=1;if(Set=0)/如果有键按下mdelay(8);/延时,去抖动。
count=count+1;/Setkey按一次,count就加1done=1;/置进入调整模式标志。
while(Set=0);/等待按键释放。
voidkeydone()/按键功能执行ucharSecond;if(flag=0)/关闭时钟,停止计时Write1302(0x8e,0x00);/写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80);/禁止写入flag=1;Setkey();/扫描模式切换按键switch(count),三个子函数,outkey();/扫描跳出按钮Upkey();/扫描加按钮Downkey();/扫描减按钮,1、outkey();,voidoutkey()/跳出调整模式,返回默认显示ucharSecond;if(out=0)/调整确认键按下mdelay(8);/延时去抖动count=0;/调整项目回到初始值。
/下面一段程序主要是与时间芯片相关,暂不讨论。
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00);/写入允许Write1302(0x80,Second/等待跳出键松开,2、Upkey();,/扫描加按钮voidUpkey()/升序按键Up=1;/置升序结束标志if(Up=0)/如果升序按键按下,则UP0.mdelay(8);/延时去抖动switch(count)/根据要调整的项目不同,决定升序键按下后的具体调整内容。
case1:
/调整秒temp=Read1302(DS1302_SECOND);/读取秒数temp=temp+1;/秒数加1up_flag=1;/数据调整后更新标志if(temp,case2:
/调整分钟temp=Read1302(DS1302_MINUTE);/读取分数temp=temp+1;/分数加1up_flag=1;/数据调整后更新标志if(temp0x59)/超过59分,清零temp=0;break;case3:
/调整小时temp=Read1302(DS1302_HOUR);/读取小时数temp=temp+1;/小时数加1up_flag=1;/数据调整后更新标志if(temp0x23)/超过23小时,清零temp=0;break;,case4:
/调整星期temp=Read1302(DS1302_WEEK);/读取星期数temp=temp+1;/星期数加1up_flag=1;if(temp0x7)temp=1;break;case5:
/调整日temp=Read1302(DS1302_DAY);/读取日数temp=temp+1;/日数加1up_flag=1;if(temp0x31)temp=1;break;,case6:
/调整月temp=Read1302(DS1302_MONTH);/读取月数temp=temp+1;/月数加1up_flag=1;if(temp0x12)temp=1;break;case7:
/调整年temp=Read1302(DS1302_YEAR);/读取年数temp=temp+1;/年数加1up_flag=1;if(temp0x85)temp=0;break;,default:
break;while(Up=0);/while(wireless_2=1);,voidDownkey()/降序按键Down=1;if(Down=0)/if(Down=0|wireless_3=1)mdelay(8);switch(count),由上可见,键盘程序特别是较大项目的键盘程序都比较复杂,原因是键盘控制的调整项目往往与各功能模块都相关,要根据各功能模块的需要来编制键盘程序。
只有全面地知道各功能模块所要调整的参数及要求,才能编写对应的键盘控制程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课件 10 键盘 接口
![提示](https://static.bingdoc.com/images/bang_tan.gif)