单片机原理与应用(C51编程+Proteus仿真) 课件 4单片机输入检测_第1页
单片机原理与应用(C51编程+Proteus仿真) 课件 4单片机输入检测_第2页
单片机原理与应用(C51编程+Proteus仿真) 课件 4单片机输入检测_第3页
单片机原理与应用(C51编程+Proteus仿真) 课件 4单片机输入检测_第4页
单片机原理与应用(C51编程+Proteus仿真) 课件 4单片机输入检测_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机输入检测04重点介绍键盘的工作原理、接口设计与软件编程以及物理量转换为开关量的信号检测。04单片机输入检测123独立按键检测矩阵键盘检测开关量信号检测4.1独立按键检测

编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生

键编码号或键值的称为编码键盘,如计算机键盘。非编码键盘:靠软件编程来识别的称为非编码键盘;在单片机系统中,用的最多的是非编码键盘。键盘具有向单片机输入数据、命令等功能,是人与单片机对话的主要手段。

图1弹性按键一、独立键盘非编码键盘分成独立键盘和矩阵(行列式)键盘4.1独立按键检测一、独立键盘弹起高电平按下低电平1按键检测原理按键在闭合和断开时,有10ms抖动期如何去抖?4.1独立按键检测2软件按键去抖动

voidkeyscan(){key=1;//输入先写“1”

if(key==0)

{delay(10);//延时去抖

if(key==0)//按键按下

{while(!key);//松手检测

程序段;

}}}

核心指令

4.1独立按键检测一、独立键盘#include<reg52.h>sbitkey1=P2^0;sbitled1=P1^7;voidmain(){while(1){

key1=1;if(key1==0){led1=0;}else{led1=1;}}}

【例】P2.0引脚接按键,P1.7引脚接LED,按下按键LED点亮。4.1独立按键检测一、独立键盘

【例】P2.0引脚接按键,P1.7引脚接LED,按下按键LED点亮。(标志位)#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitkey=P2^0;//按键声明sbitled=P1^7;//LED声明ucharkeyflag=0;//按键标志位voiddelay(uinti);//延时voidkeyscan();//按键检测函数voidmain(){while(1){

keyscan();

if(keyflag==1)

{

led=0;}

}}voidkeyscan()//按键检测函数{key=1;//输入先写“1”

if(key==0){delay(10);//延时去抖

if(key==0)//按键按下

{

while(!key);//松手检测

keyflag=1;//设标志位

}}}

【例】设计4个按键,分别控制4个LED,按下一个按键,只亮一个LED。voidkeyscan()//按键检测函数{

KEY1=1;//输入先写“1”

if(KEY1==0){delay(10);//延时去抖

if(KEY1==0)//按键按下

{

while(!KEY1);//松手检测

keyflag=1;//设标志位

}

}

KEY2=1;//输入先写“1”

if(KEY2==0){delay(10);//延时去抖

if(KEY2==0)//按键按下

{

while(!KEY2);//松手检测

keyflag=2;//设标志位

}}}KEY1按下:P1=11111110B=0xfe;KEY2按下:P1=1111110 1B=0xfd;KEY3按下:P1=1111101 1B=0xfb;KEY4按下:P1=1111011 1B=0xf7;

【例】设计4个按键,分别控制4个LED,按下一个按键,只亮一个LED。voidkeyscan()//按键检测函数{KEY1=1;//输入先写“1”

if(KEY1==0){delay(10);//延时去抖

if(KEY1==0)//按键按下

{

while(!KEY1);//松手检测

keyflag=1;//设标志位

}}

KEY2=1;//输入先写“1”

if(KEY2==0){delay(10);//延时去抖

if(KEY2==0)//按键按下

{

while(!KEY2);//松手检测

keyflag=2;//设标志位

}…………}}voidkeyscan()//按键检测函数{P2=0xff;//输入先写“1”

if((P2&0x0f)!=0x0f)//检测有按键按下{

delay(10);//延时去抖

if(KEY1==0)//KEY1按键按下{keyflag=1;//设标志位1

while(!KEY1);}//松手检测

if(KEY2==0)//

KEY2按键按下{keyflag=2;//设标志位2

while(!KEY2);}//松手检测

if(KEY3==0)//

KEY3按键按下{keyflag=3;//设标志位3

while(!KEY3);}//松手检测

if(KEY4==0)//

KEY4按键按下{keyflag=4;//设标志位4

while(!KEY4);}//松手检测

}}优化代码

【例】设计4个按键,分别控制4个LED,按下一个按键,只亮一个LED。#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitKEY1=P2^0;//按键声明sbitKEY2=P2^1;//按键声明sbitKEY3=P2^2;//按键声明sbitKEY4=P2^3;//按键声明ucharkeyflag=0;//按键标志位voiddelay(uinti);//延时voidkeyscan();//按键检测函数voidmain(){while(1){keyscan();

switch(keyflag)

