#include <AT89X51.H>
#include <string.h>
#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() interrupt 1 //定时中断服务程序,为按键消抖服务
{
if (++us250<4) return;
us250=0; ++ms;
}
data unsigned int k1t, k2t;
bit k1s,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;
bit LED2; //用以记住当前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("Bad command.\n");}
bufp=0;//命令处理完毕,则清除缓冲
}
}
追问你好,报错这个呢。我已把COM_0.h 加上了
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/37d3d539b6003af3b4c22592372ac65c1138b6cc?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
追答65行错了,sw1=sw2=1=k1s=k2s=1;该为 sw1=sw2=k1s=k2s=1;
追问我改了,有10个警告,功能还没实现了,方便留个Q么
追答我不喜欢Q,电话:18酒015酒8848
我这儿功能没有问题