|
代碼沒反應!!!
按鍵處理函數:
長按點亮LED1
短按點亮LED1
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LONG_time 4 //定義長按設置鍵的時間
uchar Keycount; //設置按鍵時長計數器
uchar skpttime; //設置按鍵時長
uchar longflag; //設置長按標志
bit skpflag; //設置按鍵按下標志
sbit SETKEY =P2^0; //多功能按鍵(短按,長按)
sbit LED1 =P2^1;
sbit LED2 =P2^2;
void delay1ms(uchar ms)
{
while(ms--) //每循環一次,約延遲1ms
{
uchar i;
for(i=0;i<250;i++) //循環250次,在12M晶振時約延時1ms
{
_nop_(); //執行一條_nop_()指令為一個機器周期
_nop_();
_nop_();
_nop_();
}
}
}
/*------------按鍵處理程序--------------------------*/
void KEY_Short() /*(短按k2)*/
{
LED1=1;
LED2=0;
}
void KEY_Long() /*(長按k2)*/
{
LED1=0;
LED2=1;
}
/*----------檢測及處理多功能設置按鍵KEY-------------*/
void setkeyscan()
{
if(skpflag) //判斷是否已經有鍵按下未被處理
{
if(Keycount>LONG_time) //如果是長按則執行長按鍵設置功能
{
KEY_Long();
skpflag=0;
longflag=1;
}
else if((skpttime>0)&&(skpttime<=LONG_time))//否則如果是短按則執行短按的功能,都不是直接跳過
{
KEY_Short();
skpflag=0;
}
}
else
{
if(!SETKEY) //按下設置鍵
{
delay1ms(10); //鍵盤防抖
if((!SETKEY)&&longflag==0)
{
Keycount=0; //初始化按鍵時長計數器
skpttime=0; //初始化按鍵時長
skpflag=1; //標志已經有鍵被按下
longflag=0;
}
}else
{
longflag=0;
}
}
}
void key_init()
{
Keycount=0; //初始化功能鍵按下時長計數器
skpttime=0; //初始化功能鍵按下的總時長
SETKEY=1; //KEY設置為輸入端口
longflag=0;
LED1=0;
LED2=0;
}
/*---------------主函數--------------------*/
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
key_init();
while(1)
{
setkeyscan();
}
}
/*************定時器中斷函數****************/
void Timer0(void) interrupt 1
{
if(skpflag)
{
Keycount++;
if(SETKEY)
skpttime=Keycount;
}
}
|
-
-
-
Key.zip
2020-8-6 16:55 上傳
點擊文件名下載附件
81.75 KB, 下載次數: 6
按鍵處理程序
|