[51单片机] LCD两行显示英文,菜鸟不知哪里错误,求教,谢谢

[复制链接]
2169|9
 楼主| 钟国两 发表于 2014-9-22 22:14 | 显示全部楼层 |阅读模式
# include <reg52.h>
# define uchar unsigned char
# define uint usigned int
char code display1[]={"  zhongguoliang "};
char code display2[]={"you are the best"};
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
void delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);       
}

void write_com(uchar date) //写指令
{
        en=0;
        rs=0;
        rw=0;
       
        P1=date;
        delay(5);
        en=1;
       
        delay(5);
        en=0;
        delay(5);
}
void write_date(uchar datea) //写数据
{
        en=0;
        rs=1;
        rw=0;
        P0=datea;
        delay(10);
        en=1;
       
        delay(5);
        en=0;
        delay(5);
}
void init()         //初始化函数
{
        en=0;
        write_com(0x38);
        delay(5);
        write_com(0x38);
        delay(5);
        write_com(0x0f);
        delay(5);
        write_com(0x06);
        delay(5);
        write_com(0x01);
        delay(5);                       
}
uchar num;
void main()
{
        //init();
        while(1)                                       

                                                  
        {        init();
                write_com(0x01);
                write_com(0x80);  //显示第一行
                for(num=0;num<16;num++)
                {
                        write_date(display1[num]);
                    delay(50);
                }
                write_com(0x80+0x40);
                for(num=0;num<16;num++)
                {
                        write_date(display2[num]);
                    delay(50);
                }
        }                                               

                  
                                                       

                                 
}
justsuperone 发表于 2014-9-22 22:27 | 显示全部楼层
把初始化防在循环外边试试
 楼主| 钟国两 发表于 2014-9-22 22:49 | 显示全部楼层
也不行啊,我之前已经试过把初始化放在外面的,
 楼主| 钟国两 发表于 2014-9-22 22:50 | 显示全部楼层
justsuperone 发表于 2014-9-22 22:27
把初始化防在循环外边试试

不行啊@justsuperone  
justsuperone 发表于 2014-9-22 22:52 | 显示全部楼层
钟国两 发表于 2014-9-22 22:49
也不行啊,我之前已经试过把初始化放在外面的,

