|
发表于 2013-5-31 23:28:07
|
显示全部楼层
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit rw=P1^1;
sbit dula=P2^6;
sbit wela=P2^7;
sbit LED1=P1^3;
sbit LED2=P1^4;
uchar irtime,startflag,bitnum,irprosok,irreceok;
uchar irdata[33]; //引导码1位,8+8+8+8
uchar ircode[4];
uchar disp[8];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init_time0()
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
void init_INT0()
{
IT0=1;
EX0=1;
EA=1;
}
void irwork()
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
/*********************/
void write_com(uchar com)
{
lcdrs=0; //写指令.
P0=com;
delay(5);
lcden=1; //高脉冲,写东西
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1; //写数据.
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_LCD()
{
P0=0x00; //
dula=0; // 关数码管
wela=0; //
rw=0; //R/W读写选择端,低电平写,高电平读
lcden=0;
write_com(0x38);//显示
write_com(0x0e);//光标.
write_com(0x06); //写一字符后地址指针加1,整屏显示不移动.
write_com(0x01);//清屏.
write_com(0x80);//初始化数据,0x80表示指向第一个
// write_com(0x80+0x10); // 初始化数据,从0x10位写起.
}
void display_LCD()
{
uchar i;
write_com(0x80);
for(i=0;i<8;i++)//////////
{
if(disp[i]<10)
write_data(48+disp[i]);
else
write_data(55+disp[i]);
}
// irkeyscan();
/* switch(ircode[2])
{
case 0x16:write_data(48);break;
case 0x0c:write_data(49);break;
case 0x18:write_data(50);break;
case 0x5e:write_data(51);break;
case 0x08:write_data(52);break;
case 0x1c:write_data(53);break;
case 0x5a:write_data(54);break;
case 0x42:write_data(55);break;
case 0x52:write_data(56);break;
case 0x4a:write_data(57);break;
} */
/* if(ircode[2]==0x16)
write_data(48);
if(ircode[2]==0x0c)
write_data(49);
if(ircode[2]==0x18)
write_data(50); */
}
void irpros()
{
uchar k,i,j,value;
k=1; //第一个不用提取(引导码)
for(j=0;j<4;j++) //四个数据
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6)
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void main()
{
init_time0();
init_INT0();
init_LCD();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
display_LCD();
if(disp[7]==0x0F)
{
LED2=0;
delay(5000);
LED2=1;
}
}
}
}
void timer0() interrupt 1
{
irtime++; //红外时间
}
void int0() interrupt 0
{
if(startflag)
{
if(irtime>32)//检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;//标志红外接收完成
}
}
else
{
startflag=1;
irtime=0;
}
}
试试这代码可以不吧,不要用串口连接电脑,我是用液晶屏的。 |
|