K 是 開關機鍵。
k1,k2,k3,k4 是開機后,是操作鍵。鍵不能正常操作。
#include"stc8h.h"
sbit LEDR = P1^0;
sbit LEDB = P1^4;
sbit LEDR0 = P1^5;
sbit LEDG0 = P1^6;
sbit LEDB0 = P1^7;
sbit KEY = P3^7;
sbit KEY1 = P3^6;
sbit KEY2 = P3^5;
sbit KEY3 = P3^4;
sbit KEY4 = P3^3;
unsigned char keyshort; //短按鍵標志
unsigned char keylong; //長按鍵標志
unsigned char keyshort1; //短按鍵標志
unsigned char keylong1; //長按鍵標志
unsigned char keyshort2; //短按鍵標志
unsigned char keylong2; //長按鍵標志
unsigned char keyshort3; //短按鍵標志
unsigned char keylong3; //長按鍵標志
unsigned char keyshort4; //短按鍵標志
unsigned char keylong4; //長按鍵標志
unsigned char LEDON; //開燈狀態
unsigned char flag1ms; //1ms標志
unsigned char flag1ms1; //1ms標志
unsigned char flag1ms2; //1ms標志
unsigned char flag1ms3; //1ms標志
unsigned char flag1ms4; //1ms標志
void key_Proc(); //按鍵處理
void led_Proc(); //燈處理
void key_Proc1(); //按鍵處理
void led_Proc1(); //燈處理
void key_Proc2(); //按鍵處理
void led_Proc2(); //燈處理
void key_Proc3(); //按鍵處理
void led_Proc3(); //燈處理
void key_Proc4(); //按鍵處理
void led_Proc4(); //燈處理
void Timer0Init(); //中斷初始化
void main()
{
P0 = 0;
P1 = 0;
P2 = 0;
Timer0Init(); //中斷初始化
while(1)
{
key_Proc(); //按鍵處理
led_Proc(); //燈處理
key_Proc1(); //按鍵處理
led_Proc1(); //燈處理
key_Proc2(); //按鍵處理
led_Proc2(); //燈處理
key_Proc3(); //按鍵處理
led_Proc3(); //燈處理
key_Proc4(); //按鍵處理
led_Proc4(); //燈處理
}
}
void key_Proc() //按鍵處理
{
unsigned int keyTim; //按鍵時間
if(flag1ms) //1ms時間標志
{
flag1ms = 0;
if(KEY)
{
if((keyTim>10)&&(keyTim<1000)) //按鍵時間大于10ms小于50ms,是短按鍵
{
keyshort = 1; //短按鍵標志
}
keyTim = 0; //按鍵時間清零
}
else
{
if(keyTim<5000) //按鍵時間小于10S
keyTim++; //按鍵時間加
if(keyTim==1500) //按鍵時間為1S
{
keylong = 1; //長按鍵標志
}
}
}
}
void led_Proc() //燈處理
{
if((LEDON==0)&&(keyshort==1)) //關燈狀態同時長按鍵按下就開燈
{
keyshort = 0; //長按鍵松開
LEDON = 1; //關燈時就開燈
LEDR = 1; //RGB燈亮白光
}
if((LEDON==1)&&(keylong==1)) //開燈狀態同時長按鍵按下就關燈
{
keylong = 0; //長按鍵松開
LEDON = 0; //開燈時就關燈
LEDR = 0; //RGB燈滅
}
}
void key_Proc1() //按鍵處理
{
unsigned int keyTim; //按鍵時間
if(flag1ms1) //1ms時間標志
{
flag1ms1 = 0;
if(KEY1)
{
if((keyTim>10)&&(keyTim<1000)) //按鍵時間大于10ms小于50ms,是短按鍵
{
keyshort1 = 1; //短按鍵標志
}
keyTim = 0; //按鍵時間清零
}
else
{
if(keyTim<5000) //按鍵時間小于10S
keyTim++; //按鍵時間加
if(keyTim==1500) //按鍵時間為1S
{
keylong1 = 1; //長按鍵標志
}
}
}
}
void led_Proc1() //燈處理
{
if((LEDON==1)&&(keyshort1==1)) //關燈狀態同時長按鍵按下就開燈
{
keyshort1 = 0; //長按鍵松開
LEDON = 1; //關燈時就開燈
LEDR0 = 1; //RGB燈亮白光
LEDG0 = 0;
LEDB0 = 0;
}
if((LEDON==1)&&(keylong1==1)) //開燈狀態同時長按鍵按下就關燈
{
keylong1 = 0; //長按鍵松開
LEDON = 1; //開燈時就關燈
LEDR0 = 0; //RGB燈滅
LEDG0 = 0;
LEDB0 = 0;
}
}
void key_Proc2() //按鍵處理
{
if(flag1ms2) //1ms時間標志
{
unsigned int keyTim; //按鍵時間
flag1ms2 = 0;
if(KEY2)
{
if((keyTim>10)&&(keyTim<1000)) //按鍵時間大于10ms小于50ms,是短按鍵
{
keyshort2 = 1; //短按鍵標志
}
keyTim = 0; //按鍵時間清零
}
else
{
if(keyTim<5000) //按鍵時間小于10S
keyTim++; //按鍵時間加
if(keyTim==1500) //按鍵時間為1S
{
keylong2 = 1; //長按鍵標志
}
}
}
}
void led_Proc2() //燈處理
{
if((LEDON==1)&&(keyshort2==1)) //關燈狀態同時長按鍵按下就開燈
{
keyshort2 = 0; //長按鍵松開
LEDON = 1; //關燈時就開燈
LEDR0 = 0; //RGB燈亮白光
LEDG0 = 1;
LEDB0 = 0;
}
if((LEDON==1)&&(keylong2==1)) //開燈狀態同時長按鍵按下就關燈
{
keylong2 = 0; //長按鍵松開
LEDON = 1; //開燈時就關燈
LEDR0 = 0; //RGB燈滅
LEDG0 = 0;
LEDB0 = 0;
}
}
void key_Proc3() //按鍵處理
{
unsigned int keyTim; //按鍵時間
if(flag1ms3) //1ms時間標志
{
flag1ms3 = 0;
if(KEY3)
{
if((keyTim>10)&&(keyTim<1000)) //按鍵時間大于10ms小于50ms,是短按鍵
{
keyshort3 = 1; //短按鍵標志
}
keyTim = 0; //按鍵時間清零
}
else
{
if(keyTim<5000) //按鍵時間小于10S
keyTim++; //按鍵時間加
if(keyTim==1500) //按鍵時間為1S
{
keylong3 = 1; //長按鍵標志
}
}
}
}
void led_Proc3() //燈處理
{
if((LEDON==1)&&(keyshort3==1)) //關燈狀態同時長按鍵按下就開燈
{
keyshort3 = 0; //長按鍵松開
LEDON = 1; //關燈時就開燈
LEDR0 = 0; //RGB燈亮白光
LEDG0 = 0;
LEDB0 = 1;
}
if((LEDON==1)&&(keylong3==1)) //開燈狀態同時長按鍵按下就關燈
{
keylong3 = 0; //長按鍵松開
LEDON = 1; //開燈時就關燈
LEDR0 = 0; //RGB燈滅
LEDG0 = 0;
LEDB0 = 0;
}
}
void key_Proc4() //按鍵處理
{
unsigned int keyTim; //按鍵時間
if(flag1ms4) //1ms時間標志
{
flag1ms4 = 0;
if(KEY4)
{
if((keyTim>10)&&(keyTim<1000)) //按鍵時間大于10ms小于50ms,是短按鍵
{
keyshort4 = 1; //短按鍵標志
}
keyTim = 0; //按鍵時間清零
}
else
{
if(keyTim<5000) //按鍵時間小于10S
keyTim++; //按鍵時間加
if(keyTim==1500) //按鍵時間為1S
{
keylong4 = 1; //長按鍵標志
}
}
}
}
void led_Proc4() //燈處理
{
if((LEDON==1)&&(keyshort4==1)) //關燈狀態同時長按鍵按下就開燈
{
keyshort4 = 0; //長按鍵松開
LEDON = 1; //關燈時就開燈
LEDR0 = 0; //RGB燈亮白光
LEDG0 = 0;
LEDB = 1;
}
if((LEDON==1)&&(keylong4==1)) //開燈狀態同時長按鍵按下就關燈
{
keylong4 = 0; //長按鍵松開
LEDON = 0; //開燈時就關燈
LEDR0 = 0; //RGB燈滅
LEDG0 = 0;
LEDB = 0;
}
}
void Timer0Init() //中斷初始化
{
TMOD &= 0XF0; //中斷0模式1
TMOD |= 0X01;
TH0 = 0XFC; //初值1ms
TL0 = 0X66;
ET0 = 1; //允許T0中斷
TR0 = 1; //定時器0開始計時
EA = 1; //開中斷
}
void interruptTimer0() interrupt 1
{
TH0 = 0XFC;
TL0 = 0X66;
flag1ms = 1; //1ms標志
flag1ms1 = 1; //1ms標志
flag1ms2 = 1; //1ms標志
flag1ms3 = 1; //1ms標志
flag1ms4 = 1; //1ms標志
}
|