微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 12864显示完文字后,出现了一系列乱码,求救

12864显示完文字后,出现了一系列乱码,求救

时间:10-02 整理:3721RD 点击:

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define LCD12864_DATAPORT P0          //数据IO口
  5. sbit LCD12864_RS  =  P2^6;             //(数据命令)寄存器选择输入
  6. sbit LCD12864_RW  =  P2^5;             //液晶读/写控制
  7. sbit LCD12864_EN  =  P2^7;             //液晶使能控制
  8. sbit LCD12864_PSB =  P3^2;             //串/并方式控制
  9. sbit LCD12864_RST =  P3^4;                           //复位端
  10. void LCD12864_Delay1ms(uint c);
  11. uchar LCD12864_Busy(void);
  12. void LCD12864_WriteCmd(uchar cmd);
  13. void LCD12864_WriteData(uchar dat);
  14. void LCD12864_Init();
  15. void LCD12864_ClearScreen(void);
  16. void LCD12864_SetWindow(uchar x, uchar y);
  17. unsigned char code CharCode[]={"学习"};
  18. void main()
  19. {
  20.         unsigned char i,j;
  21.         LCD12864_Init();
  22.         LCD12864_SetWindow(0, 0);
  23.         LCD12864_Delay1ms(10);
  24.         while(1)
  25.         {       
  26.                    for(i=0;i<4;i++)
  27.                    {
  28.                      for(j=0;j<16;j++)
  29.                     {
  30.                        LCD12864_WriteData(CharCode[i*16+j]);
  31.                     }
  32.            }
  33.          while(1);
  34.     }         
  35. }
  36.                
  37.                


  38. void LCD12864_Delay1ms(uint c)
  39. {
  40.     uchar a,b;
  41.         for(; c>0; c--)
  42.         {
  43.             for(b=199; b>0; b--)
  44.                 {
  45.                 for(a=1; a>0; a--);
  46.                 }
  47.         }
  48. }

  49. /*******************************************************************************
  50. * 函 数 名         : LCD12864_Busy
  51. * 函数功能                   : 检测LCD是否忙
  52. * 输    入         : 无
  53. * 输    出         : 1或0(1表示不忙,0表示忙)
  54. *******************************************************************************/

  55. uchar LCD12864_Busy(void)
  56. {
  57.         uchar i = 0;

  58.         LCD12864_RS = 0;           //选择命令
  59.         LCD12864_RW = 1;        //选择读取

  60.         LCD12864_EN = 1;
  61.         LCD12864_Delay1ms(1);

  62.         while((LCD12864_DATAPORT & 0x80) == 0x80)        //检测读取到的值
  63.         {
  64.                 i++;
  65.                 if(i > 100)
  66.                 {
  67.                         LCD12864_EN = 0;
  68.                         return 0;           //超过等待时间返回0表示失败
  69.                 }
  70.         }

  71.         LCD12864_EN = 0;

  72.         return 1;
  73. }

  74. /*******************************************************************************
  75. * 函 数 名         : LCD12864_WriteCmd
  76. * 函数功能                   : 写命令
  77. * 输    入         : cmd
  78. * 输    出         : 无
  79. *******************************************************************************/

  80. void LCD12864_WriteCmd(uchar cmd)
  81. {
  82.         uchar i;
  83.         i = 0;
  84.         while( LCD12864_Busy() == 0)
  85.         {
  86.                 LCD12864_Delay1ms(1);
  87.                 i++;
  88.                 if( i>100)
  89.                 {
  90.                         return;           //超过等待退出
  91.                 }       
  92.         }
  93.        
  94.         LCD12864_RS = 0;     //选择命令
  95.         LCD12864_RW = 0;     //选择写入
  96.         LCD12864_EN = 0;     //初始化使能端

  97.         LCD12864_DATAPORT = cmd;   //放置数据

  98.         LCD12864_EN = 1;                   //写时序
  99.         LCD12864_Delay1ms(5);
  100.         LCD12864_EN = 0;                                           
  101. }

  102. /*******************************************************************************
  103. * 函 数 名         : LCD12864_WriteData
  104. * 函数功能                   : 写数据
  105. * 输    入         : dat
  106. * 输    出         : 无
  107. *******************************************************************************/

  108. void LCD12864_WriteData(uchar dat)
  109. {
  110.         uchar i;
  111.         i = 0;
  112.         while( LCD12864_Busy() == 0)
  113.         {
  114.                 LCD12864_Delay1ms(1);
  115.                 i++;
  116.                 if( i>100)
  117.                 {
  118.                         return;           //超过等待退出
  119.                 }       
  120.         }

  121.         LCD12864_RS = 1;     //选择数据
  122.         LCD12864_RW = 0;     //选择写入
  123.         LCD12864_EN = 0;     //初始化使能端

  124.         LCD12864_DATAPORT = dat;   //放置数据

  125.         LCD12864_EN = 1;                   //写时序
  126.         LCD12864_Delay1ms(500);
  127.         LCD12864_EN = 0;                                                                   
  128. }

  129. /*******************************************************************************
  130. * 函 数 名         : LCD12864_ReadData
  131. * 函数功能                   : 读取数据
  132. * 输    入         : 无
  133. * 输    出         : 读取到的8位数据
  134. *******************************************************************************/


  135. uchar LCD12864_ReadData(void)
  136. {
  137.         uchar i, readValue;

  138.         i = 0;
  139.         while( LCD12864_Busy() == 0)
  140.         {
  141.                 LCD12864_Delay1ms(1);
  142.                 i++;
  143.                 if( i>100)
  144.                 {
  145.                         return 0;           //超过等待退出
  146.                 }       
  147.         }

  148.         LCD12864_RS = 1;       //选择命令
  149.         LCD12864_RW = 1;
  150.         LCD12864_EN = 0;
  151.         LCD12864_Delay1ms(1);  //等待

  152.         LCD12864_EN = 1;
  153.         LCD12864_Delay1ms(1);
  154.         readValue = LCD12864_DATAPORT;
  155.         LCD12864_EN = 0;

  156.         return readValue;
  157. }


  158. /*******************************************************************************
  159. * 函 数 名         : LCD12864_Init
  160. * 函数功能                   : 初始化LCD12864
  161. * 输    入         : 无
  162. * 输    出         : 无
  163. *******************************************************************************/

  164. void LCD12864_Init()
  165. {
  166.         LCD12864_PSB = 1;          //选择并行输入
  167.         LCD12864_RST = 1;          //复位

  168.         LCD12864_WriteCmd(0x30);  //选择基本指令操作
  169.         LCD12864_WriteCmd(0x0c);  //显示开,关光标
  170.         LCD12864_WriteCmd(0x01);  //清除LCD12864的显示内容
  171. }

  172. /*******************************************************************************
  173. * 函 数 名         : LCD12864_ClearScreen
  174. * 函数功能                   : 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一个清
  175. *                  * 屏函数
  176. * 输    入         : 无
  177. * 输    出         : 无
  178. *******************************************************************************/


  179. void LCD12864_ClearScreen(void)
  180. {
  181.         uchar i,j;

  182.         LCD12864_WriteCmd(0x34);          //开启拓展指令集

  183.         for(i=0;i<32;i++)                          //因为LCD有纵坐标32格所以写三十二次
  184.         {
  185.                 LCD12864_WriteCmd(0x80+i);                  //先写入纵坐标Y的值
  186.                 LCD12864_WriteCmd(0x80);                  //再写入横坐标X的值
  187.                 for(j=0;j<32;j++)                  //横坐标有16位,每位写入两个字节的的数据,也
  188.                 {                                                  //就写入32次以为当写入两个字节之后横坐标会自
  189.                         LCD12864_WriteData(0xFF);          //动加1,所以就不用再次写入地址了。
  190.                 }
  191.         }

  192.         LCD12864_WriteCmd(0x36);         //0x36扩展指令里面打开绘图显示
  193.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  194. }


  195. /*******************************************************************************
  196. * 函 数 名         : LCD12864_SetWindow
  197. * 函数功能                   : 设置在基本指令模式下设置显示坐标。注意:x是设置行,y是设置列
  198. * 输    入         : x, y
  199. * 输    出         : 无
  200. *******************************************************************************/

  201. void LCD12864_SetWindow(uchar x, uchar y)
  202. {
  203.         uchar pos;

  204.         if(x == 0)           // 第一行的地址是80H
  205.         {
  206.                 x = 0x80;
  207.         }
  208.                
  209.         else if(x == 1)  //第二行的地址是90H
  210.         {
  211.                 x = 0x90;       
  212.         }
  213.        
  214.         else if(x == 2)  //第三行的地址是88H
  215.         {
  216.                 x = 0x88;
  217.         }
  218.        
  219.         else if(x == 3)
  220.         {
  221.                 x = 0x98;
  222.         }
  223.        
  224.         pos = x + y;
  225.         LCD12864_WriteCmd(pos);
  226. }

复制代码









CharCode[]={"学习"}; 你定义的这个数组只有四个字符,而你后面写的程序 LCD12864_WriteData(CharCode[i*16+j]);中超过了四个字节啊!这肯定会乱码的

完全正确,多谢大神的帮助。

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

网站地图

Top