那现在是什么情况,不显示吗
justsuperone 发表于 2014-9-22 22:59 | 显示全部楼层
你要显示的是字符串 ,不能直接写write_date(display2[num]);
通宵敲代码 发表于 2014-9-22 23:40 | 显示全部楼层
查查是乱码!
cauhorse 发表于 2014-9-22 23:48 | 显示全部楼层
如是自行设计并焊接的电路,先检查原理设计与器件焊装有没有问题。1602电源、对比度、IO引线顺序及驱动能力都查一遍,没问题就上个开发例程,并注意例程采用的MCU时钟频率,最好能与LZ的板子匹配。
在这个基础上改,问题能很快地解决,对比程序,也有利于发现自写代码的问题。
贴个代码,不是广告,顺手找的,验证没问题,修改控制引脚、数据总线的IO定义,可以试下。
  1. /*******************************************************************************
  2. *  标题:  启东微芯LJD-SY-5100单片机开发系统演示程序                            *
  3. *  文件:  1602.C                                                               *
  4. *  日期:  2005-7-4                                                             *
  5. *  版本:  1.0                                                                  *
  6. *  作者:  启东微芯                                                             *
  7. *  网站: http://www.ljd-2008.com                                              *
  8. ********************************************************************************
  9. *  描述:                                                                       *
  10. *        液晶屏第一行显示 welcome!                                             *     
  11. *              第二行显示 www.bluemcu.com                                     *
  12. *                                                                              *
  13. ********************************************************************************
  14. * 【版权】 Copyright(C)微芯科技 http://www.ljd-2008.com    All Rights Reserved *         
  15. * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
  16. *******************************************************************************/
  17. #include <reg51.h>
  18. #include <intrins.h>

  19. typedef unsigned char BYTE;
  20. typedef unsigned int WORD;
  21. typedef bit BOOL ;

  22. sbit rs        = P1^4;       
  23. sbit rw = P1^5;
  24. sbit ep = P1^3;

  25. BYTE code dis1[] = {"welcome!"};
  26. BYTE code dis2[] = {"www.bluemcu.com"};

  27. delay(BYTE ms)
  28. {                                                        // 延时子程序
  29.         BYTE i;
  30.         while(ms--)
  31.         {
  32.                 for(i = 0; i<250; i++)
  33.                 {
  34.                         _nop_();
  35.                         _nop_();
  36.                         _nop_();
  37.                         _nop_();
  38.                 }
  39.         }
  40. }



  41. lcd_wcmd(BYTE cmd)
  42. {                                                        // 写入指令数据到LCD
  43.     delay(1);
  44.         rs = 0;
  45.         rw = 0;
  46.         ep = 0;
  47.         _nop_();
  48.         _nop_();       
  49.         P0 = cmd;
  50.     _nop_();
  51.         _nop_();
  52.         _nop_();
  53.         _nop_();
  54.         ep = 1;
  55.         _nop_();
  56.         _nop_();
  57.         _nop_();
  58.         _nop_();
  59.         ep = 0;       

  60. }

  61. lcd_pos(BYTE pos)
  62. {        //pos=0x40;                                                //设定显示位置
  63.         lcd_wcmd(pos|0x80);
  64.     //lcd_wcmd(pos);
  65.    
  66. }

  67. lcd_wdat(BYTE dat)       
  68. {                                                        //写入字符显示数据到LCD
  69.    delay(1);
  70.         rs = 1;
  71.         rw = 0;
  72.         ep = 0;
  73.         _nop_();
  74.         _nop_();
  75.         P0 = dat;
  76.         _nop_();
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         ep = 1;
  81.         _nop_();
  82.         _nop_();
  83.         _nop_();
  84.         _nop_();
  85.         ep = 0;       
  86.        
  87. }

  88. lcd_init()
  89. {       
  90.    delay(1);                                //LCD初始化设定
  91.         lcd_wcmd(0x38);                    //显示模式设置:单行,8字符,5x7点阵
  92.     delay(1);
  93.         delay(1);
  94.         lcd_wcmd(0x06);                        //开显示,关光标,不闪烁
  95.     delay(1);
  96.         delay(1);
  97.         lcd_wcmd(0x0c);                        //设置输入模式:光标增量移动,显示不移位
  98.         delay(1);
  99.         delay(1);
  100.         //lcd_wcmd(0x08);
  101.         //delay(1);
  102.         //delay(1);
  103.         lcd_wcmd(0x01);                        //清除LCD显示的内容
  104.     delay(1);

  105. }

  106. void main()
  107. {
  108. while(1)
  109. {
  110.         BYTE i;
  111.         lcd_init();                                // 初始化LCD                       
  112.     delay(10);
  113.         lcd_pos(0x05);                                // 设置显示位置为第一行的第5个字符
  114.         i = 0;
  115.         while(dis1[i]!='\0')
  116.         {                                                // 显示字符"welcome!"
  117.                 lcd_wdat(dis1[i]);
  118.                 delay(30);
  119.                 i++;
  120.         }
  121.     //delay(20);

  122.    
  123. //lcd_init();
  124.         delay(10);
  125.         lcd_pos(0x40);                        // 设置显示位置为第二行第二个字符
  126.         //delay(10);
  127.         i = 0;
  128.         while(dis2[i]!='\0')
  129.         {
  130.                 lcd_wdat(dis2[i]);        // 显示字符"  www.bluemcu.com  "
  131.                 delay(30);
  132.                 i++;
  133.         }
  134.         //while(1);
  135.    delay(40);
  136. }
  137. }       
qq4988 发表于 2014-9-23 07:36 | 显示全部楼层
把初始化写在while外面,还有,发送显示的语句,发送一次就够了,显示相同的内容,没有必要循环刷新的,
ayb_ice 发表于 2014-9-23 09:01 | 显示全部楼层
LZ也没说什么错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部