弄不清楚为什么处理后的红外码液晶显示会是00 FF 数据码 数据码反码 而不是客服码、客服码、数据码、数据码反码
/*----------------------------------------------- 名称:遥控器红外解码液晶显示 但是------------------------------------------------*/ #include<reg52.h> #include<intrins.h> //包含NOP空指令函数_nop_()和位移函数 #include<stdio.h>
#define uchar unsigned char #define uint unsigned int #define Data P0
sbit RS=P2^4; sbit RW=P2^5; sbit E=P2^6; sbit Lock=P3^7; bit irok,irpro_ok;
char data TimeNum[]=" "; char data Test1[]=" "; uchar data Tab[]="0123456789ABCDEF"; /******************************************************************/ /* 变量声明 */ /******************************************************************/
uchar irtime; uchar ircode[4]; uchar irdata[33];
/******************************************************************/ /* 函数声明 */ /******************************************************************/ void Ir_work(void); void Ircordpro(void); void ShowString (unsigned char line,char *ptr);
/******************************************************************/ /* 定时器0中断服务函数 */ /******************************************************************/ void tim0_isr (void) interrupt 1 //定时器0中断服务函数 { irtime++; //用于计数2个下降沿之间的时间 }
/******************************************************************/ /* 外部中断0函数 */ /******************************************************************/ void ex0_isr (void) interrupt 0 //外部中断0服务函数 { static uchar i; static bit startflag; //是否开始处理标志位 if(startflag) { if(irtime>=25&irtime<60) //9ms+4.5ms { i=0; } irdata=irtime; irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } }
/******************************************************************/ /* 定时器0初始化 */ /******************************************************************/ void TIM0init(void)//定时器0初始化 {
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; }
/******************************************************************/ /* 外部中断初始化 */ /******************************************************************/ void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 }
/******************************************************************/ /* 红外键值处理 */ /******************************************************************/ void Ir_work(void) //红外键值散转程序 { TimeNum[5]=Tab[ircode[0]/16]; TimeNum[6]=Tab[ircode[0]%16];
TimeNum[8]=Tab[ircode[1]/16]; TimeNum[9]=Tab[ircode[1]%16];
TimeNum[11]=Tab[ircode[2]/16]; TimeNum[12]=Tab[ircode[2]%16];
TimeNum[14]=Tab[ircode[3]/16]; TimeNum[15]=Tab[ircode[3]%16]; ShowString(1,TimeNum);
} /******************************************************************/ /* 红外解码函数处理 */ /******************************************************************/ void Ircordpro(void)//红外码值处理函数 { uchar i,j,k,value,cord; k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { cord=irdata[k]; if(cord>5) { value=value|0x80; } else { value=value; } if(j<7) { value=value>>1; } k++; } ircode=value; value=0; } }
/******************************************************************/ /* 微秒延时函数 */ /******************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;/* Crystal frequency in 12MHz*/ while(--uscnt); }
/******************************************************************/ /* 毫秒函数声明 */ /******************************************************************/ void DelayMs(unsigned char ms)//delay Ms { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } }
/******************************************************************/ /* 写入命令函数 */ /******************************************************************/ void WriteCommand(unsigned char c) { DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; }
/******************************************************************/ /* 写入数据函数 */ /******************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; }
/******************************************************************/ /* 写入字节函数 */ /******************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第一行则命令代码高4位为0x8 WriteCommand (p);//写命令 WriteData (c); //写数据 }
/******************************************************************/ /* 写入字符串函数 */ /******************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 }
/******************************************************************/ /* 初始化函数 */ /******************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 }
/******************************************************************/ /* 主函数 */ /******************************************************************/ void main(void) { InitLcd(); TIM0init(); EX0init(); DelayMs(15); sprintf(Test1," my mcu "); ShowString(0,Test1); sprintf(TimeNum,"code "); ShowString(1,TimeNum);
while(1) { if(irok) { Ircordpro(); irok=0; irpro_ok=1; } if(irpro_ok) { Ir_work(); irpro_ok=0; } } }
|