键盘程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0x21,0x22,0x24,0x28
wenku.baidu.com
0x41,0x42,0x44,0x48
0x81,0x82,0x84,0x88};
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uchar i)
if(P1 != P_scan[i])
//延时一段时间后,分析一下P1口是什么数据
{ for(j = 0;j<16;j++) //如果P1口上的数据与键盘临时数据相同,输出临
时键值
{
if(P1 == key_temp[j])
return(j);
}
}
eles
//如果没有按键按下,输出没有按键按下标志“88”
二、程序设计
#include<reg51.h>
#define uchar unsigned char
code uchar P_scan[] = {0x01,0x02,0x04,0x08};
//键盘行扫描临时数值
code uchar key_temp[] = {0x11,0x12,0x14,0x18 //键盘按下得到的临时数据
二、中断请求标志
1、TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。 当IT0=0时,为电平触发方式。 当IT0=1时,为边沿触发方式(下降沿有效)。 IE0(TCON.1),外部中断0中断请求标志位。 IT1(TCON.2),外部中断1触发方式控制位。 IE1(TCON.3),外部中断1中断请求标志位。 TF0(TCON.5),定时/计数器T0溢出中断请求标志位。 TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
{
while(i) i--;}
uchar key_temp(void)
//键盘扫描函数
{ uchar i,j;
for(i = 0; i < 4;i++)
//让键盘行线输出扫描数据
{
P1 = P_scan[i];
if(P1 != P_scan[i]) delay(200); //如果有按键按下,P1口不是扫描数据
return(88);
sbit key1 = P3.0;
sbit key2 = P3.1;
uchar key1_state,key2_state;
//按键按下的状态变量
void delay(uchar i)
{ while (i) i--; }
void key_scan (void)
//键盘扫描函数
{ if(key1 == 0)
3.3.3 利用延时程序防止键盘抖动, 实现键盘输入
按键按下产生的抖动现象持续的时间不会很久, 因此在按键按下后,可延时一段时间跳过抖动, 再对按键的状态检测,从而实现键盘输入。本案 例完成通过两个键盘设计,实现对数码管显示数 据的调整。
一、电路原理
在单片机最系统的基础上,KEY1、KEY2两个键 盘一端分别接P3.0、P3.1,另一端接地,见图3-32所示。数码管仍使用共阳型。在Proteuse软件中, 按键的英文名字为BUTTON,在Switches & Relasy 下的Switches里。
EA = 1;
//开启总中断开关
while(1);
//等待按键按下,中断发生
}
三、程序说明
这里没有设置INT0是下降沿触发中断或是低电平触发中断, 原因是按键按下,不管产生不产生键抖现象,总能使INT0 引脚产生1个下降沿和低电平。如果设置只有下降沿才触 发INT0中断,需要利用设置计时器控制寄存器TCON的 IT0 = 1位,按键按下是否产生中断,可以利用程序检测 TCON的IE0位。利用外部中断触发作为按键输入很好的解 决了键盘抖动问题。如果需要多个键盘,把INT0口与I/O 口之间用键盘连接,I/O输出低电平扫面信号即可。在数 码管动态显示电路中,为了节省硬件资源,可以在INT0口 和P2口之间接入键盘,实现8只按键输入。
//调用键盘扫描函数 //判断键盘状态变量,如1,说明有按键按下
//显示数据增加 //数据增加后,键盘状态变量清零
//数据增加超过9后,回到0
//显示键盘调整数据
三、程序说明
1.如果按键按下不放开,程序一直执行语句 while(key1 == 0),这时程序在此处死循环, 不能执行其它程序,所以本案例按键抬起后 数据才能得到调整。此种编程方法并不影响 单片机驱动1个数码管工作,但动态显示电路 在此种情况下不能正常工作。如果把while改 换成if,按键只要按下数据就能调整,但如 果按下不放开按键,数据自动快速增加或减 小。如果按键按下既不让程序死循环,也不 让由于按键按的时间过长而数据调整失控, 最可靠的办法是利用变量记忆按键按下和放 开的两种状态,根据判断实现键盘输入。程 序如下;
//如果按键按下
{ delay(200);
//延时一段时间,消除键抖
while(key1 == 0) key1_state = 1;
//再对按键检测,如果确实按
下,按键状态变量为1
}
if(key2 == 0)
{ delay(200);
while(key2 == 0)
key2_state = 1;
}
}
图3-3-3 利用外部中断INT0实现键盘输入电路
二、程序设计
#include<reg51.h>
sbit LED = P0^0;
void int0_isr(void) interrrupt 0 中断号为0
//INT0中断服务函数,INT0的
{ unsigned char i = 0;
i = ~i;
3.3.1 键盘抖动现象
按键按下都会发出一声响,谁然有的按键 声音很轻微,但这都是导体碰撞产生的震 动。这种现象称为键盘抖动。如果不对键 盘的抖动进行处理,按键会对系统电路或 程序产生意外的干扰。为了观察按键的抖 动现象,我们先做一个小实验,分析一下 一个微触按键产生抖动对系统的影响。
加数计数小系统
//INT0中断1次,i值改变1次
LED = i;
//INT0中断1次,LED工作状态变化1次
delay();
//调用延时函数
}
void main(void)
{ LED = 0;
//芯片初始化时,LED灭
EA = 0;
EX0 = 1;
//开启INT0中断
PX0 = 1;
//INT0中断优先,可以省去
图3.3.1
图3.3.2
在图3-3-1所示的一个加数计数小系统中,设 计数器的脉冲输入端CP为上升沿有效,加计 数器初始显示为0。按键不按时,CP = 0,计 数器不加1计数。一般认为:按键按下,CP
端由低电平变为高电平,含有电平上升沿,
计数器加1计数,并且按下1次,计数器加1。 实际实验时会发现,按键按下1次,计数器不 是加1,而是跳跃一次性增加3或4。原因是按 键按下在导体接触的瞬间产生了震动。图33-2是按键按下过程中CP端实际电平改变情况。 T1为不按按键时刻,T2为按键按下瞬间的抖 动,T3为按键按下稳定时刻,T4为按键放开 时刻瞬间,T5为按键放开时刻。
#include<reg51.h> #define timer0_count 0xee18 #define times 20 sbit key = P3^0; char key_count; static void timer0_isr(void) interrupt 1 { TR0 = 0;
TL0 = (timer0_count & 0x00ff); TH0 = (timer0_count >>8); TR0 = 1; if(key_count != 0) { key_count--;
void main(void) { char i;
while(1) {
key_scan(); if(key1_state = 1) { i++;
key1_state = 0; if(i>9) i = 0; } if(key2_state = 1) { i--; key2_state = 0; if(i < 0) i = 9; } P0 = seven_seg[i]; } }
if(key_count == 0 && key == 0); key_flog = 1; } eles if(key == 0)key_count = times; }
2.利用按键调整数据时,有时会调整过量, 需要进行判断重置。本案例i为char型变量,
数值在—128~127之间,语句if(i>9) i = 0是向 上增加过量复位。
{ keydownstate = 0;
//按键按下状态复位
keyupstate = 1;
//按键抬起状态变量为1
}
……
if(keyupstate == 1)
{ keyupstate = 0;
//按键按下抬起时,数据调整
i++;
}
我们也可以使用定时器中断对键盘扫描,实现键盘输入,下面时利用Timer0 中断实现的键盘输入,其中键盘key1接单片机I/O口P3.0,Timer0工作在 模式1。
从图中可以了解到,按键按下的瞬间由于震 动会是按键内部的导体稳定接触,而是在导 通和不导通之间来回弹跳,虽然时间一瞬间, 但使CP端获得了多个电平的上升沿。按键抖 动时间的长短由按键的机械特性决定,一般 为5ms~10ms。因此不能直接把按键作为1个 脉冲的输入。
在数字电路中,常利用触发器消除键盘抖动, 但在单片机系统中,按键可以直接接在单片 机的I/O口上,常利用键盘程序来消除键盘的 抖动现象。
3.3.2 利用外部中断INT0实现键盘输入
本案列利用外部中断INT0作为键盘输入端,当按 键按下时,让单片机执行外部中断服务程序,在 中断服务中完成键盘控制。
一、参考电路
在最小系统基础上,单片机的P0.0口接一只 LED,键盘接在P3.2端口,按键不按时,由于P3.2 接有上啦电阻R3,所以P3.2此时为高电平+5V, 如果按键按下,P3.2电源地短路,P3.2为低电平。 为了消除键盘抖动现象,键盘两端并联滤波电容 器C4。
键盘程序设计
按键是一种开关,通过外界作用力,导电金属或导 电非金属接触与分离实现电路通断的控制是按键的 基本机械原理,如计算机键盘、手机、MP3以及电 子表按键。按键是计算机系统输入设备,也是人机 信息交换的主要途径。 按键按下会产生抖动现象,不能安全有效的对系统 控制,本节根据按键产生的抖动机理,提出以中断、 延时等措施消除键盘输入过程中的不稳定因素,实 现单片机系统键盘的稳定输入。
uchar key1_down_state, key1_up_state,
//变量声明,初始值为0
……
if(key1== 0)
{delay(200)
if(key1== 0)keydownstate = 1; //如果按键按下,按下状态变量 为1
}
if(key1 == 1 && keydownstate = 1) //如果按键按下又放开
3.把键盘扫描key_scan()函数放在主函数的 while循环体中,程序执行时会断调用 key_scan(),如果没有按键按下,执行 key_scan()的时间很短,如果有按键按下, 用于按键扫面函数又调用了延时函数,程 序执行时间会变长。
3.3.4 4×4键盘程序设计
4×4键盘16键盘阵列,本案例采用P1口完成, 见图3-3-5所示,把P18条I/O口分成4条列线4条行 线交叉但不接触,16个按键放置交叉位置,在单 片机复杂系统需要较多按键时,这种接法可以节 省单片机的硬件资源。键盘和P1口之间采用总线 连接布局,在电路原理设计过程中,总线只是图 示引脚之间的相连接关系,但不具有电气连接特 性,相连引脚之间需要标注相同的网络标号采用 电气连接特性,如图3-3-5中,单片机的P1.0与键 盘阵列上的P1.0相连。在设计单片机系统或其它 电子系统时,由于器件引脚较多,器件与器件之 间会经常采用总线连接,并且把电路模块化设计。
图 3-3-4 利用延时函数消除键盘抖动实现键盘输入电路
二、程序设计
#include<reg51.h>
#define uchar unsigned char
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};