专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

C51单片机键盘检测原理以及实现

作者:佚名   来源:本站原创   点击数:  更新时间:2012年03月20日   【字体:

首先,在做软件之前确定硬件。明确键盘类型:
弹性按键:按下时闭合,松手后自动断开。如电脑键盘

自锁式按键:按下时闭合,且自动锁住。一边用于开关

在I/O口检测触电电压时应该考虑按键抖动问题,一般按键抖动为5~10ms左右,具体与其机械特性有关,所以要加检测抖动环节,可以用软件或者去抖动芯片硬件处理,当然通常用延时方法处理。
注意正确连接引脚。

下面是一个简单的4按键独立键盘程序,在51hei开发板的数码管上操作。
完整的源代码下载 http://www.51hei.com/f/jpdd.rar 
数值为0~59变化,开始显示00
按key1数值加1,按key2数值减1,按key3数值归0,按key4数值每秒加1。

#include <reg52.h>
#define uchar unsigned char
#define unit unsigned int
sbit key1=P3^2;
sbit key1=P3^4;
sbit key1=P3^6;
sbit key1=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06.0x5b,0x4f,
0x66,0x6d,0x7d,0x07
0x7f,0x6f,0x77,0x7c
0x39,0x5e,0x79,0x71};
void delayms(unit);
uchar numt0,unm;
void display(uchar numdis)      //定义一个显示的函数,分个位十位,用来显示
{
uchar shi,ge;                 //然后用轮流显示发,利用人眼图像残留分别显示
shi=numdis/10;               //上面的numdis表示num这个显示的数
ge=numdis%10;              //numdis由下面主函数num赋值
 
dula=1;
P0=table[shi];
dula=0;
 
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
 
dula=1;
P0=table[ge];
dula=0;
 
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
}
void delayms(unit xms)            //自定义延迟环节
{
unit i,j;
for(i=xms,i>0,i--);
for(j=110,j>0,j--);
}
void init()                       //初始化函数,保证程序正常运行
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-458720%256;
EA=1;
ET=0;
}
void keyscan()                 //键盘扫描函数,期间注意键盘抖动,由延迟方法处理
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
num++;
if(num==60)
num=0;
while(!key1);                //等待按键释放才执行,下同
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
num--;
if(num==0)
num=60;
while(!key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
uum=0;
while(!key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!key4);
TR0=~TR0;                  //启动或者中断定时器
}
}
}
void main()
{
init();
while(1);
{
keyscan();
display(num);
}
}
void T0_time() interrupt 1                        //中断程序
{
TH0=(65536-45872)/256;                       //重装数值,数值需要根据晶振进行计算
TL0=(65536-45872)%256;
numt0++ ;
if(numt0==20)                        ///由于机器周期为50ms,那么1s需要20个周期
{
numt0=0;
num++;                      
if(num==60)
num=0;
}
}

 

关闭窗口

相关文章