{case1:P1=0xfe;break;

case2:P1=0xfd;break;case3:P1=0xfb;break;

case4:P1=0xf7;break;

}

}}KEY1按下:P1=11111110B=0xfe;KEY2按下:P1=1111110 1B=0xfd;KEY3按下:P1=1111101 1B=0xfb;KEY4按下:P1=1111011 1B=0xf7;【C语言知识点】位运算【例】编程将P1.5清

0,P1.1置1,其他位保持不变,采用字节操作。P1=(P1&0xdf)│0x02;4.1独立按键检测二、四路抢答器仿真实例任务要求:设计四路抢答器,由主持人控制抢答轮次,主持人按下复位按钮,抢答开始,无人抢答时数码管显示8,一旦抢答,选手按下按键显示相应选手编号,其他选手再按按键无效。主持人按下复位按钮重新开始抢答。硬件电路设计1数码管段码端:P2口按键:1号选手P1.02号选手P1.13号选手P1.24号选手P1.34.1独立按键检测二、四路抢答器仿真实例软件设计2①主持人按下复位按钮重新开始抢答:由硬件复位按键实现②无人抢答,即没有按键按下,标志位keyflag=8,显示“8”的段码0x80③选手按下按键检测:四个按键标志位keyflag分别设为1、2、3、4。④显示选手编号:keyflag的值即为选手编号,

显示其段码0xf9,0xa4,0xb0,0x99P2=seg[keyflag]⑤其他选手再按按键无效:选手按下按键后进入while(1)死循环“0~9”段码(共阳):ucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};任务要求:设计四路抢答器,由主持人控制抢答轮次,①主持人按下复位按钮,抢答开始;②无人抢答时数码管显示8;③一旦抢答,选手按下按键

④显示相应选手编号,⑤其他选手再按按键无效。主持人按下复位按钮重新开始抢答。二、四路抢答器仿真实例软件设计2#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineoutP2 //数码管段码端sbitkey1=P1^0; //1号选手sbitkey2=P1^1; //2号选手sbitkey3=P1^2; //3号选手sbitkey4=P1^3; //4号选手ucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳ucharkeyflag=8;//初值为8无按键按下voiddelay(uinti);voidkeyscan();voidmain(){while(1)

{

keyscan();

if(keyflag==1)

{ out=seg[keyflag];//按下key1,显示1

while(1); } elseif(keyflag==2) { out=seg[keyflag]; //按下key2,显示2 while(1);}elseif(keyflag==3)

{

out=seg[keyflag]; //按下key1,显示3 while(1); } elseif(keyflag==4) { out=seg[keyflag]; //按下key2,显示4 while(1);} elseif(keyflag==8)

out=seg[keyflag];

}}//没有按键,显示8

二、四路抢答器仿真实例软件设计2voidkeyscan()//按键检测函数优化{P1=0xff;//输入先写“1”if((P1&0x0f)!=0x0f)//检测有按键按下

{delay(10);//延时去抖

if(KEY1==0)//1号选手按键按下

keyflag=1;//设标志位1if(KEY2==0)//2号选手按键按下

keyflag=2;//设标志位2if(KEY3==0)//3号选手按键按下

keyflag=3;//设标志位3if(KEY4==0)//4号选手按键按下

keyflag=4;//设标志位4}}voiddelay(uinti) //延时函数

{ uchart;while(i--){

for(t=0;t<120;t++);

}} 二、四路抢答器仿真实例仿真运行3仿真时,复位电路中的下拉电阻阻值使用2K电阻,太大不好使。!04单片机输入检测123独立按键检测矩阵键盘检测开关量信号检测4.2矩阵键盘检测一、矩阵键盘的检测原理矩阵键盘的接口电路矩阵键盘检测的关键环节:(1)判别是否有键按下。(2)确定键值:识别哪个键被按下,并求出相应的键值。(3)根据键值,找到相应键值的处理程序入口。4.2矩阵键盘检测一、矩阵键盘的检测原理列线状态(列线输入)扫描线(行线输出)编码键值说明P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0

111

111100xfe

无键按下111

01

1100xee00号键按下110

11

1100xde11号键按下101111100xbe22号键按下011

111100x7e33号键按下011111110111扫描法行线输出扫描码无键按下,列线为1有键按下,列线电平将由与

此列线相连的行线电平决定。4.2矩阵键盘检测编码键值说明

0xfe

无键按下0xee00号键按下0xde11号键按下0xbe22号键按下0x7e33号键按下011111110111P1=0xfe;//选中按键第一行temp=P1; //把P1给中间变量temp=temp&0xf0;//低四位清零while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){

temp=P1;switch(temp) { case0xee:key=0;break; case0xde:key=1;break;

case0xbe:key=2;break; case0x7e:key=3;break; }

while(temp!=0xf0) { temp=P1; temp=temp&0xf0;

}}}

4.2矩阵键盘检测编码键值说明

0xfd

