《课件键盘接口.pptx》由会员分享,可在线阅读,更多相关《课件键盘接口.pptx(66页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第十章 键盘接口知识目标:掌握独立式与行列式键盘的工作原是,理解键盘接口程序的编制方法;掌握按键抖动的原因及处理方法。技能目标:能设计两种键盘电路,会编写简单的独立式键盘程序。素质目标:养成扩展嵌入式系统芯片外围相关知识的习惯。第1页/共66页项目四项目四 数字万年历的设计数字万年历的设计要求:设计一单片机控制的数字万年历。它采用液晶显示,可以显示年、月、日、星期,小时、分钟、秒及当前的温度等信息。第2页/共66页1、项目介绍:、项目介绍:此项目涉及键盘、显示接口的问题,还要用到数字温度传感器DS18B20及时间芯片DS1302。所涉及的知识广泛,综合性也很强。只要认真、耐心地去边做边学,一定
2、会提高综合编程能力及调试能力,达到单片机助理工程师甚至是工程师的水平。第3页/共66页2、电路图、电路图如图13.22所示。实际连接中要将DS18B20的中间一个引脚通过4.7K的电阻上拉到电源正极。图 13.22 万年历总仿真电路图第4页/共66页3、元件清单、元件清单单片机-AT89S52LCD-SMC1602A LCM数字温度传感器-18B20(或1820)TO封装时间芯片-DS1302晶振-12MHZ、32.768KHZ电阻:10K、10K可调、10K排阻、4.7K各一个电容:10uF、30pF*2、电池:1.5V*2(或3V)可充电(带电池座)按键*5第5页/共66页项目四任务项目四
3、任务1万年历键盘的设计万年历键盘的设计要求设计4个输入键的键盘,它能调整日期、时间。任务分析:万年历中的时间或日期要经常进行效正,这里就牵涉到从外部输入到单片机信息的问题,即人要输入接口。第6页/共66页键盘基本问题键盘基本问题 键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等;而靠软件来识别的称为非编码键盘;非编码键盘有分为:独立式非编码键盘和行列式非编码键盘。在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘。第7页/共66页键的识别键的识别即如何识别键盘的问题。第8页/共66页 键盘由一
4、组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。单片机使用的按键是一种常开型的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。按 键第9页/共66页按键在闭合和断开时,触点会存在抖动现象:键的抖动键的抖动图 10.1 键盘抖动示意图第10页/共66页抖动时间一般为510ms。抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。抖动的去除可以采用硬件的办法,也可以软件的办法。硬件去抖动的方法这里不予介绍,可参考数字电路相关的书籍。软件去抖动的方法其实就是利用延时来去掉这一抖动时间,在具体程序设计中再讨论 第11页/
5、共66页独立式键盘独立式键盘 图 10.2 独立键盘电路图第12页/共66页独立式按键是指各按键相互独立地接通一条输入数据线。当任何一个键按下时,与之相连的输入数据线即可读入数据0,而没有按下时读入1。图 10.2 独立键盘电路图独立式键盘的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题。第13页/共66页设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图如图10.2所示,键号从上到下分别为07。第14页/共66页C语言程序清单:语言程序清单:#includevoid key()unsigned char k;P0=0 xff;/输入时P0口置全1k
6、=P0;/读取按键状态if(k=0 xff)/无键按下,返回return;delay20ms();/有键按下,延时去抖k=P0;if(k=0 xff)/确认键按下return;/抖动引起,返回while(P0!=0 xff);/等待键释放 第15页/共66页switch(k)case:0 xfe/0号键按下时执行程序段break;case:0 xfd/1号键按下时执行程序段break;/26号键程序省略case:0 x7f/7号键按下时执行程序段break;第16页/共66页行列式键盘为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。每一水平线(行线
7、)与垂直线(列线)的交叉处通过一个按键来连通。将IO口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。利用这种结构只需N条行线和M条列线,即可组成具有NM个按键的键盘。键值:按键闭合时的数值,键模:按键代表的数值。特点:占用IO口线较少,但软件将较为复杂。第17页/共66页第18页/共66页矩阵式键盘按键的识别:行扫描法及线反转法工作原理1.扫描法2.线反转法第19页/共66页图 10.3 矩阵键盘电路图第20页/共66页一、扫描法一、扫描法判别键盘中有无键按下。向行线输出全0,读入列线状态。如果有键按下,总有一列线被拉至低电平,从而使列输入不全为1。查找按下键所在位置。依次
8、给行线送低电平,查列线状态。全为1,则所按下的键不在此行;否则所按下的键必在此行且是在与零电平列线相交的交点上的那个键。图 10.3 矩阵键盘电路图对按键位置进行编码。找到所按下按键的行列位置后,对按键进行编码,即求得按键键值。第21页/共66页二、线反转法二、线反转法1、判断哪一列有键压下写端口(0 xf0):行线电平=0;列线电平=1。读端口进行判断:若P3=0 xf0没有按键压下;若P30 xf0某列有键压下K1第22页/共66页2、判断哪一行有键压下写端口(0 x0f):行线电平=1;列线电平=0。读端口进行判断:若P3=0 x0f没有按键压下;若P3 0 x0f某行有键压下K2 3、
9、将K1与K2相“或”并存于K2(形成键值)闭合键所在行、列的状态均为0,其余皆为1。第23页/共66页第一行的键值:11101110、11011110、10111110、01111110整个键盘的键值(对应为0-F):0 xee,0 xde,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77第24页/共66页4、利用查表比对法求出闭合按键的键模。、利用查表比对法求出闭合按键的键模。将各键的键值依次存放在一个数组中,其顺序号就是键模。char key_buf=0 xee,0 xde
10、,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;利用循环变量i控制比对过程,两者相等时的i就是闭合键的键模。第25页/共66页 0123 ee debe7e 4567 edddbd7d 89AB ebdbbb7b CDEF e7d7b777第26页/共66页行列式键盘扫描流程及程序要求:44行列式键盘按下任意按键后,LED显示器上显示该键的键模(0F)。图10.4 44行列式键盘仿真电路第27页/共66页仿真电路图仿真电路图图10.4 44行列式键盘仿真电路第28页/共66
11、页程序流程图程序流程图 图 10.5 行列式键盘程序流程图第29页/共66页线反转法线反转法#includechar led_mod=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;/共阴段码表char key_buf=0 xee,0 xde,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;/键盘编码表第30页/共66页char ge
12、tKey(void);void delay(unsigned int time)unsigned int j=0;for(;time0;time-)for(j=0;j125;j+);第31页/共66页void main(void)char key=0;P2=0 x00;while(1)key=getKey();/获取键盘键值 if(key!=-1)/如果有键按下 第32页/共66页P2=led_modkey;/在P2口显示相应的键值(0-F)delay(10);else P2=0 x00;/如果没有键按下,则不显示。第33页/共66页char getKey(void)char k1=0,k2=
13、0,i=0;P1=0 xf0;/输出行扫描码delay(10);if(P1!=0 xf0)/如果有键按下 k1=P1;/读取列键值 delay(10);if(P1=k1)/如果值不变 P1=0 x0f;/输出列扫描码 delay(10);第34页/共66页k2=P1;/读取行键值k2=k2|k1;/合成行列键值 for(i=0;i16;i+)if(key_bufi=k2)return i;/查表,得到键值,并返回键值(0-F)return-1;/如果没有键按下,则返回-1第35页/共66页扫描法扫描法第36页/共66页/P1口接4*4键盘作为输入,P2口输出。按下0号键数码管显示0,按下1号键
14、数码管显示1,以此类推。第37页/共66页#include#include#define uchar unsigned char#define uint unsigned intuchar code num=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,0 x00;void delays(void);uchar kbscan(void);第38页/共66页void main()uchar key,temp;while(1)key=kbscan();s
15、witch(key)case 0 x11:temp=0;break;第39页/共66页case 0 x21:temp=1;break;case 0 x41:temp=2;break;case 0 x81:temp=3;break;case 0 x12:temp=4;break;case 0 x22:temp=5;break;case 0 x42:temp=6;break;case 0 x82:temp=7;break;case 0 x14:temp=8;break;case 0 x24:temp=9;break;case 0 x44:temp=10;break;case 0 x84:temp=
16、11;break;case 0 x18:temp=12;break;case 0 x28:temp=13;break;case 0 x48:temp=14;break;case 0 x88:temp=15;break;default:temp=16;break;第40页/共66页P2=numtemp;delays();/键消抖的延时函数void delays(void)uchar i;for(i=255;i0;i-);第41页/共66页/键扫描函数uchar kbscan(void)uchar scancode,recode;P1=0 xf0;if(P1&0 xf0)!=0 xf0)delay
17、s();if(P1&0 xf0)!=0 xf0)scancode=0 xfe;/逐行扫描的初值第42页/共66页while(scancode&0 x10)!=0)P1=scancode;/输出扫描码 if(P1&0 xf0)!=0 xf0)/本行有键按下 recode=(P1&0 xf0)|0 x0f;return(scancode)+(recode);/返回特征字节码 else scancode=(scancode1)|0 x01;return(0);/无键按下,返回值为0第43页/共66页项目训练4(作业):在P3口增加几个按键,使之可以调整班级、学号。第44页/共66页万年历中键盘的设计
18、 第45页/共66页键盘功能及在主程序中的作用键盘功能及在主程序中的作用 万年历中要调整的量是日期与时间,这里采用了4个按键,其功能分别是调整选择(即在年、月、日、星期、小时、分钟、钞中的选择一项调整)、增加、减少、确认(即确信调整完毕,保存调整的结果并退出调整功能)。第46页/共66页在所有程序之前对四个按键的定义是:sbit Set=P20;/模式切换键sbit Up=P21;/加法按钮sbit Down=P22;/减法按钮sbit out=P23;/立刻跳出调整模式按钮第47页/共66页键盘功能及在主程序中的作用键盘功能及在主程序中的作用 sbit Set=P20;/模式切换键sbit
19、Up=P21;/加法按钮sbit Down=P22;/减法按钮sbit out=P23;/立刻跳出调整模式按钮第48页/共66页#include#include/#include LCD1602.h/#include DS1302.h#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK=P17;/实时时钟时钟线引脚 sbit DS1302_IO =P16;/实时时钟数据线引脚 sbit DS1302_RST=P15;/实时时钟复位线引脚sbit wireless_1=P30;sbit wireless_2=P31
20、;sbit wireless_3=P32;sbit wireless_4=P33;sbit ACC0=ACC0;sbit ACC7=ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;/秒,分,时到日,月,年位闪的计数sbit Set=P20;/模式切换键sbit Up=P21;/加法按钮sbit Down=P22;/减法按钮sbit out=P23;/立刻跳出调整模式按钮sbit DQ=P10;/温度传送数据IO口char done,count,temp,flag,up_flag,down
21、_flag;/uchar temp_value;/温度值uchar TempBuffer5,week_value2;/第49页/共66页万年历主程序流程图第50页/共66页main()flag=1;/时钟停止标志LCD_Initial();/液晶初始化Init_DS18B20();/DS18B20初始化Initial_DS1302();/时钟芯片初始化up_flag=0;down_flag=0;done=0;/进入默认液晶显示第51页/共66页while(1)while(done=1)keydone();/进入调整模式while(done=0)show_time();/液晶显示数据 flag=
22、0;Setkey();/扫描各功能键 第52页/共66页键盘扫描程序键盘扫描程序 void Setkey()/模式选择按键Set=1;if(Set=0)/如果有键按下 mdelay(8);/延时,去抖动。count=count+1;/Setkey按一次,count就加1 done=1;/置进入调整模式标志。while(Set=0);/等待按键释放。第53页/共66页void keydone()/按键功能执行 uchar Second;if(flag=0)/关闭时钟,停止计时 Write1302(0 x8e,0 x00);/写入允许 temp=Read1302(0 x80);Write1302(
23、0 x80,temp|0 x80);Write1302(0 x8e,0 x80);/禁止写入 flag=1;Setkey();/扫描模式切换按键 switch(count)第54页/共66页三个子函数三个子函数 outkey();/扫描跳出按钮Upkey();/扫描加按钮Downkey();/扫描减按钮第55页/共66页1、outkey();void outkey()/跳出调整模式,返回默认显示 uchar Second;if(out=0)/调整确认键按下 mdelay(8);/延时去抖动count=0;/调整项目回到初始值。第56页/共66页/下面一段程序主要是与时间芯片相关,暂不讨论。hi
24、de_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(0 x8e,0 x00);/写入允许Write1302(0 x80,Second&0 x7f);Write1302(0 x8E,0 x80);/禁止写入done=0;/置调整结束标志while(out=0);/等待跳出键松开 第57页/共66页2、Upkey();/扫描加按钮void Upkey()/升序按键 Up=1;/置升序结束标志if(Up=0)/如
25、果升序按键按下,则UP0.mdelay(8);/延时去抖动switch(count)/根据要调整的项目不同,决定升序键按下后的具体调整内容。第58页/共66页case 1:/调整秒 temp=Read1302(DS1302_SECOND);/读取秒数 temp=temp+1;/秒数加1 up_flag=1;/数据调整后更新标志if(temp&0 x7f)0 x59)/超过59秒,清零 temp=0;break;第59页/共66页case 2:/调整分钟 temp=Read1302(DS1302_MINUTE);/读取分数 temp=temp+1;/分数加1 up_flag=1;/数据调整后更新
26、标志 if(temp0 x59)/超过59分,清零 temp=0;break;case 3:/调整小时 temp=Read1302(DS1302_HOUR);/读取小时数 temp=temp+1;/小时数加1 up_flag=1;/数据调整后更新标志 if(temp0 x23)/超过23小时,清零 temp=0;break;第60页/共66页 case 4:/调整星期 temp=Read1302(DS1302_WEEK);/读取星期数 temp=temp+1;/星期数加1 up_flag=1;if(temp0 x7)temp=1;break;case 5:/调整日 temp=Read1302(
27、DS1302_DAY);/读取日数 temp=temp+1;/日数加1 up_flag=1;if(temp0 x31)temp=1;break;第61页/共66页case 6:/调整月 temp=Read1302(DS1302_MONTH);/读取月数 temp=temp+1;/月数加1 up_flag=1;if(temp0 x12)temp=1;break;case 7:/调整年 temp=Read1302(DS1302_YEAR);/读取年数 temp=temp+1;/年数加1 up_flag=1;if(temp0 x85)temp=0;break;第62页/共66页default:break;while(Up=0);/while(wireless_2=1);第63页/共66页void Downkey()/降序按键 Down=1;if(Down=0)/if(Down=0|wireless_3=1)mdelay(8);switch(count)第64页/共66页由上可见,键盘程序特别是较大项目的键盘程序都比较复杂,原因是键盘控制的调整项目往往与各功能模块都相关,要根据各功能模块的需要来编制键盘程序。只有全面地知道各功能模块所要调整的参数及要求,才能编写对应的键盘控制程序。第65页/共66页感谢您的观看!第66页/共66页
限制150内