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标志
}
|