📄 anjian0202.c
字号:
/*******************************************************************************************
*
* 扫键程序,扫键及消抖时间均为50ms,确认键值后200ms不再扫键
*
* 创建日期:2007.1.30 创建人:赵焱
* 修改日期:2007.2.1 修改人:赵焱
* 修改内容:修改了定时时间间隔,扫键时间和消抖时间统一为50ms,
* 优化扫键函数。
*******************************************************************************************/
#include <reg51.h>
#include <absacc.h>
#define dataPort XBYTE[0xb000] /*数据总线地址定义*/
#define key_quit 0x38 /*四按键相应键值定义*/
#define key_up 0x34
#define key_down 0x2c
#define key_confirm 0x1c
sbit elight1=P1^7; /*缓冲器使能管脚*/
sbit elight2=P1^6;
unsigned char bdata key_flag; /*扫键标志*/
sbit key_able=key_flag^0;
sbit key_ok=key_flag^1;
sbit key_press=key_flag^2;
unsigned char xdata key,key1,key2,key_counter;
/*********************************************************************************
定时中断
定时器0,时间间隔50ms
**********************************************************************************/
void timer0(void) interrupt 1 using 1
{
TR0=0;
TL0=0x00; /*定时50ms*/
TH0=0x4c;
TR0=1;
key_counter--;
if(key_counter==0)
{
key_able=1;
key_counter=1;
}
}
/************************************************************************************
按键扫描
扫键间隔50ms,消抖50ms,确认后200ms 不再扫键
*************************************************************************************/
void keyscan(void)
{
if(key_able==1) /*扫键时间到*/
{
key_able=0;
key1=P1&0x3c;
if(key1!=0x3c) /*有键按下*/
{
if(key_press&&key2==key1) /*消抖后确认有键按下*/
{
key=key2; /*赋键值*/
key_press=0; /*有键按下标志复位*/
key_ok=1; /*确认标志*/
key2=0;
key_counter=4; /*后200ms不再扫键*/
}
else
{ /*抖动或第一次扫到按键*/
key_press=1;
key_counter=1; /*50ms后再扫*/
key2=key1; /*赋第一次键值*/
key_ok=0; /*不能确认按键*/
}
}
else /*无键按下*/
{
key2=0;
key=0;
key_ok=0;
key_press=0;
}
}
}
/*************************************************************************************
指示灯点亮程序
根据当前键值点亮对应的指示灯,提示按键被响应
**************************************************************************************/
void elight(void) /*根据键值点亮LED指示灯*/
{
elight1=0; /*开缓冲器*/
elight2=0;
switch(key) /*点亮键值对应的指示灯*/
{
case 0:break;
case key_quit:{
dataPort=0xfe;
break;}
case key_up:{
dataPort=0xfd;
break;}
case key_down:{
dataPort=0xfb;
break;}
case key_confirm:{
dataPort=0xf7;
break;}
}
elight1=1; /*关缓冲器*/
elight2=1;
}
void main(void)
{
EA=1;
ET0=1;
TMOD=0x01; /*定时器0,模式1,定时时间50ms*/
TL0=0x00;
TH0=0x4c;
TR0=1;
key_able=0;
key_counter=1;
P1=0xff;
while(1)
{
keyscan();
elight();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -