#include\x0d\x0a#include\x0d\x0a#define uchar unsigned char\x0d\x0a#define uint unsigned int\x0d\x0asbit lcden = P2^7\x0d\x0asbit lcdrs = P2^6\x0d\x0asbit lcdwr = P2^5\x0d\x0asbit IR = P3^2\x0d\x0auchar IRCOM[6]//数组,用于存储红外编码\x0d\x0auchar code table1[] = "remote control"\x0d\x0auchar code table2[] = "CODE:"\x0d\x0avoid delayms(uchar x)// 延时x*0.14ms\x0d\x0a{\x0d\x0auchar i\x0d\x0awhile(x--)\x0d\x0afor(i=0i//延时xms\x0d\x0a{\x0d\x0auchar i,j\x0d\x0afor(i=xi>0i--)\x0d\x0afor(j=110j>0j--)\x0d\x0a}\x0d\x0a/****************************LCD部分***********************************************/\x0d\x0avoid write_com(uchar com)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 0\x0d\x0alcdwr = 0\x0d\x0aP0 = com\x0d\x0adelay(5)\x0d\x0alcden = 1\x0d\x0adelay(5)\x0d\x0alcden = 0//别忘了lcden拉低\x0d\x0a}\x0d\x0avoid write_date(uchar date)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 1\x0d\x0alcdwr = 0\x0d\x0aP0 = date\x0d\x0adelay(5)\x0d\x0alcden = 1\x0d\x0adelay(5)\x0d\x0alcden = 0\x0d\x0a}\x0d\x0avoid lcd_init(void)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 0\x0d\x0alcdwr = 0\x0d\x0adelay(5)\x0d\x0awrite_com(0x38)\x0d\x0awrite_com(0x0c)\x0d\x0awrite_com(0x06)\x0d\x0awrite_com(0x01)\x0d\x0a}\x0d\x0a/*****************main()************************/\x0d\x0avoid main(void)\x0d\x0a{\x0d\x0auchar count=0\x0d\x0aIR = 1\x0d\x0alcd_init()\x0d\x0awrite_com(0x80)\x0d\x0awhile(table1[count]!='\0')\x0d\x0a{\x0d\x0awrite_date(table1[count])\x0d\x0acount++\x0d\x0adelay(5)\x0d\x0a}\x0d\x0acount = 0\x0d\x0awrite_com(0x80+0x40)\x0d\x0awhile(table2[count]!='\0')\x0d\x0a{\x0d\x0awrite_date(table2[count])\x0d\x0acount++\x0d\x0adelay(5)\x0d\x0a}\x0d\x0a\x0d\x0aIE = 0x81//开中断\x0d\x0aTCON = 0x01//脉冲负边沿触发\x0d\x0awhile(1)\x0d\x0a\x0d\x0a}\x0d\x0a/*********************红外中断**************************/\x0d\x0avoid IR_time() interrupt 0 \x0d\x0a{\x0d\x0auchar i,j,TimeNum=0//TimeNum用来计IR高电平次数 从而判断是0还是1\x0d\x0aEX0 = 0//关闭中断\x0d\x0adelayms(5)\x0d\x0aif(1 == IR)\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0awhile(!IR) //
跳过9ms
前导低电平\x0d\x0adelayms(1)\x0d\x0afor(i=0i{\x0d\x0afor(j=0j{\x0d\x0awhile(IR) //跳过4.5ms的前导高电平\x0d\x0adelayms(1)\x0d\x0awhile(!IR) //跳过0.56ms的低电平\x0d\x0adelayms(1)\x0d\x0a\x0d\x0awhile(IR) \x0d\x0a{\x0d\x0aTimeNum++//计时高电平时间从而判断读取
的是0还是1\x0d\x0adelayms(1)\x0d\x0a}\x0d\x0aif(TimeNum>=30)//按键按下时间过长 跳过\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0aIRCOM[i] = IRCOM[i]>>1\x0d\x0aif(TimeNum >= 8) //8*0.14ms 这时读取的是1;\x0d\x0a{\x0d\x0aIRCOM[i] = IRCOM[i]|0x80\x0d\x0a}\x0d\x0aTimeNum = 0\x0d\x0a}\x0d\x0a}\x0d\x0aif(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0aIRCOM[4] = IRCOM[2]&0x0f//取低四位\x0d\x0aIRCOM[5] = IRCOM[2]>>4//IRCOM[5]取IRCOM[2]高四位\x0d\x0aif(IRCOM[4] >9) //转换成字符\x0d\x0a{\x0d\x0aIRCOM[4] = IRCOM[4] + 0x37\x0d\x0a}\x0d\x0aelse\x0d\x0aIRCOM[4] = IRCOM[4] + 0x30\x0d\x0aif(IRCOM[5] >9)\x0d\x0a{\x0d\x0aIRCOM[5] = IRCOM[5] + 0x37\x0d\x0a}\x0d\x0aelse\x0d\x0aIRCOM[5] = IRCOM[5] + 0x30\x0d\x0adelay(5)\x0d\x0awrite_com(0x80 + 0x40 + 5)\x0d\x0awrite_date(IRCOM[5])\x0d\x0awrite_date(IRCOM[4])\x0d\x0aEX0 = 1//重新开启外部中断\x0d\x0a}#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7
sbit lcdrs = P2^6
sbit lcdwr = P2^5
sbit IR = P3^2
uchar IRCOM[6]//数组,用于存储红外编码
uchar code table1[] = "remote control"
uchar code table2[] = "CODE:"
void delayms(uchar x)// 延时x*0.14ms
{
uchar i
while(x--)
for(i=0i<13i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j
for(i=xi>0i--)
for(j=110j>0j--)
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0
lcdrs = 0
lcdwr = 0
P0 = com
delay(5)
lcden = 1
delay(5)
lcden = 0 //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0
lcdrs = 1
lcdwr = 0
P0 = date
delay(5)
lcden = 1
delay(5)
lcden = 0
}
void lcd_init(void)
{
lcden = 0
lcdrs = 0
lcdwr = 0
delay(5)
write_com(0x38)
write_com(0x0c)
write_com(0x06)
write_com(0x01)
}
/*****************main()************************/
void main(void)
{
uchar count=0
IR = 1
lcd_init()
write_com(0x80)
while(table1[count]!='\0')
{
write_date(table1[count])
count++
delay(5)
}
count = 0
write_com(0x80+0x40)
while(table2[count]!='\0')
{
write_date(table2[count])
count++
delay(5)
}
IE = 0x81//开中断
TCON = 0x01//脉冲负边沿触发
while(1)
}
/*********************红外中断**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0//关闭中断
delayms(5)
if(1 == IR)
{
EX0 = 1
return
}
while(!IR) //跳过9ms前导低电平
delayms(1)
for(i=0i<4i++)
{
for(j=0j<8j++)
{
while(IR) //跳过4.5ms的前导高电平
delayms(1)
while(!IR) //跳过0.56ms的低电平
delayms(1)
while(IR)
{
TimeNum++//计时高电平时间从而判断读取的是0还是1
delayms(1)
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1
return
}
IRCOM[i] = IRCOM[i]>>1
if(TimeNum >= 8) //8*0.14ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80
}
TimeNum = 0
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1
return
}
IRCOM[4] = IRCOM[2]&0x0f//取低四位
IRCOM[5] = IRCOM[2]>>4 //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] >9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37
}
else
IRCOM[4] = IRCOM[4] + 0x30
if(IRCOM[5] >9)
{
IRCOM[5] = IRCOM[5] + 0x37
}
else
IRCOM[5] = IRCOM[5] + 0x30
delay(5)
write_com(0x80 + 0x40 + 5)
write_date(IRCOM[5])
write_date(IRCOM[4])
EX0 = 1//重新开启外部中断
}
评论列表(0条)