LCD12864串行显示的问题。

2019-07-15 11:19发布

为什么我下载别人的程序,可以正常显示,然后把一些我不需要的东西删了只要初始化以及主函数,就不能正常显示了,主函数里面我加了while(1);的话就显示不出来,原本程序是可以的,不加while(1)的话能显示,但是数据一直在闪。下边的程序是网上的程序的初始化,都差不多的,是不是我删多了什么?
  1. //端口定义
  2. sbit  LCD_CS=P2^4;
  3. sbit  LCD_SID=P2^5;          //串行数据线
  4. sbit  LCD_SCLK=P2^6;         //串上时钟输入
  5. sbit PSB=P2^7;
  6. uchar code a[]={"LCD12864"};      //定义要显示的字符串
  7.       
  8. /**************************************/
  9. //延时函数
  10. /**************************************/
  11. void Delay_nms(uchar n)
  12. {
  13.    uchar i;
  14.    uchar j;
  15.    for(i=0;i<n;i++)
  16.    for(j=0;j<125;j++)        //大概1ms
  17. _nop_();
  18. }
  19. /**************************************/
  20. //串行发送一个字节
  21. /**************************************/
  22. void LCD_sendbyte(uchar byte)
  23. {
  24.    uchar i;
  25.    for(i=0;i<8;i++)
  26.     {
  27.    LCD_SCLK=0;               //拉低时钟线
  28.    _nop_();
  29.    LCD_SID=(bit)(byte&0x80);    //发送最高位数据
  30.    LCD_SCLK=1;               //上升沿发送数据
  31.    byte=byte<<1;                  //左移一位
  32. }
  33. }

  34. /****************************************/
  35. //写指令
  36. /****************************************/
  37. void LCD_write_com(uchar com)
  38. {
  39.   LCD_CS=1;        
  40.    LCD_sendbyte(0xf8);       //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(0),0
  41.    LCD_sendbyte(0xf0&com);       //取高四位,数据分两次传送,
  42.                                  //每个字节的内容被送入两个字节
  43.                //高四位放在第一个字节的高四位
  44.    LCD_sendbyte(0xf0&(com<<4));        //低四位放在第二个字节的高四位
  45.     LCD_CS=0;      
  46.   Delay_nms(10);             //串行不支持读操作,不可检测忙操作,这里用延时替代   
  47. }
  48. /******************************************/
  49. //写数据
  50. /******************************************/
  51. void LCD_write_dat(uchar dat)
  52. {
  53.     LCD_CS=1;        
  54.    LCD_sendbyte(0xfa);        //送入5个连续的“1“,启动一个周期,11111,RW(0),RS(1),0
  55.    LCD_sendbyte(0xf0&dat);       //取高四位,数据分两次传送,
  56.                                  //每个字节的内容被送入两个字节
  57.                //高四位放在第一个字节的高四位
  58.    LCD_sendbyte(0xf0&(dat<<4));        //低四位放在第二个字节
  59.     LCD_CS=0;        
  60.    Delay_nms(10);
  61. }
  62. /********************************************/
  63. //LCD初始化
  64. /********************************************/
  65. void LCD_init(void)
  66. {  PSB=0;      
  67. LCD_write_com(0x30);             //选择基本指令集   
  68. LCD_write_com(0x0c);       //开显示,无游标,不反白
  69. LCD_write_com(0x01);       //清除显示屏幕,把DDRAM位址计数器调整为00H
  70. Delay_nms(5);         //清屏操作时间较长1.6ms 因此加此延时
  71. LCD_write_com(0x02);       //清DDRAM位址归位,此处貌似与清屏重复
  72. LCD_write_com(0x06);       //设定光标右移,整体显示不移动
  73. }
  74. /*************************************************/
  75. //显示字符串
  76. /*************************************************/
  77. void print(uchar *s)
  78. {
  79.     while(*s!='')
  80.     {  
  81.        LCD_write_dat(*s);
  82.        s++;     
  83.     }
  84. }
  85. /***************************************************/
  86. //设置显示地址
  87. /***************************************************/
  88. void LCD_Setaddress(uchar x,uchar y)
  89. {              //地址从第1行第1列开始不从0开始
  90.   uchar addr;
  91.   switch(x)
  92.   {
  93.    case 1: addr=0x80+y-1;
  94.            break;
  95.    case 2: addr=0x90+y-1;
  96.            break;
  97.    case 3: addr=0x88+y-1;
  98.            break;
  99.    case 4: addr=0x98+y-1;
  100.            break;
  101.    default : break;
  102.   }
  103.    LCD_write_com(addr);    //字符显示开始地址
  104. }
  105. /*****************************************************/
  106. //让字符串显示在固定位置
  107. /*****************************************************/
  108. void LCD_Putstring( uchar x, uchar y, uchar *pData )
  109. {
  110. LCD_Setaddress(x,y);
  111. while( *pData != '' )
  112. {
  113.    LCD_write_dat( *pData++ );
  114. }
  115. }




  116. /******************************************************/
  117. //主函数
  118. //用于观看显示效果
  119. /******************************************************/
  120. void main(void)
  121. {
  122. LCD_init();  
  123. LCD_Setaddress(2,3);
  124. print("你好");   
  125. LCD_Putstring(3,3,a);
  126. while(1);  //加了这个我就显示不出来,但是原有程序有这个能正常显示的

  127. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
zeng10119
1楼-- · 2019-07-15 19:47
zeng10119 发表于 2017-4-17 13:30
这个是主函数没有while(1)的,能够显示但是一直在闪。

是不是因为没有while(1);main函数程序一直在初始化lcd,所以就一闪一闪的。那为什么加了while就不显示了
zeng10119
2楼-- · 2019-07-15 22:44
本帖最后由 zeng10119 于 2017-4-17 14:18 编辑
zeng10119 发表于 2017-4-17 13:30
这个是主函数没有while(1)的,能够显示但是一直在闪。

已经试了很多个程序了,都是大同小异的初始化,但是还是只要我删了while(1);就能够显示了。会是硬件问题吗?
zeng10119
3楼-- · 2019-07-16 03:59
问题解决了,谢谢大家,下次自己多找找原因再来问问了。麻烦了
李春明
4楼-- · 2019-07-16 06:12
 精彩回答 2  元偷偷看……
zeng10119
5楼-- · 2019-07-16 11:38
王栋春 发表于 2017-4-17 20:55
是什么原因造成的呀  望分享

是硬件问题,我把灰度的电位器拆了就正常了。因为原本我接的滑变调到头了才有显示的,可能程序在加入while()死循环后,要调滑变才能显示,但我已经调不了了。所以,还是得多从自己的硬件找原因
李春明
6楼-- · 2019-07-16 12:46
zeng10119 发表于 2017-4-19 12:17
是硬件问题,我把灰度的电位器拆了就正常了。因为原本我接的滑变调到头了才有显示的,可能程序在加入while()死循环后,要调滑变才能显示,但我已经调不了了。所以,还是得多从自己的硬件找原因

这个如果软件没有问题 或是定型的数据 先检查硬件才是王道

一周热门 更多>