下面是红外通信数据解码程序,功能是:按遥控器上的按键,使按键的数据以16进制的方式在数码管上显示出来,当某个按键按下时执行相应的功能。此代码放在12T的STC89C52上运行正常,但是放在1T的STC8G1K08上就出现问题了,现象是:只有几个按键的数据可以解码出来,大部分的按键无效,两款单片机的运行速度不一样,延时函数的时间调了也是没用,难道是STC的12T和1T的单片机内核不一样吗?求大佬们赐教!!
#include"stc8g.h"
typedef unsigned int u16; //对数据类型声明定义
typedef unsigned char u8;
sbit Relay=P5^5;
sbit IRIN=P3^2; //定义红外接收INT0输入口
u8 IrValue[4];
u8 Time;
u8 DisplayData[4];
u8 code smgduan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xff};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码
void delay(u16 z) //z=1时,大约延时10us
{
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DigDisplay() //数码管显示函数
{
u8 i;
P1=0xff; //消隐
P3&=0x0f; //位清0
P1=DisplayData[i]; //段码
P3|=0x10<<i; //位码
i++;
i%=4;
}
void IrInit() //初始化红外线接收
{
IT0=1; //下降沿触发
EX0=1; //打开中断0允许
EA=1; //打开总中断
IRIN=1; //初始化端口
}
void main()
{
P1M0=0x00;
P1M1=0x00;
P3M0=0xff; //P3口设置为强推挽
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
IrInit();
while(1)
{
DisplayData[3] = smgduan[17]; //此位不显示
DisplayData[2] = smgduan[IrValue[2]/16]; //显示解码后的16进制的数据值
DisplayData[1] = smgduan[IrValue[2]%16];
DisplayData[0] = smgduan[16]; //显示H,表示16进制的意思
DigDisplay();
if(IrValue[2]==0x10) //接收到某个数值时,执行的功能
{
Relay=~Relay;
}
}
}
void ReadIr() interrupt 0 //解码红外数值的中断函数
{
u8 j,k;
u16 err;
Time=0;
delay(700);
if(IRIN==0)
{
err=1000;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
if(IRIN==1)
{
err=500;
while((IRIN==1)&&(err>0))
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有4组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0))
{
delay(10);
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1; //k表示第几组数据
if(Time>=8)
{
IrValue[k]|=0x80;
}
Time=0;
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
|