无键按下0xed44号键按下0xdd55号键按下0xbd66号键按下0x7d77号键按下101111110111P1=0xfd;//选中按键第二行temp=P1; //把P1给中间变量temp=temp&0xf0;//低四位清零while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){

temp=P1;switch(temp) { case0xed:key=4;break; case0xdd:key=5;break;

case0xbd:key=6;break; case0x7d:key=7;break; }

while(temp!=0xf0) { temp=P1; temp=temp&0xf0;

}}}

4.2矩阵键盘检测编码键值说明

0xfb

无键按下0xeb88号键按下0xdb99号键按下0xbb10A号键按下0x7b11B号键按下110111110111P1=0xfb;//选中按键第三行temp=P1; //把P1给中间变量temp=temp&0xf0;//低四位清零while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){

temp=P1;switch(temp) { case0xeb:key=8;break; case0xdb:key=9;break;

case0xbb:key=10;break; case0x7b:key=11;break; }

while(temp!=0xf0) { temp=P1; temp=temp&0xf0;

}}}

4.2矩阵键盘检测编码键值说明

0xf7

无键按下0xe712C号键按下0xd713D号键按下0xb714E号键按下0x7715F号键按下111011110111P1=0xf7;//选中按键第四行temp=P1; //把P1给中间变量temp=temp&0xf0;//低四位清零while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){

temp=P1;switch(temp) { case0xe7:key=12;break; case0xd7:key=13;break;

case0xb7:key=14;break; case0x77:key=15;break; }

while(temp!=0xf0) { temp=P1; temp=temp&0xf0;

}}}

4.2矩阵键盘检测扫描每一行的四段程序封装为函数keyscan(),变量key存放键值。!voidkeyscan(){

P1=0xfe;//选中按键第一行temp=P1; //把P1给中间变量……P1=0xfd;//选中按键第二行temp=P1; //把P1给中间变量……P1=0xfb;//选中按键第三行temp=P1; //把P1给中间变量……P1=0xf7;//选中按键第四行temp=P1; //把P1给中间变量……}4.2矩阵键盘检测(代码优化)keyvalue[]={0xee,0xde,0xbe,0x7e,

0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};//键值key_scan[]={0xfe,0xfd,0xfb,0xf7}//扫描码P1=0xfe;//选中按键第一行temp=P1; //把P1给中间变量temp=temp&0xf0;//低四位清零while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){

temp=P1;

switch(temp) { case0xee:key=0;break; case0xde:key=1;break;

case0xbe:key=2;break; case0x7e:key=3;break; }

while(temp!=0xf0) { temp=P1; temp=temp&0xf0;

}}}

voidkeyscan(){

ucharkey_scan[]={0xfe,0xfd,0xfb,0xf7};//扫描码

uchari=0,j=0,temp;for(i=0;i<4;i++)

{

P1=key_scan[i];//输出扫描码

temp=P1;//把P1给中间变量

for(j=0;j<16;j++)

{

if(keyvalue[j]==temp)//判断键值

{

key=j;//显示闭合键键号

break;

}}}}4.2矩阵键盘检测二、矩阵键盘仿真实例任务要求:使用数码管来显示4×4矩阵键盘中按下键的键号0~F。例如,1号键按下时,数码管显示“1”;E键按下时,数码管显示“E”等等。硬件电路设计1矩阵键盘:行线扫描:P1.0~P1.3列线读入:P1.4~P1.7数码管段码端:P2口4.2矩阵键盘检测二、矩阵键盘仿真实例任务要求:使用数码管来显示4×4矩阵键盘中按下键的键号0~F。例如,1号键按下时,数码管显示“1”;E键按下时,数码管显示“E”等等。硬件电路设计1矩阵键盘:行线扫描:P1.0~P1.3列线读入:P1.4~P1.7数码管段码端:P2口4.2矩阵键盘检测任务要求:使用数码管(共阳)显示4×4矩阵键盘中按下键的键号0~F。例如:1号键按下时,数码管显示“1”;E键按下时,数码管显示“E”等等。软件设计2#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳0-f段码ucharcodekeyvalue[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//键值ucharkey=100;//键号标志位voidkeyscan();//矩阵键盘扫描/******主函数******/voidmain(){

while(1){

keyscan();//扫描键盘

if(key>=0&&key<=15)

P2=seg[key];//显示

}}4.2矩阵键盘检测任务要求:使用数码管(共阳)显示4×4矩阵键盘中按下键的键号0~F。例如:1号键按下时,数码管显示“1”;E键按下时,数码管显示“E”等等。软件设计2voidkeyscan(){

ucharkey_scan[]={0xfe,0xfd,0xfb,0xf7};//扫描码

uchari=0,j=0,temp;for(i=0;i<4;i++)

{

P1=key_scan[i];//输出扫描码

temp=P1;//把P1给中间变量

for(j=0;j<16;j++)

{

if(keyvalue[j]==temp)//判断键值

{

key=j;//显示闭合键键号

break

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论