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

2020-01-22 12:13发布

  1. /************************************************************************/
  2. /*         The functions below are defined for internal use             */
  3. /*      these functions should not be declared in the head file         */
  4. /************************************************************************/
  5. /****************************************************************************************
  6. * FUNCTION NAME: LCD12864_WaitForReady
  7. * DESCRIPTION: LCD12864 busy wait
  8. ****************************************************************************************/
  9. static void LCD12864_WaitForReady(void)
  10. {
  11.         LCD12864_RS_CLR;
  12.         LCD12864_RW_SET;        /* 进入读指令状态 */
  13.         LCD12864_EN_SET;        /* EN保持高电平,读操作 */
  14.                
  15.         while(1)
  16.         {
  17.                 Delay10US12T(2);
  18.                 if(LCD12864_BF == FALSE)
  19.                 break;
  20.         }
  21.        
  22.         LCD12864_EN_CLR;
  23. }
  24. /****************************************************************************************
  25. * FUNCTION NAME: LCD12864_WriteCMD
  26. * DESCRIPTION: write command to LCD12864
  27. ****************************************************************************************/
  28. static void LCD12864_WriteCMD(uchar command)
  29. {
  30.         LCD12864_RS_CLR;
  31.         LCD12864_RW_CLR;        /* 进入写指令状态 */

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

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

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

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

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

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

另外:
  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);        /* 写入数据的低四位 */
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wxdn
1楼-- · 2020-01-22 13:20
 精彩回答 2  元偷偷看……
zya311
2楼-- · 2020-01-22 15:27
wxdn 发表于 2014-8-20 09:50
会不会是屏不支持这种驱动方式?

昨天把4线的初始化改成这样:
  1.         LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
  2.         LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
  3.         LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
  4.         Delay10US12T(11);//at least 100us
  5.        
  6.         LCD12864_WriteCMD(0x02); //设置为4位并行口,基本指令集
  7.         Delay10US12T(11);//at least 100us
  8.         LCD12864_WriteCMD(0x0c);  //开显示
  9.         Delay10US12T(11);//at least 100us
  10.         LCD12864_WriteCMD(0x01); //清除显示
  11.         DelayMs12T(11);//at least 10ms
  12.         LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
  13.         DelayMs12T(11);//at least 10ms
复制代码
是按照这个帖子http://www.amobbs.com/thread-5139572-1-1.html里面最后一人留言的方式配置,能够显示上半屏的数据,但是不完整,下半屏数据不显示,而且不稳定,有时上电会出现花屏的现象,然后在此基础上又尝试了不同的时序,结果就上面这样还强一些
可惜上面帖子里的那位没有说的很具体,继续各种尝试吧
ljuneLCD
3楼-- · 2020-01-22 19:01
屏本身就可能没有4BIT 的模式
zya311
4楼-- · 2020-01-22 21:29
ljuneLCD 发表于 2014-8-21 14:57
屏本身就可能没有4BIT 的模式

怎么知道屏支不支持4bit模式?
请看3楼我的回复,我按照那种方式初始化使用4bit模式能够显示内容,仅在上半屏显示,而且第一个字符缺失,下半屏无显示,有时上电后会花屏
bias
5楼-- · 2020-01-22 23:25
ST7920是肯定支持4bit并口的,不过没写过
ljuneLCD
6楼-- · 2020-01-23 04:23
 精彩回答 2  元偷偷看……

一周热门 更多>