- /************************************************************************/
- /* The functions below are defined for internal use */
- /* these functions should not be declared in the head file */
- /************************************************************************/
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_WaitForReady
- * DESCRIPTION: LCD12864 busy wait
- ****************************************************************************************/
- static void LCD12864_WaitForReady(void)
- {
- LCD12864_RS_CLR;
- LCD12864_RW_SET; /* 进入读指令状态 */
- LCD12864_EN_SET; /* EN保持高电平,读操作 */
-
- while(1)
- {
- Delay10US12T(2);
- if(LCD12864_BF == FALSE)
- break;
- }
-
- LCD12864_EN_CLR;
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_WriteCMD
- * DESCRIPTION: write command to LCD12864
- ****************************************************************************************/
- static void LCD12864_WriteCMD(uchar command)
- {
- LCD12864_RS_CLR;
- LCD12864_RW_CLR; /* 进入写指令状态 */
- #if _12864_MODE==_12864_8bit /* 8线模式一次性写入 */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_SendData(command); /* 写入指令 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- #elif _12864_MODE==_12864_4bit /* 4线模式分高低4bits写入 */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_Send4bitDataHigh(command); /* 写入指令 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_Send4bitDataLow(command); /* 写入指令 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- #endif
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_WriteData
- * DESCRIPTION: write data to LCD12864
- ****************************************************************************************/
- static void LCD12864_WriteData(uchar dat)
- {
- LCD12864_RS_SET;
- LCD12864_RW_CLR; /* 进入写数据状态 */
- #if _12864_MODE==_12864_8bit /* */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_SendData(dat); /* 写入数据 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- #elif _12864_MODE==_12864_4bit /* */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_Send4bitDataHigh(dat); /* 写入数据 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_Send4bitDataLow(dat); /* 写入数据 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- #endif
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_Set_Cursor
- * DESCRIPTION: locate cursor, Col:column, Ln:line
- ****************************************************************************************/
- static void LCD12864_Set_Cursor(uchar Ln, uchar Col)
- {
- Ln &= 0x03; /* 行标溢出防止,行标:0~3 */
- Col &= 0x07; /* 列标溢出防止,列标:0~7 */
- switch(Ln)
- {
- case 0x00: Col+=LCD12864_Line1; break;//第一行
- case 0x01: Col+=LCD12864_Line2; break;//第二行
- case 0x02: Col+=LCD12864_Line3; break;//第三行
- case 0x03: Col+=LCD12864_Line4; break;//第四行
- default : break;
- }
- LCD12864_WriteCMD(Col);/* 写入光标地址 */
- LCD12864_WaitForReady();
- }
- /************************************************************************/
- /* The functions below are defined for external use */
- /* these functions should be declared in the head file */
- /************************************************************************/
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_Init
- * DESCRIPTION: initialize the LCD12864 module
- ****************************************************************************************/
- extern void LCD12864_Init(void)
- {
- DelayMs12T(50); //延时>40ms
- LCD12864_PSB_SET; //并行口
- //复位操作
- LCD12864_RST_SET;DelayMs12T(1);
- LCD12864_RST_CLR;DelayMs12T(1);
- LCD12864_RST_SET;DelayMs12T(1);
- #if _12864_MODE==_12864_8bit /* */
- //功能设定
- LCD12864_WriteCMD(0x30); //设置为8位并行口,基本指令集
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x30); //再次设置为8位并行口,基本指令集
- Delay10US12T(4);//at least 37us
- LCD12864_WriteCMD(0x0c); //开显示
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x01); //清除显示
- DelayMs12T(11);//at least 10ms
- LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
- #elif _12864_MODE==_12864_4bit /* */
- //功能设定
- LCD12864_EN_SET; /* EN保持高电平 */
- LCD12864_DATA_PORT=0x20; /* 8位并口写入指令 */
- LCD12864_EN_CLR; /* EN下降沿执行写入操作 */
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x20); //设置为4位并行口,基本指令集
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x0c); //开显示
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x01); //清除显示
- DelayMs12T(11);//at least 10ms
- LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
- #endif
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_Clear_Screen
- * DESCRIPTION: Clear Screen
- ****************************************************************************************/
- extern void LCD12864_Clear_Screen(void)
- {
- LCD12864_WaitForReady();
- LCD12864_WriteCMD(LCD12864_CLS);
- LCD12864_WaitForReady();
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_DisplayChar
- * DESCRIPTION: display one char, Ln:line, Col:column
- ****************************************************************************************/
- extern void LCD12864_DisplayChar(uchar Ln, uchar Col ,uchar Dat)
- {
- LCD12864_Set_Cursor(Ln, Col);
- LCD12864_WriteData(Dat);
- }
- /****************************************************************************************
- * FUNCTION NAME: LCD12864_DisplayString
- * DESCRIPTION: display string, Ln:line, Col:column
- ****************************************************************************************/
- extern void LCD12864_DisplayString(uchar Ln,uchar Col,char *pStr)
- {
- LCD12864_Set_Cursor(Ln,Col);
- while(*pStr)
- {
- LCD12864_WaitForReady();
- LCD12864_WriteData(*pStr++);
- }
- }
复制代码
如果#define _12864_MODE
_12864_8bit /* 此处修改12864使用4线或8线控制 */
则正常显示字符和字符串,
如果#define _12864_MODE
_12864_4bit /* 此处修改12864使用4线或8线控制 */
则上电无显示,关于4线模式上电初始化的操作尝试了很多配置和时序(上面是按照datasheet配置),都无法正常工作,请各位看看是初始化问题?还是4线模式数据传输有问题?还是别的问题?多谢!
另外:
- #define LCD12864_Send4bitDataHigh(X) LCD12864_DATA_PORT &= 0x0f; LCD12864_DATA_PORT |= (X&0xF0); /* 4线模式IO高4位控制,先将高四位置低,再写入数据的高四位 */
- #define LCD12864_Send4bitDataLow(X) LCD12864_DATA_PORT &= 0x0f; LCD12864_DATA_PORT |= (X<<4); /* 写入数据的低四位 */
复制代码
昨天把4线的初始化改成这样:
- LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
- LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
- LCD12864_WriteCMD(0x03); //设置为4位并行口,基本指令集
- Delay10US12T(11);//at least 100us
-
- LCD12864_WriteCMD(0x02); //设置为4位并行口,基本指令集
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x0c); //开显示
- Delay10US12T(11);//at least 100us
- LCD12864_WriteCMD(0x01); //清除显示
- DelayMs12T(11);//at least 10ms
- LCD12864_WriteCMD(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动
- DelayMs12T(11);//at least 10ms
复制代码是按照这个帖子http://www.amobbs.com/thread-5139572-1-1.html里面最后一人留言的方式配置,能够显示上半屏的数据,但是不完整,下半屏数据不显示,而且不稳定,有时上电会出现花屏的现象,然后在此基础上又尝试了不同的时序,结果就上面这样还强一些
可惜上面帖子里的那位没有说的很具体,继续各种尝试吧
怎么知道屏支不支持4bit模式?
请看3楼我的回复,我按照那种方式初始化使用4bit模式能够显示内容,仅在上半屏显示,而且第一个字符缺失,下半屏无显示,有时上电后会花屏
一周热门 更多>