课件第10章-键盘接口PPT文档格式.ppt
《课件第10章-键盘接口PPT文档格式.ppt》由会员分享,可在线阅读,更多相关《课件第10章-键盘接口PPT文档格式.ppt(66页珍藏版)》请在冰豆网上搜索。
10uF、30pF*2、电池:
1.5V*2(或3V)可充电(带电池座)按键*5项目四任务项目四任务项目四任务项目四任务11万年历键盘的设计万年历键盘的设计万年历键盘的设计万年历键盘的设计要求设计4个输入键的键盘,它能调整日期、时间。
任务分析:
万年历中的时间或日期要经常进行效正,这里就牵涉到从外部输入到单片机信息的问题,即人要输入接口。
键盘基本问题键盘基本问题键盘基本问题键盘基本问题键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等;
而靠软件来识别的称为非编码键盘;
非编码键盘有分为:
独立式非编码键盘和行列式非编码键盘。
在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘。
键的识别键的识别键的识别键的识别即如何识别键盘的问题。
键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。
单片机使用的按键是一种常开型的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。
按键按键在闭合和断开时,触点会存在抖动现象:
按键在闭合和断开时,触点会存在抖动现象:
键的抖动键的抖动键的抖动键的抖动图10.1键盘抖动示意图抖动时间一般为510ms。
抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。
抖动的去除可以采用硬件的办法,也可以软件的办法。
硬件去抖动的方法这里不予介绍,可参考数字电路相关的书籍。
软件去抖动的方法其实就是利用延时来去掉这一抖动时间,在具体程序设计中再讨论独立式键盘独立式键盘独立式键盘独立式键盘图10.2独立键盘电路图独立式按键是指各按键相互独立地接通一条输入数据线。
当任何一个键按下时,与之相连的输入数据线即可读入数据0,而没有按下时读入1。
图10.2独立键盘电路图独立式键盘的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题。
设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图如图10.2所示,键号从上到下分别为07。
CC语言程序清单:
语言程序清单:
#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某列有键压下K12、判断哪一行有键压下写端口(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,0x7744、利用查表比对法求出闭合按键的、利用查表比对法求出闭合按键的、利用查表比对法求出闭合按键的、利用查表比对法求出闭合按键的键模。
键模。
将各键的键值依次存放在一个数组中,其顺序号就是键模。
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;
case0x41:
temp=2;
case0x81:
temp=3;
case0x12:
temp=4;
case0x22:
temp=5;
case0x42:
temp=6;
case0x82:
temp=7;
case0x14:
temp=8;
case0x24:
temp=9;
case0x44:
temp=10;
case0x84:
temp=11;
case0x18:
temp=12;
case0x28:
temp=13;
case0x48:
temp=14;
case0x88:
temp=15;
default:
temp=16;
P2=numtemp;
delays();
/键消抖的延时函数键消抖的延时函数voiddelays(void)uchari;
for(i=255;
i0;
i-);
/键扫描函数键扫描函数ucharkbscan(void)ucharscancode,recode;
if(P1&
0xf0)!
=0xf0)delays();
=0xf0)scancode=0xfe;
/逐行扫描的初值逐行扫描的初值while(scancode&
0x10)!
=0)P1=scancode;
/输出扫描码输出扫描码if(P1&
=0xf0)/本行有键按下本行有键按下recode=(P1&
0xf0)|0x0f;
return(scancode)+(recode);
/返回特征字节码返回特征字节码elses