版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章键盘输入键盘:单片机系统中完成控制参数输入及修改的基本输入设备,是人工干预系统的重要手段。键盘的分类:
独立连接式键盘矩阵连接式键盘键盘结构⑴独立式按键
独立式按键是每个按键占用一根I/O端线。键盘结构⑵行列式(矩阵式)键盘
I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。9.1.2键盘结构及处理程序
行列式键盘
为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,常将键盘排列成行列矩阵形式。在水平线(行线)与垂直线(列线)的交叉处放置按键来连通。N条行线和M条列线,可组成N×M个按键的键盘89C52P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7+5v01234567BAD98CEF10kΩ×4矩阵式键盘接口设计矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。可以节省I/O口。行线通过上拉电阻接到+5V上,并将行线所接的单片机I/O口作为输入端,而列线所接的I/O作为输出端。使用键盘时必须解决的问题
键盘去抖动问题:
键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。键盘接口键扫描输入程序的设计方法:
(1)判断键盘上是否有键闭合;(2)消除键的机械抖动;(3)确定闭合键的物理位置;(4)得到闭合键的编号;(5)确保CPU对键的一次闭合只做一次处理独立式按键应用1要求使用变量类型sbit定义每个开关和二极管。#include<reg51.h>sbitled0=P1^0;sbitled1=P1^1;sbitled2=P1^2;sbitled3=P1^3;sbitkey0=P1^4;sbitkey1=P1^5;sbitkey2=P1^6;sbitkey3=P1^7;voidmain(){while(1){led0=key0;led1=key1;led2=key2;led3=key3;}}实例2键控流水灯【要求】K1为“启动键”,首次按压K1可产生“自下向上”的流水灯运动;K2为“停止键”,按压K2可终止流水灯的运动;
K3和K4为“方向键”,分别产生“自上向下”和“自下向上”运动。(键值函数)思路分析:根据键值修改标志位,根据标志位控制灯状态键值:按压K1——1110xxxxB按压K2——1101xxxxB按压K3——1011xxxxB按压K4——0111xxxxB无按键——1111xxxxB按键动作判断——(P0&0xf0)是否等于0xf0?若是,说明无按键动作,反之则有按键动作→0xe0→0xd0→0xb0→0x70→0xf0判键流程亮灯P1输出:11111110111111011111101111110111LED循环流程charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓for(i=3;i>=0;i--){P2=led[i];}//↑#include"reg51.h"charled[]={0xfe,0xfd,0xfb,0xf7};voiddelay(unsignedinttime){unsignedintj=0;for(;time>0;time--) for(j=0;j<125;j++);}charkey(){unsignedcharx; x=P1&0xf0;returnx;}voidmain(){bitdir=0,run=0;chari;while(1){switch(key()){ case0xe0:run=1;break; case0xd0:run=0;break; case0xb0:dir=1;break; case0x70:dir=0;break;} if(run) {if(dir) //自上而下流动
for(i=0;i<=3;i++){P1=led[i];delay(200); } else //自下而上流动
for(i=4;i>=1;i--){P1=led[i-1];delay(200);}} elseP1=0xff;//灯全灭
}}独立式键盘接口扫描方式独立式按键独立式键盘接口
各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可很容易判断那个键被按下。此种接口适于键数较少或操作速度较高的场合。下页图(a)为中断方式的独立式键盘工作电路。下页图(b)为查询方式的独立式键盘工作电路。下图为8255A扩展I/O口的独立式按键接口电路。下图用三态缓冲器扩展的I/O口的按键接口电路。
例:仿真电路如下图,软件消抖,查询方式检测键的状态。每按下一次按键,会使计数标志加1,以二进制形式会使计数标志加1,以二进制形式送入P1口点亮二极管。独立式键盘仿真电路#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#definep3P3intxx=0; //设计数标志sbitkey=P1^7; //设键盘voiddelay(intk) //延时函数{inti;for(i=0;i<k;i++);}voidmain(){P3=0x3F;while(1){while(key==1) //键盘没有按下,循环等待
{;}if(key==0) //有键盘按下,延时10ms去抖动
delay(10);
*23
if(key==0) { xx=xx+1; //计数标志加1 switch(xx) { case0:P3=0x3F;break; case1:P3=0x06;break; case2:P3=0x5B;break; case3:P3=0x4F;break; case4:P3=0x66;break; case5:P3=0x6D;break; case6:P3=0x7D;break; case7:P3=0x07;break; case8:P3=0x7F;break; case9:P3=0x6F;break; case10:P3=0x77;break; case11:P3=0x7C;break; case12:P3=0x39;break; case13:P3=0x5E;break; case14:P3=0x79;break; default:P3=0x71;xx=0;break; } }
while(key==0) //键盘是否松开
{;} }}
例8-3
设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图略,键号从上到下分别为0~7。
C语言程序清单:#include<reg52.h>voidkey(){ unsignedchark; P1=0xff; //输入前P1口输出全1 k=P1; //读取按键状态
if(k==0xff) return; //无键按下,返回
delay10xms(2); //有键按下,延时去抖键盘防抖动 k=P1; if(k==0xff) //确认键按下
return; //抖动引起,返回
while(P1!=0xff); //等待键释放
switch(k) //识别、执行按下的键
{ case0xfe:
… //0号键按下时执行程序段
break; case0xfd:
… //1号键按下时执行程序段
break;
…
…
case0x7f:
… //7号键按下时执行程序段
break;} }矩阵式键盘接口—行反转法00001011矩阵式键盘接口—行反转法10110000读P1:若P1低4位为f或(P1&0x0f)=0x0f→无键压下若P1低4位≠f或(P1&0x0f)≠0x0f→有键压下
其中0#:11101110B——0xee1#:
11011110B——0xde……F#:
01110111B——0x77ucharcodeKEY_TABLE[]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};//键盘表矩阵式键盘接口—行动态扫描方法00001111矩阵式键盘接口—行动态扫描方法00001011矩阵式键盘接口—行动态扫描方法01111111矩阵式键盘接口—行动态扫描方法10111011键号=行号*每行键数+列号例4矩阵式键盘举例#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharucharcodeKEY_TABLE[]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};//键盘表ucharcodeTABLE[]={0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, x7F,0x6F,0x77,0x7c, 0x39,0x5e,0x79,0x71};//共阴数码管编码表voiddelayl()//长延时,作点亮数码管用{uintn=50000;while(n--);}voiddelays()//短延时,作消振用{uintn=10000;while(n--);}main(){uchartemp,key,num,i;while(1){P3=0xf0;//置行为0,列为1,读列值。
if(P3!=0xf0)//判断有,无键盘按下
{delays();//消振
if(P3!=0xf0)//确定有键盘按下
{temp=P3;//存储列读入的值
P3=0x0f;//置列为0,行为1,读行值。
key=temp|P3;//将行/列值综合,赋给key。
for(i=0;i<16;i++) {if(key==KEY_TABLE[i]) {num=i;break;}} P2=TABLE[num];//显示按键值。
delayl();}}}}键盘的工作方式⑴程序控制扫描方式键处理程序固定在主程序的某个程序段。⑵定时控制扫描方式利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。⑶中断方式当键盘上有键闭合时,向CPU申请中断,CPU响应中断后对键盘进行扫描。
单片机在忙于各项工作任务时,如何兼顾键盘的输入,取决于键盘的工作方式。【例8.5】按照图示的电路,使用行反转扫描法,编写的键扫描程序。有键按下,扫描函数返回值为键值,若无键按下,返回值为0xff。要求每10ms定时检测一次按键,使用定时器中断实现定时。按键信息由printf输出到串口。#include“REG51.h"#defineKEY_PORTP1/*按键接在KEY_PORT口*/ucharkey_Value=0xff; /*存放键值*/ucharkeyscan(void);//扫描按键函数-行反转法**/voidKey_process(void);/*键值处理程序*/voidtimer1int(void)interrupt3{ EA=0;/*关总中断*/ TR1=0;/*停止计数*/ TH1=-10000>>8;TL1=-10000%256;/*12MHz晶振,定时时间10000us*/ TR1=1;/*启动计数*/ key_Value=keyscan(); EA=1;/*开总中断*/}ucharkeyscan(void)/**扫描按键函数**/{ucharreadkey,rereadkey,x_temp,y_temp; KEY_PORT=0x0f; x_temp=KEY_PORT&0x0f; if(x_temp==0x0f)return(0xff);/*无按键,退出*/ KEY_PORT=0xf0; y_temp=KEY_PORT&0xf0; readkey=x_temp|y_temp; time(10); /*延时10ms后再测按键*/ KEY_PORT=0x0f; x_temp=KEY_PORT&0x0f; if(x_temp==0x0f)return(0xff);/*无按键,退出*/ KEY_PORT=0xf0; y_temp=KEY_PORT&0xf0; rereadkey=x_temp+y_temp; if(readkey==rereadkey){return(~rereadkey); } return(0xff);}voidmain(void){ initUart();/*初始化串口*/ TMOD=0x10;/*设置定时器1为工作方式1*/ TH1=-10000>>8;TL1=-10000%256//定时时间10ms TCON=0x40;/*内部脉冲计数*/ IE=0x88;/*打开定时器中断*/ key_Value=0xff; do{ if(key_Value!=0xff){/*如果有按键*/ Key_process();/*键值处理程序*/ key_Value=0xff;/*重置键值*/ } /*可在此处插入其它任务处理函数*/}while(TRUE);}
键盘所做的工作分为三个层次,如图所示。第1层:单片机监视键盘输入的工作方式:①编程扫描②定时扫描③中断扫描。第2层:确定具体按键的键号。体现在按键的识别方法上就是:①扫描法;②线反转法。第3层:执行键处理程序。例:仿真电路如下图所示,P2口低四位接行列式键盘的行,高四位接行列式键盘的列,P3口接一只共阴极数码管,数码管的公共端接地,试编程将按下的建号在数码管上显示出来。
解:
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};ucharPre_KeyNO=16,KeyNO=16;
voidDelayMS(uintms){ uchart; while(ms--) { for(t=0;t<120;t++); }}
voidKeys_Scan(){ ucharTmp; P1=0x0f; DelayMS(1); Tmp=P1^0x0f; switch(Tmp) { case1:KeyNO=0;break; case2:KeyNO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 43758.2-2024智能网联汽车运行安全测试环境技术条件第2部分:半开放道路
- 人教版八年级物理上册《第二章声现象》章末测试卷含答案
- 酶解法促进海产品副产物资源化
- 高一化学成长训练:第三单元人工合成有机化合物
- 2024届四川省高考化学四模试卷含解析
- 2024高中地理第二章自然环境中的物质运动和能量交换1地壳的物质组成和物质循环课时作业含解析湘教版必修1
- 2024高考地理一轮复习第五单元地表形态的塑造练习含解析
- 2025高考数学考点剖析精创专题卷三-三角函数与解三角形【含答案】
- 起重机委托使用协议书范本
- 2024年温州科技职业学院高职单招语文历年参考题库含答案解析
- 危重症护理组组长竞聘
- 航空工程材料(第3版)课件 6有色金属
- 印刷厂厂长年终小结
- MOOC 工程图学-天津大学 中国大学慕课答案
- 园林景观工程关键施工技术、措施
- 谈谈微电影创作课件
- 《变革管理》课件
- 各元素离子半径
- 小学五年级数学上册寒假作业天天练30套试题(可打印)
- 地下管道三维轨迹惯性定位测量技术规程
- 特种设备锅炉日管控、周排查、月调度主要项目及内容表
评论
0/150
提交评论