C51单片机键盘检测原理以及实现
首先,在做软件之前确定硬件。明确键盘类型:
弹性按键:按下时闭合,松手后自动断开。如电脑键盘
自锁式按键:按下时闭合,且自动锁住。一边用于开关
在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;
}
}
- 基于单片机的智能计步器设计(09-20)
- C51单片机微调SH-20504程序(12-02)
- C51单片机运用定时器T0中断实现电子时钟(12-02)
- T6963C的51单片机驱动程序(12-02)
- 89C51单片机I/O口模拟串行通信的实现方法(11-30)
- 基于stc51单片机的光立方c语言源代码(11-30)