4 按键扫描

Download Report

Transcript 4 按键扫描

实训四
按键
1
按键的去抖动
2
独立按键
3
矩阵键盘扫描原理
4
发挥要求
1
淮南联合大学
方向红
1、键盘的分类
键盘分编码键盘和非编码键盘。键盘上闭合键的
识别由专用的硬件编码器实现,并产生键编码号或
键值的称为编码键盘,如计算机键盘.
而靠软件编程来识别的称为非编码键盘;
在单片机组成的各种系统中,用的最多的是非编码键
盘。也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵
式)键盘。
淮南联合大学
方向红
按键在闭合和断开时,触点会存在抖动现象:
+5V
无抖动
理想波形
A
B
实际波形
按下抖动
稳定闭合
释放抖动
+5V
有抖动
淮南联合大学
方向红
一、独立按键
用四个独立按键控制数码管显示
要求:一次只有一个按键按下,如果没有按键按下,
显示“P”,如果按下某一按键,显示按键的序号。
淮南联合大学
方向红
淮南联合大学
方向红
#include<reg51.h>
#define unit unsigned int
#define uchar unsigned char
sbit K1=P1^4;
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66, 0x73};
bit keyscan(bit x);
void delayms(uchar y);
淮南联合大学
方向红
void main(void)
{while(1)
{if(keyscan(K1)==1)
P2=table[1];
else if(keyscan(K2)==1)
P2=table[2];
else if(keyscan(K3)==1)
P2=table[3];
else if(keyscan(K4)==1)
P2=table[4];
else P2=table[5];}}
淮南联合大学
方向红
bit keyscan(bit x)
{bit flag=0;
if(x==0)
{delayms(10);
if(x==0)
flag=1;}
return flag;}
void delayms(uchar y)
{uchar i,j;
for(i=y;i>0;i--)
for(j=0;j<130;j++);}
淮南联合大学
方向红
二、矩阵键盘
判按下哪个键
先让c0列为低电平,
其余列线为高电平,
读行线状态,如行线
状态不全为“1”,则
说明所按键在该列;
否则所按键不在该列,
再使c1列线为低电平,
其它列为高电平,判
断c1列有无按键按下。
如此进行。
1、列扫描法
算出键值
9
淮南联合大学
方向红
例题:识别4*4矩阵键盘,并利用数码管显示按下的
键值。(注意:一次只能按下一个键,无键按下
时,数码管显示“P”)
淮南联合大学
方向红
程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x73};
uchar key;
void keyscan();
void delayms(uchar );
淮南联合大学
方向红
void main() // 主函数
{ while(1)
{ keyscan();
P1=table[key];}}
void delayms(uchar ms) //延时子程序
{uchar i,j;
for(i=ms;i>0;i--)
for(j=0;j<130;j++); }
void keyscan() //键盘扫描函数
{uchar temp,i,j,m;/* m为列号
uchar code scanw[]={0xef,0xdf,0xbf,0x7f};
淮南联合大学
方向红
bit flag=0;/*flag是有键按下的标志*/
P2=0xff; /*为P2口作输入口,做准备*/
for(i=0;i<4;i++) //列扫描码
{ P2=scanw[i];
temp=~P2&0x0f;
if(temp!=0)
{delayms(10);
temp=~P2&0x0f;
if(temp!=0)
{flag=1;
m=i;
淮南联合大学
方向红
switch(temp) //算出键值
{case 0x01: j=0;break;
case 0x02: j=1;break;
case 0x04: j=2;break;
case 0x08: j=3;break; }
}}}
if(flag==0) key=16;
else key=m+j*4; }
淮南联合大学
方向红
2、线反转法
(1)扫描原理
先设行线全部为0,
读列线的值
再设列线全部为零,
读行线的值
二者相加,得到的值,
与各键值有一一对应
的关系
淮南联合大学
方向红
表
键号与键值的对应关系
EEH DEH
BEH 7EH
EDH DDH BDH 7DH
EBH DBH
BBH 7BH
E7H D7H
B7H 77H
淮南联合大学
方向红
例题:识别4*4矩阵键盘,并利用数码管显示按下的
键值。(注意:一次只能按下一个键,无键按下
时,数码管显示“P”)
淮南联合大学
方向红
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define unit unsigned int
uchar key;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x73};
void delayms(unit ms) //延时子程序
{uchar i,j;
for(i=ms;i>0;i--)
for(j=0;j<130;j++); }
淮南联合大学
方向红
void keyscan() //键盘扫描程序
{uchar t1,t2,num;
bit flag=0;
P2=0xff;
P2=0xf0;/*行线为0,列线为1*/
if(P2!=0xf0)
{delayms(10);
if(P2!=0xf0)
{flag=1;
t1=P2&0xf0;}}
淮南联合大学
方向红
P2=0x0f; /*列线为0,行线为1*/
if(P2!=0x0f)
{delayms(10);
if(P2!=0x0f)
{flag=1;
t2=P2&0x0f;}}
if(flag==0)
key=16;
else
{num=t1|t2;
switch(num)
{case 0xee:key=0;break;
case 0xde:key=1;break;
淮南联合大学
方向红
case
case
case
case
case
case
case
case
case
case
case
case
0xbe:key=2;break;
0x7e:key=3;break;
0xed:key=4;break;
0xdd:key=5;break;
0xbd:key=6;break;
0x7d:key=7;break;
0xeb:key=8;break;
0xdb:key=9;break;
0xbb:key=10;break;
0x7b:key=11;break;
0xe7:key=12;break;
0xd7:key=13;break;
淮南联合大学
方向红
case 0xb7:key=14;break;
case 0x77:key=15;break;}} }
void main() //主函数
{while(1)
{ keyscan();
P1=table[key];}}
淮南联合大学
方向红
键盘扫描与中断
单片机工作时并不是经常需要键盘输入,为
提高单片机的工作效率,可采用中断扫描方式。
即无键按下时,CPU进行正常工作,当有键按下
时,产生中断申请,CPU转去执行键盘扫描函数,
并识别键值。
淮南联合大学
方向红
+5V
INT0
&
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
淮南联合大学
方向红
发挥部分:
用三个独立按键接在P2.0、P2.1和P2.2上,P1控
制八个发光二极管,要求:按键没按下时,八个发
光二极管间隔点亮并闪烁,按下按键1时,左移跑
马灯;按下按键2时,流水灯;按下按键3时,右移
跑马灯。
淮南联合大学
方向红