独立键盘工作原理
编程思路:
将独立按键连接的IO口设为高电平,持续检查该IO口电平。若按键按下,IO口电平会被拉低。检查到IO口低电平即可判断按键被按下。
以下是没有按键消抖的程序
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
sbit key_s2 = P3^0; //独立按键s2
uchar num = 0; //数码管显示的值
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
void main()
{
WE = 1; //打开位选锁存器
P0 = 0xfe; //1111 1110
WE = 0; //锁存位选数据
while(1)
{
if(key_s2 == 0)
{
num++; //当按键按下,数字+1
if(num == 10)
num = 0; //数字超过10则归0
}
DU = 1; //打开段选锁存器
P0 = table[num]; //显示对应数字
DU = 0; //锁存段选数据
}
}
以上程序中,当按下按键时,可能会改变好几次数字,松开按键的时候也可能改变几次数字。
这是因为按键在按下和松开的过程中存在机械抖动,按键在抖动过程中会反复多次地“闭合”、“断开”、“闭合”、“断开”......单片机抓取了这些抖动信号,以为按键快速地被“按下”、“松开”、“按下”、“松开”......
加入软件消抖。当按键按下后,数字持续增加
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
sbit key_s2 = P3^0; //独立按键s2
uchar num = 0; //数码管显示的值
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y >0; y--);
}
void main()
{
WE = 1; //打开位选锁存器
P0 = 0xfe; //1111 1110
WE = 0; //锁存位选数据
while(1)
{
if(key_s2 == 0)
{
delay(20); //延时20ms,在延时期间按键在抖动,延时结束后按键状态已经平稳
if(key_s2 == 0) //确认按键确实是被按下的
{
num++; //当按键按下,数字+1
if(num == 10)
num = 0; //数字超过10则归0
}
}
DU = 1; //打开段选锁存器
P0 = table[num]; //显示对应数字
DU = 0; //锁存段选数据
}
}
加入松手检测。按键按下并松手后才显示加一
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
sbit key_s2 = P3^0; //独立按键s2
uchar num = 0; //数码管显示的值
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y >0; y--);
}
void main()
{
WE = 1; //打开位选锁存器
P0 = 0xfe; //1111 1110
WE = 0; //锁存位选数据
while(1)
{
if(key_s2 == 0)
{
delay(20); //延时20ms,在延时期间按键在抖动,延时结束后按键状态已经平稳
if(key_s2 == 0) //确认按键确实是被按下的
{
num++; //当按键按下,数字+1
if(num == 10)
num = 0; //数字超过10则归0
while(!key_s2); //如果按键还没松开,key_s2==0,!key_s2就是非零,程序停留在while循环内,不往下进行
}
}
DU = 1; //打开段选锁存器
P0 = table[num]; //显示对应数字
DU = 0; //锁存段选数据
}
}
网友评论