?? 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 + -