微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 12864液晶屏8线正常,4线无显示,程序如下

12864液晶屏8线正常,4线无显示,程序如下

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

  1. #define LCD12864_Send4bitDataHigh(X) LCD12864_DATA_PORT &= 0x0f; LCD12864_DATA_PORT |= (X&0xF0); /* 4线模式IO高4位控制,先将高四位置低,再写入数据的高四位 */
  2. #define LCD12864_Send4bitDataLow(X)  LCD12864_DATA_PORT &= 0x0f; LCD12864_DATA_PORT |= (X<<4); /* 写入数据的低四位 */
  3. /************************************************************************/
  4. /*         The functions below are defined for internal use             */
  5. /*      these functions should not be declared in the head file         */
  6. /************************************************************************/
  7. /****************************************************************************************
  8. * FUNCTION NAME: LCD12864_WaitForReady
  9. * DESCRIPTION: LCD12864 busy wait
  10. ****************************************************************************************/
  11. static void LCD12864_WaitForReady(void)
  12. {
  13.         LCD12864_RS_CLR;
  14.         LCD12864_RW_SET;        /* 进入读指令状态 */
  15.         LCD12864_EN_SET;        /* EN保持高电平,读操作 */
  16.                
  17.         while(1)
  18.         {
  19.                 Delay10US12T(2);
  20.                 if(LCD12864_BF == FALSE)
  21.                 break;
  22.         }
  23.        
  24.         LCD12864_EN_CLR;
  25. }
  26. /****************************************************************************************
  27. * FUNCTION NAME: LCD12864_WriteCMD
  28. * DESCRIPTION: write command to LCD12864
  29. ****************************************************************************************/
  30. static void LCD12864_WriteCMD(uchar command)
  31. {
  32.         LCD12864_RS_CLR;
  33.         LCD12864_RW_CLR;        /* 进入写指令状态 */

  34. #if _12864_MODE==_12864_8bit        /* 8线模式一次性写入 */
  35.         LCD12864_EN_SET;        /* EN保持高电平 */
  36.         LCD12864_SendData(command);        /* 写入指令 */
  37.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */
  38. #elif _12864_MODE==_12864_4bit        /* 4线模式分高低4bits写入 */
  39.         LCD12864_EN_SET;        /* EN保持高电平 */
  40.         LCD12864_Send4bitDataHigh(command);        /* 写入指令 */
  41.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */

  42.         LCD12864_EN_SET;        /* EN保持高电平 */
  43.         LCD12864_Send4bitDataLow(command);        /* 写入指令 */
  44.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */
  45. #endif
  46. }
  47. /****************************************************************************************
  48. * FUNCTION NAME: LCD12864_WriteData
  49. * DESCRIPTION: write data to LCD12864
  50. ****************************************************************************************/
  51. static void LCD12864_WriteData(uchar dat)
  52. {
  53.         LCD12864_RS_SET;
  54.         LCD12864_RW_CLR;        /* 进入写数据状态 */

  55. #if _12864_MODE==_12864_8bit        /*  */
  56.         LCD12864_EN_SET;        /* EN保持高电平 */
  57.         LCD12864_SendData(dat);        /* 写入数据 */
  58.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */
  59. #elif _12864_MODE==_12864_4bit        /*  */
  60.         LCD12864_EN_SET;        /* EN保持高电平 */
  61.         LCD12864_Send4bitDataHigh(dat);        /* 写入数据 */
  62.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */

  63.         LCD12864_EN_SET;        /* EN保持高电平 */
  64.         LCD12864_Send4bitDataLow(dat);        /* 写入数据 */
  65.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */
  66. #endif
  67. }
  68. /****************************************************************************************
  69. * FUNCTION NAME: LCD12864_Set_Cursor
  70. * DESCRIPTION: locate cursor, Col:column, Ln:line
  71. ****************************************************************************************/
  72. static void LCD12864_Set_Cursor(uchar Ln, uchar Col)
  73. {
  74.         Ln &= 0x03;        /* 行标溢出防止,行标:0~3 */
  75.         Col &= 0x07;        /* 列标溢出防止,列标:0~7 */
  76.         switch(Ln)
  77.         {
  78.                 case 0x00: Col+=LCD12864_Line1; break;//第一行
  79.                 case 0x01: Col+=LCD12864_Line2; break;//第二行
  80.                 case 0x02: Col+=LCD12864_Line3; break;//第三行
  81.                 case 0x03: Col+=LCD12864_Line4; break;//第四行
  82.                 default : break;
  83.         }
  84.         LCD12864_WriteCMD(Col);/* 写入光标地址 */
  85.         LCD12864_WaitForReady();
  86. }

  87. /************************************************************************/
  88. /*         The functions below are defined for external use             */
  89. /*        these functions should be declared in the head file           */
  90. /************************************************************************/
  91. /****************************************************************************************
  92. * FUNCTION NAME: LCD12864_Init
  93. * DESCRIPTION: initialize the LCD12864 module
  94. ****************************************************************************************/
  95. extern void LCD12864_Init(void)
  96. {
  97.         DelayMs12T(50); //延时>40ms
  98.         LCD12864_PSB_SET; //并行口
  99.         //复位操作
  100.         LCD12864_RST_SET;DelayMs12T(1);
  101.         LCD12864_RST_CLR;DelayMs12T(1);
  102.         LCD12864_RST_SET;DelayMs12T(1);
  103. #if _12864_MODE==_12864_8bit        /*  */
  104.         //功能设定
  105.         LCD12864_WriteCMD(0x30); //设置为8位并行口,基本指令集
  106.         Delay10US12T(11);//at least 100us
  107.         LCD12864_WriteCMD(0x30); //再次设置为8位并行口,基本指令集
  108.         Delay10US12T(4);//at least 37us
  109.         LCD12864_WriteCMD(0x0c); //开显示
  110.         Delay10US12T(11);//at least 100us
  111.         LCD12864_WriteCMD(0x01);  //清除显示
  112.         DelayMs12T(11);//at least 10ms
  113.         LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
  114. #elif _12864_MODE==_12864_4bit        /*  */
  115.         //功能设定
  116.         LCD12864_EN_SET;        /* EN保持高电平 */
  117.         LCD12864_DATA_PORT=0x20;        /* 8位并口写入指令 */
  118.         LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */
  119.         Delay10US12T(11);//at least 100us
  120.         LCD12864_WriteCMD(0x20); //设置为4位并行口,基本指令集
  121.         Delay10US12T(11);//at least 100us
  122.         LCD12864_WriteCMD(0x0c);  //开显示
  123.         Delay10US12T(11);//at least 100us
  124.         LCD12864_WriteCMD(0x01); //清除显示
  125.         DelayMs12T(11);//at least 10ms
  126.         LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
  127. #endif
  128. }
  129. /****************************************************************************************
  130. * FUNCTION NAME: LCD12864_Clear_Screen
  131. * DESCRIPTION: Clear Screen
  132. ****************************************************************************************/
  133. extern void LCD12864_Clear_Screen(void)
  134. {
  135.         LCD12864_WaitForReady();
  136.         LCD12864_WriteCMD(LCD12864_CLS);
  137.         LCD12864_WaitForReady();
  138. }
  139. /****************************************************************************************
  140. * FUNCTION NAME: LCD12864_DisplayChar
  141. * DESCRIPTION: display one char, Ln:line, Col:column
  142. ****************************************************************************************/
  143. extern void LCD12864_DisplayChar(uchar Ln, uchar Col ,uchar Dat)
  144. {
  145.         LCD12864_Set_Cursor(Ln, Col);
  146.         LCD12864_WriteData(Dat);
  147. }
  148. /****************************************************************************************
  149. * FUNCTION NAME: LCD12864_DisplayString
  150. * DESCRIPTION: display string, Ln:line, Col:column
  151. ****************************************************************************************/
  152. extern void LCD12864_DisplayString(uchar Ln,uchar Col,char *pStr)
  153. {
  154.         LCD12864_Set_Cursor(Ln,Col);
  155.         while(*pStr)
  156.         {
  157.                 LCD12864_WaitForReady();
  158.                 LCD12864_WriteData(*pStr++);
  159.         }
  160. }

复制代码


如果#define _12864_MODE                _12864_8bit        /* 此处修改12864使用4线或8线控制 */
则正常显示字符和字符串,
如果#define _12864_MODE                _12864_4bit        /* 此处修改12864使用4线或8线控制 */
则上电无显示,关于4线模式上电初始化的操作尝试了很多配置和时序(上面是按照datasheet配置),都无法正常工作,请各位看看是初始化问题?还是4线模式数据传输有问题?还是别的问题?多谢!

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

网站地图

Top