|
謝謝你的回復(fù),我按照你的思路改了一下 我的程序,還是不行,短按鍵按下沒(méi)有反應(yīng)了,和我以前想的方法相近,不知道是不是我理解錯(cuò)了,下面是我修改后的程序:
#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; //系統(tǒng)時(shí)基
u8 keyProcTim; //按鍵處理時(shí)間
u8 ledProcTim; //LED燈處理時(shí)間
u8 keyState; // 按鍵狀態(tài)
u8 keyDownCnt; //按鍵按下計(jì)數(shù)器
u8 keyShort; //短按鍵標(biāo)志
u8 keyLong; //長(zhǎng)按鍵標(biāo)志
u8 ledState = 0; //led狀態(tài)
u8 ledon; //開(kāi)機(jī)標(biāo)志,開(kāi)機(jī)為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: //檢測(cè)有按鍵按下
if(!KEY)
{
keyDownCnt = 0;
keyState = 1;
}
break;
case 1: //消抖和短按鍵確認(rèn)
if(!KEY)
{
keyDownCnt++;
if(keyDownCnt >= 50) //20ms掃描一次,
//掃描50次即:50*20=1000ms長(zhǎng)按鍵(500ms以上)
{
keyLong = 1; //長(zhǎng)按鍵標(biāo)志,長(zhǎng)按鍵按下
keyState = 2; //按鍵狀態(tài)標(biāo)志為2
}
}
else
{
if(keyDownCnt != 0) //短按鍵
{
keyShort = 1; //短按鍵標(biāo)志,短按鍵按下
keyState = 0; //按鍵狀態(tài)標(biāo)志為0
}
}
break;
default: //case 2: //等待按鍵釋放
if(KEY)
{
keyLong = 0; //長(zhǎng)按鍵標(biāo)志,長(zhǎng)按鍵沒(méi)有按下
keyState = 0; //按鍵狀態(tài)為0
}
break;
}
}
if(1==keyShort) //短按鍵處理
{
keyShort = 0;
ledState = 1; //led狀態(tài)1
}
if(1==keyLong) //長(zhǎng)按鍵處理
{
keyLong = 0;
ledState = 10; //led狀態(tài)2
}
}
void led_Proc()
{
if(1==ledon) //開(kāi)燈
{
if(ledState==1) //led狀態(tài)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狀態(tài)2,長(zhǎng)按鍵
{
ledState = 0;
if(0==ledon) //如果在關(guān)燈
{
ledon = 1; //就打打開(kāi)燈
LEDR = 1;
LEDG = 1;
LEDB = 1;
}
else //如何在開(kāi)燈
{
ledon = 0; //就關(guān)燈
LEDR = 0;
LEDG = 0;
LEDB = 0;
}
}
}
void interruptTimer0() interrupt 1
{
TH0 = 0XFC;
TL0 = 0X66;
sysTim++;
} |
|