我的这个程序是红外解码(芯片是saa3010)就是在解码的过程中有按两个不一样的键但是显示一个数值 还有就是按有的按键会导致液晶显示胡混乱 比如应该显示a0 他会显示成a00 还有的就是会在1602的第二行显示数字 有时会导致1602不显示了
这是为啥 大家帮帮忙了 (有的按键就行)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,count;
uchar table[3];
uchar code GAQ[16]={'0','1','2','3','4',
'5','6','7','8','9','A','B','C','D','E','F'};
sbit IR=P3^2;
sbit rs=P2^4; //液晶
sbit rw=P2^5;
sbit e=P2^6;
void delayms(uchar x)
{
uchar j,k;
for(j=240;j>0;j--)
for(k=x;k>0;k--);
}
void delayus(uint data gaq)
{
while(gaq--);
}
/*-----------------------------------------
1602的读写函数
-----------------------------------------*/
void write1602_step(uchar step) //lcd写指令子程序
{
rs=0;
rw=0;
e=1;
P0=step;
e=0;
delayus(4);
}
void write1602_date(uchar date) //lcd写数据子程序
{
rs=1;
rw=0;
e=1;
P0=date;
e=0;
delayus(4);
}
void init1602()
{
e=0;
delayus(1400);//延时10ms用于液晶上电自动初始化
write1602_step(0x38);
write1602_step(0x0c);
write1602_step(0x06);
write1602_step(0x01);
delayus(160);
}
void init_IR()
{
TMOD=0x01; //定时器0工作方式1
IR=1; //置int0位高电平下降沿触发
IT0=1; //外部中断下降沿触发
EX0=1; //开启外部中断
ET0=1; //开启定时器0的中断
EA=1; //开启总中断
}
void main()
{
init1602();
init_IR();
while(1)
{
P1=table[2];
write1602_step(0x80);
write1602_date(GAQ[table[2]/16]); //取高位
write1602_step(0x81);
write1602_date(GAQ[table[2]&0x0f]); //取低位
}
}
void IR_INT0() interrupt 0 using 0
{
TL0=0x86; //赋低位
TR0=1; //开启定时器0
TH0=0xfe; //赋高位
EX0=0; //关闭外部中断
table[0]=table[1]=table[2]=0;
num=0;
count=0;
}
void time0() interrupt 1 using 0
{
bit in=~IR;
TL0=0x85; //赋初值
TH0=0xf9;
if(count==3) //滤掉多余的脉冲
{
TR0=0; //关闭定时器0
IR=1; //复位
delayms(168);//延时避开重复按键的时间80ms
IE0=0;
TF0=0;
EX0=1; //开启外部中断
return;
}
num++;
if(num==3)
{
count=1;
}
else if(num==8)
{
count=2;
}
else if(num==14)
{
count=3;
}
else if(count!=3)
{
table[count]=table[count]|in;
table[count]<<=1;
}
} |