使用1602时,两个红外接收装置有可能重复扫描,无法清零,使得加减顺序变乱
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,temp1,num=10,aa=0;
uint num1,num2;
char key_num,key_flag;
//uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码
//uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选码
uchar code Table[]="renshu";
uchar code Table1[]="0123456789";
sbit dula=P2^6;
sbit wela=P2^7;
sbit hong1=P1^0;
sbit hong2=P1^1;
sbit led1=P1^5;
sbit led2=P1^6;
sbit led3=P1^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit fengming=P2^3;
sbit guangmin=P1^4;
sbit k1=P2^4;
sbit k2=P1^2;
sbit led=P1^3;
void yaokong();
void delay(uint z);
void init();//初始化
void init1();
void display(uchar shi,uchar ge);//显示
void panduan1();//判断函数
void guangm();//光敏
void Timer0Init();
void write_com(uchar com);
void write_data(uchar date);
void init();
void main()
{
Timer0Init();
while(1)
{
yaokong();
panduan1();
if(temp1>0)
fengming=1;
led1=1;
led2=1;
led3=1;
shi=temp1/10;
ge=temp1%10;
guangm();
if(!temp1)
{
display(shi,ge);
}
else
{
display(shi,ge);
}
init1();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
void display(uchar shi,uchar ge)
{
for(aa=0;aa<7;aa++)
{
write_data(Table[aa]);
}
while(num--);
write_com(0x80+0x40);//换行,第一行0-27H,第二行40H-60H
write_data(Table1[shi]);
while(num--);
write_data(Table1[ge]);
while(num--);
}
void guangm()
{
if(guangmin==0)
{
led1=1;
led2=1;
led3=1;
}
else
{
if(temp1<4&&temp1>0)
{
led1=0;
}
if(temp1>3&&temp1<11)
{
led1=0;
led2=0;
}
if(temp1>10)
{
led1=0;
led2=0;
led3=0;
}
}
delay(2);
}
void Timer0Init(void) //3毫秒@11.0592MHz
{
ET0=1;
TMOD &= 0x0F; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF1标志
EA=1;
led=1;
}
void time1() interrupt 1
{
if(hong1==0)
{
num1++;
}
if(hong2==0)
{
num2++;
}
}
void panduan1()
{
if(hong1==0)
{ delay(20);
if(hong1==0)
{
TR0=1;
}
}
if(hong2==0);
{
delay(20);
if(hong2==0)
{
TR0=1;
}
}
if(num1!=0&&num2!=0)
{
if(num1>num2)
{ temp1++;
delay(300);
if(hong2==1&&hong1==1)
{
init();
}
}
if(num1<num2)
{
if(temp1<1)
temp1=0;
else
temp1--;
delay(300);
if(hong1==1&&hong2==1)
{
init();
}
}
}
}
void init()
{
TR0=0;
num1=0;
num2=0;
hong1=1;
hong2=1;
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
}
void yaokong()
{
if(k1==1)
key_flag=10;
if(k2==1)
key_flag=11;
if(key_flag==10)
{
led=0;
guangmin=0;
}
else
{
led=1;
guangmin=1;
}
}
void write_com(uchar com)
{
//写命令
lcdrs=0;//数据命令选择端,选择命令
lcden=0;//使能
P0=com;//送指令
lcdrw=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
//写数据
lcdrs=1;//数据命令选择端,选择数据
lcden=0;//使能
P0=date;//送数据
delay(5);
lcdrw=0;
lcden=1;
delay(5);
lcden=0;
}
void init1()
{
//第一步关闭数码管两个锁存器
dula=0;
wela=0;
//第二步初始化液晶
// lcden=0;//使能
write_com(0x38);//模式初始化
write_com(0x0c);//开显示,显示光标,光标闪烁
write_com(0x06);//光标+1,不整屏移动了
// write_com(0x01);//显示清零,数据指针清零
write_com(0x80);//数据地址指针初始化00
}
而使用数码管时,就较为稳定
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,temp1,num=10;
uint num1,num2;
char key_num,key_flag;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选码
sbit dula=P2^6;
sbit wela=P2^7;
sbit hong1=P1^0;
sbit hong2=P1^1;
sbit led1=P1^5;
sbit led2=P1^6;
sbit led3=P1^7;
sbit fengming=P2^3;
sbit guangmin=P1^4;
sbit k1=P2^4;
sbit k2=P1^2;
sbit led=P1^3;
void yaokong();
void delay(uint z);
void init();//初始化
void display(uchar shi,uchar ge);//显示
void panduan1();//判断函数
void guangm();//光敏
void Timer0Init();
void init();
void main()
{
Timer0Init();
while(1)
{
// yaokong();
panduan1();
shi=temp1/10;
ge=temp1%10;
guangm();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
void display(uchar shi,uchar ge)
{
P0=0xff;
wela=1;
P0=table1[0];
wela=0;
dula=1;
P0=table[shi];
dula=0;
while(num--);
P0=0xff;
wela=1;
P0=table1[1];
wela=0;
dula=1;
P0=table[ge];
dula=0;
while(num--);
}
void guangm()
{
if(guangmin==0)
{
led1=1;
led2=1;
led3=1;
}
else
{
if(temp1<4&&temp1>0)
{
led1=0;
}
if(temp1>3&&temp1<11)
{
led1=0;
led2=0;
}
if(temp1>10)
{
led1=0;
led2=0;
led3=0;
}
}
delay(2);
}
void Timer0Init(void) //3毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TL1 = 0x66; //设置定时初值
TH1 = 0x7E; //设置定时初值
TF1 = 0; //清除TF0标志
TR1 = 1; //定时器0开始计时
ET1=1;
ET0=1;
TMOD &= 0x0F; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0x7E; //设置定时初值
TF0 = 0; //清除TF1标志
EA=1;
led=1;
}
void time0() interrupt 3
{
display(shi,ge);
}
void time1() interrupt 1
{
if(hong1==0)
{
num1++;
}
if(hong2==0)
{
num2++;
}
}
void panduan1()
{
if(hong1==0)
{ delay(10);
if(hong1==0)
{
TR0=1;
}
}
if(hong2==0);
{
delay(10);
if(hong2==0)
{
TR0=1;
}
}
if(num1!=0&&num2!=0)
{
if(num1>num2)
{ temp1++;
delay(200);
if(temp1==100)//超出蜂鸣器响
{
P0=0xff;
wela=1;
P0=0xfc;
wela=0;
dula=1;
P0=0x3f;
dula=0;
delay(1);
fengming=0;
while(num--);
}
if(hong2==1&&hong1==1)
{
init();
}
}
if(num1<num2)
{
if(temp1<1)
temp1=0;
else
temp1--;
delay(200);
if(hong1==1&&hong2==1)
{
init();
}
}
}
}
void init()
{
TR0=0;
num1=0;
num2=0;
hong1=1;
hong2=1;
TL0 = 0x66; //设置定时初值
TH0 = 0x7E; //设置定时初值
}
void yaokong()
{
if(k1==1)
key_flag=10;
if(k2==1)
key_flag=11;
if(key_flag==10)
{
led=0;
guangmin=0;
}
else
{
led=1;
guangmin=1;
}
}
求大佬帮忙改正
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。