找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7616|回复: 12
收起左侧

STC89系列单片机LCD12864液晶显示,液晶屏亮了什么都没有显示

[复制链接]
ID:299493 发表于 2018-8-23 15:28 | 显示全部楼层 |阅读模式
  1. /* ***************************************************** */
  2. /* ***************************************************** */
  3. // 工  程   : 51单片机开发板
  4. // 文件名   : LCD12864.c
  5. // 处理器   : STC89C52RC
  6. // 编译环境 : Keil5 C51
  7. // 系统时钟 : 11.0592MHZ
  8. // 简单描述 : 本文件是带字库LCD12864显示程序
  9. /* ***************************************************** */
  10. #include <reg52.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char
  13. #define Lcd_Bus P2 //数据总线
  14. /* ***************************************************** */
  15. // 位定义
  16. /* ***************************************************** */
  17. sbit RS=P1^2;     //数据/命令选择端(H/L)
  18. sbit RW=P1^1;    //数/写选择端(H/L)
  19. sbit E=P1^0;     //使能信号
  20. /* ***************************************************** */
  21. // 函数名称:DelayMS()
  22. // 函数功能:延时毫秒数(ValMS)
  23. // 入口参数:无
  24. // 出口参数:无
  25. /* ***************************************************** */
  26. void DelayMS(uint ValMS)
  27. {
  28.         uint uiVal,ujVal;
  29.         for(uiVal = 0; uiVal < ValMS; uiVal++)
  30.                 for(ujVal = 0; ujVal < 121; ujVal++);
  31. }
  32. /* ***************************************************** */
  33. // 函数名称hk_busy()
  34. // 函数功能:检测状态标志位(判断是忙/闲)
  35. // 入口参数:无
  36. // 出口参数:无
  37. /* ***************************************************** */
  38. void chk_busy()
  39. {  
  40.           Lcd_Bus=0x00;
  41.     RS=0;
  42.     RW=1;
  43.     E=1;  
  44.           DelayMS(1);
  45.     while(Lcd_Bus & 0x80);   // 若LCD忙,停止到这里,否则走起
  46.     E=0;                // 之后将EN初始化为低电平
  47. }

  48. /* ***************************************************** */
  49. // 函数名称rite_com()
  50. // 函数功能:LCD写指令
  51. // 入口参数:指令(cmdcode)
  52. // 出口参数:无
  53. /* ***************************************************** */
  54. void write_com(unsigned char cmdcode)
  55. {
  56.         chk_busy();     //忙检查
  57.         RS=0;
  58.         RW=0;      //RS=0,RW=0;表示MCU写指令到暂存器IR
  59.         E=1;
  60.         Lcd_Bus=cmdcode;   //Lcd_Bus=P0;
  61.         E=0;      //E由高到低变化配合W进行写指令或写数据

  62. }
  63. /* ***************************************************** */
  64. // 函数名称rite_data()
  65. // 函数功能:LCD写数据
  66. // 入口参数:数据(Dispdata)
  67. // 出口参数:无
  68. /* ***************************************************** */
  69. void write_data(unsigned char Dispdata)
  70. {  
  71.   chk_busy();     //忙检查
  72.         RS=1;
  73.         RW=0;      //RS=1;RW=0;表示MCU写数据到暂存器IR
  74.         E=1;
  75.         Lcd_Bus=Dispdata;  //Lcd_Bus=P0;
  76.         E=0;      //E由高到低变化配合W进行写指令或写数据
  77. }
  78. /* ***************************************************** */
  79. // 函数名称:lcm_init()
  80. // 函数功能:LCD初始化
  81. // 入口参数:无
  82. // 出口参数:无
  83. /* ***************************************************** */
  84. void lcm_init()
  85. {
  86.    write_com(0x30);    //选择8bit数据流 0X30=0011,0000
  87.          DelayMS(10);
  88.    write_com(0x0C);    //开显示(无游标,不反白)
  89.          DelayMS(10);
  90.    write_com(0x01);    //清除显示,并且设定地址指针为00H
  91.          DelayMS(10);
  92. }
  93. //============================================================//写数据或指令(被调用层)
  94. void lcm_w_test(bit i,unsigned char word)
  95. {
  96.    if(i == 0)   //根据i的状态区分指令或数据
  97.          {   
  98.       write_com(word);//写数据或指令(0,指令)
  99.    }
  100.    else
  101.         {
  102.    write_data(word);//写指令或数据(1,数据)
  103.   }
  104. }
  105. //-----------------------------------------------------------//清屏函数
  106. void lcm_clr(void){
  107.    lcm_w_test(0,0x01);
  108. }
  109. //===========================================================//向LCM发送一个字符串,长度64字符之内(被调用层),
  110. void lcm_w_word(unsigned char *s)
  111. {
  112.     while(*s>0)  //*s指针
  113.          {     
  114.       write_data(*s);//用指针显示数据地址
  115.       s++;      //自加显示下一个数据地址
  116.     }
  117. }
  118. void welcome(void)        //初始化开机显示
  119. {
  120.     lcm_w_test(0,0x81);   //写指令和地址
  121.     lcm_w_word ("空山新雨后,"); //写显示数据
  122.     lcm_w_test(0,0x91);
  123.     lcm_w_word ("天气晚来秋.");
  124.     lcm_w_test(0,0x89);
  125.     lcm_w_word ("明月松间照,");
  126.     lcm_w_test(0,0x99);
  127.     lcm_w_word ("清泉石上流.");
  128. }

  129. void main()
  130. {
  131.     lcm_init();//初始化液晶显示屏
  132.     lcm_clr();//清屏
  133.     welcome(); //初始化开机显示画面,显示信息
  134.     DelayMS(3000); //显示停留3秒
  135.     while(1);
  136. }

