完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
单片机红外解码lcd显示 红外接收头是HS0038
第一个是在串口调试助手上显示的可以显示出来 第二个在lcd上显示不能显示出来,不知道为什么呀,有没有大神帮助一下呀 串口这个是可以的 #include #define uchar unsigned char #define uint unsigned int ***it HY=P3^3; uchar HY_code[4]; //数据存储 uint HY_getlow() { TH0=0; TL0=0; TR0=1; while(!HY&&(TH0&0x80)==0); TR0=0; return (TH0*256+TL0); } uint HY_gethigh() //每加一个数的时间是一个时钟周期 { //时间为temp乘以1.085us TH0=0; TL0=0; TR0=1; while(HY&&(TH0&0x80)==0); TR0=0; return (TH0*256+TL0); } void uart_init() { TMOD=0x21; SM0=0; SM1=1; TH1=0xfd; TL1=0xfd; TR1=1; } void uart_send(uchar dat) { SBUF=dat; while(ti==0); //等待数据发送完成 TI=0; } void main() { uint temp; uchar i,j; uart_init(); while(1) { start: while(HY); temp=HY_getlow(); //检测9ms的起始码 低电平 if((temp<7833)||(temp>8755)) // 8500-9500us goto start; temp=HY_gethigh(); //检测4.5的结束码 高电平 if((temp<3686)||(temp>4608)) //4000-5000us goto start; for(i=0;i<4;i++) { for(j=0;j<8;j++) { temp=HY_getlow(); if((temp<184)||(temp>737)) //200-800us goto start; temp=HY_gethigh(); if((temp<184)||(temp>1843)) //200-2000us goto start; HY_code[i]=HY_code[i]>>1; if(temp>1032) //1120us HY_code[i]=HY_code[i]|0x80; } } uart_send(HY_code[0]); uart_send(HY_code[1]); uart_send(HY_code[2]); uart_send(HY_code[3]); } } 但是lcd的不知道为什么显示不出来呀?求指教呀 #include #define uchar unsigned char #define uint unsigned int ***it HY=P3^3; ***it lcdrs=P2^5; ***it lcdrw=P2^6; ***it lcden=P2^7; uchar temp_code[2]; uchar LCD_ID_1[16] = {"Red Control"}; uchar LCD_ID_2[16] = {"IR CODE:--H"}; uchar HY_code[4]; //数据存储 uint HY_getlow() { TH0=0; TL0=0; TR0=1; while(!HY&&(TH0&0x80)==0); TR0=0; return (TH0*256+TL0); } uint HY_gethigh() //每加一个数的时间是一个时钟周期 { //时间为temp乘以1.085us TH0=0; TL0=0; TR0=1; while(HY&&(TH0&0x80)==0); TR0=0; return (TH0*256+TL0); } void delay1(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { lcdrw=0; lcdrs=0; lcden=0; P0=com; delay1(5); lcden=1; delay1(5); lcden=0; } void write_date(uchar date) { lcdrw=0; lcdrs=1; lcden=0; P0=date; delay1(5); lcden=1; delay1(5); lcden=0; } void lcd_init() { uchar i; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(i=0;i<11;i++) { write_date(LCD_ID_1[i]); } write_com(0x80+0x40); for(i=0;i<11;i++) { write_date(LCD_ID_2[i]); } } void main() { uint temp; uchar i,j; lcd_init(); while(1) { start: while(HY); temp=HY_getlow(); //检测9ms的起始码 低电平 if((temp<7833)||(temp>8755)) // 8500-9500us goto start; temp=HY_gethigh(); //检测4.5的结束码 高电平 if((temp<3686)||(temp>4608)) //4000-5000us goto start; for(i=0;i<4;i++) { for(j=0;j<8;j++) { temp=HY_getlow(); if((temp<184)||(temp>737)) //200-800us goto start; temp=HY_gethigh(); if((temp<184)||(temp>1843)) //200-2000us goto start; HY_code[i]=HY_code[i]>>1; if(temp>1032) //1120us HY_code[i]=HY_code[i]|0x80; } } temp_code[0]=HY_code[2]&0x0f; temp_code[1]=HY_code[2]>>4; if(temp_code[0]>9) {temp_code[0]=temp_code[0]+0x37;} else {temp_code[0]=temp_code[0]+0x30;} if(temp_code[1]>9) {temp_code[1]=temp_code[1]+0x37;} else {temp_code[1]=temp_code[1]+0x30;} write_com(0x80+0x40+8); write_date(temp_code[1]); write_date(temp_code[0]); } } |
|
相关推荐
10个回答
|
|
各位大神小弟实在是不知道哪里错了,编译也没错误呀,求指点呀
|
|
|
|
直接从程序里面送个字符出来显示行不,找显示程序的原因
|
|
|
|
|
|
|
|
刚刚下错了,确实不能显示字符,但是显示部分我换了一个程序发现没有问题,问题好像就是执行不到显示部分,不知道是哪里除了问题 |
|
|
|
|
|
|
|
支持分享
|
|
|
|
好东西,谢谢楼主分享
|
|
|
|
感谢楼主分享..........
|
|
|
|
{:9:}
|
|
|
|
这是我学到的一个 可能红外模块不一样 但是原理都差不多 希望对你有帮助 建议楼主把处理函数都弄成子程序 免得主函数太多 容易看不出问题 #include #include #define uchar unsigned char #define uint unsigned int uchar LCD_ID_1[16] = {"Red Control"}; uchar LCD_ID_2[16] = {"IR CODE:--H"}; void delay(uchar x); //x*0.14MS void delay1(int ms); void beep(); ***it IRIN = P3^3; //红外接收器数据线 uchar IRCOM[7]; ***it E=P2^7; //1602使能引脚 ***it RW=P2^6; //1602读写引脚 ***it RS=P2^5; //1602数据/命令选择引脚 /******************************************************************** * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Delay2() { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++) ; } /******************************************************************** * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void enable(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; Delay2(); E = 1; Delay2(); } /******************************************************************** * 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write(uchar del) { P0 = del; RS = 1; RW = 0; E = 0; Delay2(); E = 1; Delay2(); } /******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void L1602_init(void) { enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == ' |