标题: STC89系列单片机LCD12864液晶显示,液晶屏亮了什么都没有显示 [打印本页]
作者: 一直有个梦 时间: 2018-8-23 15:28
标题: STC89系列单片机LCD12864液晶显示,液晶屏亮了什么都没有显示
- /* ***************************************************** */
- /* ***************************************************** */
- // 工 程 : 51单片机开发板
- // 文件名 : LCD12864.c
- // 处理器 : STC89C52RC
- // 编译环境 : Keil5 C51
- // 系统时钟 : 11.0592MHZ
- // 简单描述 : 本文件是带字库LCD12864显示程序
- /* ***************************************************** */
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define Lcd_Bus P2 //数据总线
- /* ***************************************************** */
- // 位定义
- /* ***************************************************** */
- sbit RS=P1^2; //数据/命令选择端(H/L)
- sbit RW=P1^1; //数/写选择端(H/L)
- sbit E=P1^0; //使能信号
- /* ***************************************************** */
- // 函数名称:DelayMS()
- // 函数功能:延时毫秒数(ValMS)
- // 入口参数:无
- // 出口参数:无
- /* ***************************************************** */
- void DelayMS(uint ValMS)
- {
- uint uiVal,ujVal;
- for(uiVal = 0; uiVal < ValMS; uiVal++)
- for(ujVal = 0; ujVal < 121; ujVal++);
- }
- /* ***************************************************** */
- // 函数名称hk_busy()
- // 函数功能:检测状态标志位(判断是忙/闲)
- // 入口参数:无
- // 出口参数:无
- /* ***************************************************** */
- void chk_busy()
- {
- Lcd_Bus=0x00;
- RS=0;
- RW=1;
- E=1;
- DelayMS(1);
- while(Lcd_Bus & 0x80); // 若LCD忙,停止到这里,否则走起
- E=0; // 之后将EN初始化为低电平
- }
-
- /* ***************************************************** */
- // 函数名称rite_com()
- // 函数功能:LCD写指令
- // 入口参数:指令(cmdcode)
- // 出口参数:无
- /* ***************************************************** */
- void write_com(unsigned char cmdcode)
- {
- chk_busy(); //忙检查
- RS=0;
- RW=0; //RS=0,RW=0;表示MCU写指令到暂存器IR
- E=1;
- Lcd_Bus=cmdcode; //Lcd_Bus=P0;
- E=0; //E由高到低变化配合W进行写指令或写数据
- }
- /* ***************************************************** */
- // 函数名称rite_data()
- // 函数功能:LCD写数据
- // 入口参数:数据(Dispdata)
- // 出口参数:无
- /* ***************************************************** */
- void write_data(unsigned char Dispdata)
- {
- chk_busy(); //忙检查
- RS=1;
- RW=0; //RS=1;RW=0;表示MCU写数据到暂存器IR
- E=1;
- Lcd_Bus=Dispdata; //Lcd_Bus=P0;
- E=0; //E由高到低变化配合W进行写指令或写数据
- }
- /* ***************************************************** */
- // 函数名称:lcm_init()
- // 函数功能:LCD初始化
- // 入口参数:无
- // 出口参数:无
- /* ***************************************************** */
- void lcm_init()
- {
- write_com(0x30); //选择8bit数据流 0X30=0011,0000
- DelayMS(10);
- write_com(0x0C); //开显示(无游标,不反白)
- DelayMS(10);
- write_com(0x01); //清除显示,并且设定地址指针为00H
- DelayMS(10);
- }
- //============================================================//写数据或指令(被调用层)
- void lcm_w_test(bit i,unsigned char word)
- {
- if(i == 0) //根据i的状态区分指令或数据
- {
- write_com(word);//写数据或指令(0,指令)
- }
- else
- {
- write_data(word);//写指令或数据(1,数据)
- }
- }
- //-----------------------------------------------------------//清屏函数
- void lcm_clr(void){
- lcm_w_test(0,0x01);
- }
- //===========================================================//向LCM发送一个字符串,长度64字符之内(被调用层),
- void lcm_w_word(unsigned char *s)
- {
- while(*s>0) //*s指针
- {
- write_data(*s);//用指针显示数据地址
- s++; //自加显示下一个数据地址
- }
- }
- void welcome(void) //初始化开机显示
- {
- lcm_w_test(0,0x81); //写指令和地址
- lcm_w_word ("空山新雨后,"); //写显示数据
- lcm_w_test(0,0x91);
- lcm_w_word ("天气晚来秋.");
- lcm_w_test(0,0x89);
- lcm_w_word ("明月松间照,");
- lcm_w_test(0,0x99);
- lcm_w_word ("清泉石上流.");
- }
-
- void main()
- {
- lcm_init();//初始化液晶显示屏
- lcm_clr();//清屏
- welcome(); //初始化开机显示画面,显示信息
- DelayMS(3000); //显示停留3秒
- while(1);
- }
-
复制代码 液晶屏亮了什么都没有显示,求大佬告知。
-
QQ图片20180823152417.png
(49.54 KB, 下载次数: 56)
作者: zl2168 时间: 2018-8-23 16:39
本帖最后由 zl2168 于 2018-8-23 22:01 编辑
LCD12864显示屏显示汉字
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行,可演示,可观测,程序语句条条有注解。
作者: 一直有个梦 时间: 2018-8-23 17:21
还有就是我是用的STC15系列单片机转换板转成STC89系列的
作者: 609763691 时间: 2018-8-23 19:11
检测是不是忙状态
作者: 609763691 时间: 2018-8-23 21:57
把你的这个welcome这个现实函数写进while死循环,否则不会现在文字,因为你每次的初始化都清屏了,你要写进while循环之后才能执行,才不会被(0x01)这个指令清屏。还有检查一下你的忙函数,之前我在玩MSP430 的时候,就遇到这样的问题,然后把忙函数去掉就好了,你这些方面都试着检查看看,尽量自己找出问题才有进步。
作者: wulin 时间: 2018-8-24 06:09
你用STC15系列单片机转换板转成STC89只能使两者管脚排列达成一致,并不能改变两者的电特性差异。STC15系列是1T单片机,速度比STC89快得多,原程序的 DelayMS 延时函数不适应STC15系列单片机,需要修改才能满足LCD12864驱动程序的时序条件。延时程序改成这样试试。
void DelayMS(uint ValMS)
{
uint uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 1150; ujVal++);
}
作者: 一直有个梦 时间: 2018-8-24 09:30
我清屏函数是在显示前面的,我试过了放while里面也不行。忙函数全部去掉也不行。
作者: 一直有个梦 时间: 2018-8-24 09:31
修改了也不行的。。。
作者: 一直有个梦 时间: 2018-8-24 09:32
.C文件都没有,发出来有上面用呢
作者: 一直有个梦 时间: 2018-8-24 10:16
问题解决了,感谢各位大佬。I/O口电流不够,设置成推挽输出就能显示了。
作者: zl2168 时间: 2018-8-24 22:15
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: dsadadsad 时间: 2019-8-8 11:06
程序怎么改的呀
作者: dsadadsad 时间: 2019-8-8 12:17
我把P3M0=0x80;P3M1=0xf0;(我的是P3口)这样设置还是光亮着不显示,为什么呀
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |