搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2014-8-19 12:55:39 | 显示全部楼层 |阅读模式
  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);        /* 写入数据的低四位 */
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-8-20 14:46:03 | 显示全部楼层
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里面最后一人留言的方式配置,能够显示上半屏的数据,但是不完整,下半屏数据不显示,而且不稳定,有时上电会出现花屏的现象,然后在此基础上又尝试了不同的时序,结果就上面这样还强一些
可惜上面帖子里的那位没有说的很具体,继续各种尝试吧

出0入0汤圆

发表于 2014-8-21 14:57:18 | 显示全部楼层
屏本身就可能没有4BIT 的模式

出0入0汤圆

 楼主| 发表于 2014-8-22 08:45:47 | 显示全部楼层
ljuneLCD 发表于 2014-8-21 14:57
屏本身就可能没有4BIT 的模式

怎么知道屏支不支持4bit模式?
请看3楼我的回复,我按照那种方式初始化使用4bit模式能够显示内容,仅在上半屏显示,而且第一个字符缺失,下半屏无显示,有时上电后会花屏

出0入10汤圆

发表于 2014-8-22 12:17:25 | 显示全部楼层
ST7920是肯定支持4bit并口的,不过没写过

出0入0汤圆

发表于 2014-8-22 15:19:59 | 显示全部楼层
zya311 发表于 2014-8-22 08:45
怎么知道屏支不支持4bit模式?
请看3楼我的回复,我按照那种方式初始化使用4bit模式能够显示内容,仅在上 ...

你的功能设置寄存器设置为LCD12864_WriteCMD(0x20); //设置为4位并行口,基本指令集.这样试试

出0入0汤圆

 楼主| 发表于 2014-9-9 19:34:12 | 显示全部楼层
ljuneLCD 发表于 2014-8-22 15:19
你的功能设置寄存器设置为LCD12864_WriteCMD(0x20); //设置为4位并行口,基本指令集.这样试试 ...

我上面的程序就是这么配置的啊
117.#elif _12864_MODE==_12864_4bit        /*  */

118.        //功能设定

119.        LCD12864_EN_SET;        /* EN保持高电平 */

120.        LCD12864_DATA_PORT=0x20;        /* 8位并口写入指令 */

121.        LCD12864_EN_CLR;        /* EN下降沿执行写入操作 */

122.        Delay10US12T(11);//at least 100us

123.        LCD12864_WriteCMD(0x20); //设置为4位并行口,基本指令集

124.        Delay10US12T(11);//at least 100us

125.        LCD12864_WriteCMD(0x0c);  //开显示

126.        Delay10US12T(11);//at least 100us

127.        LCD12864_WriteCMD(0x01); //清除显示

128.        DelayMs12T(11);//at least 10ms

129.        LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动

130.#endif

出0入0汤圆

发表于 2014-9-9 23:20:19 | 显示全部楼层
之前看到的有点印象,貌似是4线时12864上R9的那个电阻要取下装在R10位置,你再查查。

出0入0汤圆

发表于 2014-9-9 23:28:06 | 显示全部楼层
上次拆机搞个1004的液晶   4线驱动也没成功      放那放着呢   有时间再倒腾倒腾
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表