复制代码
液晶屏亮了什么都没有显示,求大佬告知。
QQ图片20180823152417.png

评分

参与人数 1黑币 +5 收起 理由
dsadadsad + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:299493 发表于 2018-8-23 17:21 | 显示全部楼层
还有就是我是用的STC15系列单片机转换板转成STC89系列的
回复

使用道具 举报

ID:375092 发表于 2018-8-23 21:57 | 显示全部楼层
把你的这个welcome这个现实函数写进while死循环,否则不会现在文字,因为你每次的初始化都清屏了,你要写进while循环之后才能执行,才不会被(0x01)这个指令清屏。还有检查一下你的忙函数,之前我在玩MSP430 的时候,就遇到这样的问题,然后把忙函数去掉就好了,你这些方面都试着检查看看,尽量自己找出问题才有进步。

评分

参与人数 2黑币 +60 收起 理由
admin + 50 回帖助人的奖励!
yousunny + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2018-8-23 16:39 | 显示全部楼层
本帖最后由 zl2168 于 2018-8-23 22:01 编辑

LCD12864显示屏显示汉字
Proteus仿真一下,确认有效。
实验25 LCD12864显示屏显示.rar (60.48 KB, 下载次数: 60)
回复

使用道具 举报

ID:375092 发表于 2018-8-23 19:11 | 显示全部楼层
检测是不是忙状态
回复

使用道具 举报

ID:213173 发表于 2018-8-24 06:09 | 显示全部楼层
一直有个梦 发表于 2018-8-23 17:21
还有就是我是用的STC15系列单片机转换板转成STC89系列的

你用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++);
}
回复

使用道具 举报

ID:299493 发表于 2018-8-24 09:30 | 显示全部楼层
609763691 发表于 2018-8-23 21:57
把你的这个welcome这个现实函数写进while死循环,否则不会现在文字,因为你每次的初始化都清屏了,你要写进 ...

我清屏函数是在显示前面的,我试过了放while里面也不行。忙函数全部去掉也不行。
回复

使用道具 举报

ID:299493 发表于 2018-8-24 09:31 | 显示全部楼层
wulin 发表于 2018-8-24 06:09
你用STC15系列单片机转换板转成STC89只能使两者管脚排列达成一致,并不能改变两者的电特性差异。STC15系 ...

修改了也不行的。。。
回复

使用道具 举报

ID:299493 发表于 2018-8-24 09:32 | 显示全部楼层
zl2168 发表于 2018-8-23 16:39
LCD12864显示屏显示汉字
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教 ...

.C文件都没有,发出来有上面用呢
回复

使用道具 举报

ID:299493 发表于 2018-8-24 10:16 | 显示全部楼层
问题解决了,感谢各位大佬。I/O口电流不够,设置成推挽输出就能显示了。
回复

使用道具 举报

ID:111634 发表于 2018-8-24 22:15 | 显示全部楼层
一直有个梦 发表于 2018-8-24 09:32
.C文件都没有,发出来有上面用呢

仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

ID:589584 发表于 2019-8-8 11:06 | 显示全部楼层
一直有个梦 发表于 2018-8-24 10:16
问题解决了,感谢各位大佬。I/O口电流不够,设置成推挽输出就能显示了。

程序怎么改的呀
回复

使用道具 举报

ID:589584 发表于 2019-8-8 12:17 | 显示全部楼层
一直有个梦 发表于 2018-8-24 10:16
问题解决了,感谢各位大佬。I/O口电流不够,设置成推挽输出就能显示了。

我把P3M0=0x80;P3M1=0xf0;(我的是P3口)这样设置还是光亮着不显示,为什么呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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