#include #include "com_0.h"
sbit led1=P1^0;
sbit led2=P1^6;
sbit led3=P2^5;
sbit led4=P2^0;
sbit sw1=P3^6;
sbit sw2=P3^7; //接到XTAL1不对
void SetupTimer0()
{
TMOD &=0XF0; //仅保留T1信息
TMOD |=0X02; //设置T0:定时功能,方式2,自动重载8位定时器/计数器
TH0= 256-250;//定时每0.25ms中断一次
TL0= 256-250;
TR0= 1; //开启定时器
ET0= 1; //定时器0中断打开
}
data unsigned char us250;
data unsigned int ms;
void Timer0_ISR() interrupt1 //定时中断服务程序,为按键消抖服务
{
if (++us250<4) return;
us250=0; ++ms;
}
data unsigned int k1t, k2t;
bitk1s,k2s;
//按键扫描(含消抖) ,无键盘事件返回0
//按下sw1, 返回1 抬起,返回2
//按下sw2, 返回3 抬起,返回4
unsigned char key()
{
data unsigned int t;
t= ms-k1t;
if (t>1000) k1t=ms-1000;
if (sw1==1 && k1s==0 &&t>10)
{k1s=1; k1t=ms; return 2;}
if (sw1==0 && k1s==1 &&t>10)
{k1s=0; k1t=ms; return 1;}
if (sw1==k1s) k1t=ms;
t= ms-k2t;
if (t>1000) k2t=ms-1000;
if (sw2==1 && k2s==0 &&t>10)
{k2s=1; k2t=ms; return 4;}
if (sw2==0 && k2s==1 &&t>10)
{k2s=0; k2t=ms; return 3;}
if (sw2==k2s) k2t=ms;
return 0;
}
void main()
{
data unsigned char ch;
data char buf[16];
data unsigned char bufp;
bitLED2; //用以记住当前led2的状态
us250=ms=bufp=0;
k1t=k2t=0;
sw1=sw2=1=k1s=k2s=1;
SetupTimer0();
Com0Init();
EA = 1; //全局中断打开
Com0PutStr("Start...\n");
while(1)
{
ch=key();
switch(ch)
{
case 1:
led2=LED2; LED2^=1;
Com0PutStr(LED2?"LED2 ON\n":"LED2 OFF\n");
break;
case 3:
led4=0;Com0PutStr("LED4 ON\n");
break;
case 4:
led4=1;Com0PutStr("LED4 OFF\n");
break;
}
if (Com0Ready()==0)continue;
ch=Com0Getch();
if (ch=='\n'||ch=='\r')ch=0;
//下面一行防止非法按键造成缓冲溢出
if (bufp>=15) {memmove(buf,buf+1, 15);bufp=14;}
buf[bufp++]=ch;
if (ch)continue;
if(strcmp("L10",buf)==0){led1=0;Com0PutStr("LED1 ON\n"); }
else if(strcmp("L11",buf)==0){led1=1;Com0PutStr("LED1 OFF\n");}
else if(strcmp("L30",buf)==0){led3=0;Com0PutStr("LED3 ON\n"); }
else if(strcmp("L31",buf)==0){led3=1;Com0PutStr("LED3 OFF\n");}
else{Com0PutStr("Badcommand.\n");}
bufp=0;//命令处理完毕,则清除缓冲
}
}