微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用1602显示解码遥控器,程序出现乱码!求助。

用1602显示解码遥控器,程序出现乱码!求助。

时间:10-02 整理:3721RD 点击:
请大家帮我看看这个程序有什么问题。用1602显示解码遥控器。我运行的结果是显示乱码。

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar irtime;
  5. uchar startflag;
  6. uchar irdata[33];
  7. uchar bitnum;
  8. uchar irreceok;
  9. uchar ircode[4];
  10. uchar irprosok;
  11. uchar disp[8];
  12. //++++++++++++++++++++++++++++++++++++++++++++++++++
  13. //1602
  14. sbit rs=P2^6;
  15. sbit rw=P2^5;
  16. sbit e=P2^7;
  17. char i,j,k;
  18. void delay(char a)
  19. {
  20. for(k=0;k<a;k++)
  21. for(i=0;i<=110;i++);
  22. }
  23. void write(char r,char com)
  24. {
  25. rw=0;
  26. rs=r;
  27. P0=com;
  28. delay(1);
  29. e=1;
  30. delay(1);
  31. e=0;
  32. }
  33. void init()
  34. {
  35. e=0;
  36. write(0,0x38);
  37. write(0,0x0c);
  38. write(0,0x06);
  39. write(0,0x01);
  40. }//+++++++++++++++++++++++++++++++++++
  41. void timer0init(void)
  42. {
  43. TMOD=0x02;
  44. TH0=0x00;
  45. TL0=0x00;
  46. ET0=1;
  47. EA=1;
  48. TR0=1;

  49. }

  50. void int0init(void)
  51. {
  52. IT0=1;
  53. EX0=1;
  54. EA=1;
  55. }

  56. void irwork(void)
  57. {
  58. char i;
  59. disp[0]=ircode[0]/16;
  60. disp[1]=ircode[0]%16;
  61. disp[2]=ircode[1]/16;
  62. disp[3]=ircode[1]%16;
  63. disp[4]=ircode[2]/16;
  64. disp[5]=ircode[2]%16;
  65. disp[6]=ircode[3]/16;
  66. disp[7]=ircode[3]%16;
  67. for(i=0;i<8;i++)
  68. {
  69. if(disp<i>>9)
  70. disp<i>=disp<i>+0x37;//实验
  71. else
  72.   disp<i>=disp<i>+0x30;
  73.   }  
  74. }


  75. void irpros(void)  //0x1c
  76. {
  77. uchar k,i,j;
  78. uchar value;
  79. k=1;
  80. for(j=0;j<4;j++)
  81. {
  82. for(i=0;i<8;i++)
  83.   {
  84.    value=value>>1;   //7
  85.    if(irdata[k]>6)   //8
  86.    {
  87.     value=value | 0x80;
  88.    }
  89.    k++;
  90.   }
  91.   ircode[j]=value;
  92. }
  93. irprosok=1;
  94. }

  95. void main()
  96. {
  97. char i;
  98. timer0init();
  99. int0init();
  100.   if(irreceok)
  101.   {
  102.    irpros();
  103.    irreceok=0;
  104.   }
  105.   if(irprosok)
  106.   {
  107.    irwork();
  108.    irprosok=0;
  109.   }
  110. init();
  111. write(0,0x80);
  112. for(i=0;i<8;i++)
  113. {
  114. write(1,disp<i>);
  115. }
  116. while(1);

  117. }

  118. void timer0 () interrupt 1
  119. {
  120. irtime++; //255
  121. }

  122. void int0 () interrupt 0
  123. {
  124. if(startflag)
  125. {
  126.   if(irtime>52) //检测引导码
  127.   {
  128.     bitnum=0;
  129.   }
  130.   irdata[bitnum]=irtime;
  131.   irtime=0;
  132.   bitnum++;
  133.   if(bitnum==33)
  134.   {
  135.    bitnum=0;
  136.    irreceok=1;

  137.   }

  138. }
  139. else
  140. {
  141.   startflag=1;
  142.   irtime=0;
  143. }
  144. }</i></i></i></i></i></i>

复制代码


采集
采集

亲 可以把注释给写下来吗?  看起来很费力了

OK我小改后 变成数据显示成功但是 同一个键按多次会有不同的值。请大家看看。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar irtime;
uchar startflag;
uchar irdata[33];
uchar bitnum;
uchar irreceok;
uchar ircode[4];
uchar irprosok;
uchar disp[8];
//++++++++++++++++++++++++++++++++++++++++++++++++++
//1602
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
char i,j,k;
void delay(char a)//延时
{
for(k=0;k<a;k++)
for(i=0;i<=110;i++);
}
void write(char r,char com)//1602写控制码和数据
{
rw=0;
rs=r;
P0=com;
delay(1);
e=1;
delay(1);
e=0;
}
void init()//1602初始化
{
e=0;
write(0,0x38);
write(0,0x0c);
write(0,0x06);
write(0,0x01);
}
//+++++++++++++++++++++++++++++++++++
void timer0init(void)//定时器0初始化
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
void int0init(void)//外部中断初始化
{
IT0=1;
EX0=1;
EA=1;
}
void irwork(void)//将2进制转化为16进制 并把高位和地位分开转化为ASCII码
{
char i;
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;
for(i=0;i<8;i++)
{
if(disp[i]>9)
disp[i]=disp[i]+0x37;
else
  disp[i]=disp[i]+0x30;
  }  
}

void irpros(void)  //通过检测时间长度 判断电平 并存在数组里
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
  {
   value=value>>1;   //7
   if(irdata[k]>6)   //8
   {
    value=value | 0x80;
   }
   k++;
  }
  ircode[j]=value;
}
irprosok=1;//完成标志物
}
void main()
{
char i;
timer0init();
int0init();
while(1)
{
  if(irreceok)//电平提取完
  {
   irpros();
   irreceok=0;
  }
  if(irprosok)//数据转化完成
  {
   irwork();
   irprosok=0;
  }
init();
write(0,0x80);
for(i=0;i<8;i++)
{
write(1,disp[i]);
}
}
  
}
void timer0 () interrupt 1//定时器0中断
{
irtime++; //检测电平持续时间
}
void int0 () interrupt 0//外部中断 下降沿促发
{
if(startflag)//开始标志物(不重要)
{
  if(irtime>52) //检测引导码
  {
    bitnum=0;
  }
  irdata[bitnum]=irtime;//存储各电平时间
  irtime=0;
  bitnum++;
  if(bitnum==33)//全部数据接受完
  {
   bitnum=0;
   irreceok=1;//完成标志物
  }
}
else
{
  startflag=1;
  irtime=0;
}
}

  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top