謝謝你的回復,我按照你的思路改了一下 我的程序,還是不行,短按鍵按下沒有反應了,和我以前想的方法相近,不知道是不是我理解錯了,下面是我修改后的程序:
#include<reg51.h>
sfr P5 = 0XC8;
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
sbit LEDR = P3^1;
sbit LEDG = P5^5;
sbit LEDB = P3^0;
sbit LEDM = P3^2;
sbit KEY = P3^3;
u8 sysTim; //系統時基
u8 keyProcTim; //按鍵處理時間
u8 ledProcTim; //LED燈處理時間
u8 keyState; // 按鍵狀態
u8 keyDownCnt; //按鍵按下計數器
u8 keyShort; //短按鍵標志
u8 keyLong; //長按鍵標志
u8 ledState = 0; //led狀態
u8 ledon; //開機標志,開機為1
u8 ledmode; //led工作模式
u8 val=0; //紅,黃,綠,青,蘭,紫,白
//u8 code LED_TEB[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//u8 LOOP_TEMP=0;
void key_Proc();
void led_Proc();
void main()
{
LEDR = 0;
LEDG = 0;
LEDB = 0;
ledState = 0;
EA = 1;
TMOD = 0X01;
TH0 = 0XFC;
TL0 = 0X66;
ET0 = 1;
TR0 = 1;
while(1)
{
key_Proc();
led_Proc();
}
}
void key_Proc()
{
if(sysTim-keyProcTim >= 20) //20ms掃描一次按鍵
{
keyProcTim = sysTim;
switch(keyState)
{
case 0: //檢測有按鍵按下
if(!KEY)
{
keyDownCnt = 0;
keyState = 1;
}
break;
case 1: //消抖和短按鍵確認
if(!KEY)
{
keyDownCnt++;
if(keyDownCnt >= 50) //20ms掃描一次,
//掃描50次即:50*20=1000ms長按鍵(500ms以上)
{
keyLong = 1; //長按鍵標志,長按鍵按下
keyState = 2; //按鍵狀態標志為2
}
}
else
{
if(keyDownCnt != 0) //短按鍵
{
keyShort = 1; //短按鍵標志,短按鍵按下
keyState = 0; //按鍵狀態標志為0
}
}
break;
default: //case 2: //等待按鍵釋放
if(KEY)
{
keyLong = 0; //長按鍵標志,長按鍵沒有按下
keyState = 0; //按鍵狀態為0
}
break;
}
}
if(1==keyShort) //短按鍵處理
{
keyShort = 0;
ledState = 1; //led狀態1
}
if(1==keyLong) //長按鍵處理
{
keyLong = 0;
ledState = 10; //led狀態2
}
}
void led_Proc()
{
if(1==ledon) //開燈
{
if(ledState==1) //led狀態1,短按鍵
{
// ledState = 0;
// LEDR = 0;
// LEDB = 0;
// LEDG = 1;
val++;
if(val>6)
val=0;
switch(val)
{
case 0 :LEDR = 1;LEDG = 1;LEDB = 1;break; //白
case 1 :LEDR = 1;LEDG = 0;LEDB = 0;break;
case 2 :LEDR = 1;LEDG = 1;LEDB = 0;break;
case 3 :LEDR = 0;LEDG = 1;LEDB = 0;break;
case 4 :LEDR = 0;LEDG = 1;LEDB = 1;break;
case 5 :LEDR = 0;LEDG = 0;LEDB = 1;break;
case 6 :LEDR = 1;LEDG = 0;LEDB = 1;break;
}
}
}
if(10==ledState) //led狀態2,長按鍵
{
ledState = 0;
if(0==ledon) //如果在關燈
{
ledon = 1; //就打打開燈
LEDR = 1;
LEDG = 1;
LEDB = 1;
}
else //如何在開燈
{
ledon = 0; //就關燈
LEDR = 0;
LEDG = 0;
LEDB = 0;
}
}
}
void interruptTimer0() interrupt 1
{
TH0 = 0XFC;
TL0 = 0X66;
sysTim++;
} |