打印
[51单片机]

LCD两行显示英文,菜鸟不知哪里错误,求教,谢谢

[复制链接]
1778|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  

使用特权

评论回复
5
justsuperone| | 2014-9-22 22:52 | 只看该作者
钟国两 发表于 2014-9-22 22:49
也不行啊,我之前已经试过把初始化放在外面的,

那现在是什么情况,不显示吗

使用特权

评论回复
6
justsuperone| | 2014-9-22 22:59 | 只看该作者
你要显示的是字符串 ,不能直接写write_date(display2[num]);

使用特权

评论回复
7
通宵敲代码| | 2014-9-22 23:40 | 只看该作者
查查是乱码!

使用特权

评论回复
8
cauhorse| | 2014-9-22 23:48 | 只看该作者
如是自行设计并焊接的电路,先检查原理设计与器件焊装有没有问题。1602电源、对比度、IO引线顺序及驱动能力都查一遍,没问题就上个开发例程,并注意例程采用的MCU时钟频率,最好能与LZ的板子匹配。
在这个基础上改,问题能很快地解决,对比程序,也有利于发现自写代码的问题。
贴个代码,不是广告,顺手找的,验证没问题,修改控制引脚、数据总线的IO定义,可以试下。
/*******************************************************************************
*  标题:  启东微芯LJD-SY-5100单片机开发系统演示程序                            *
*  文件:  1602.C                                                               *
*  日期:  2005-7-4                                                             *
*  版本:  1.0                                                                  *
*  作者:  启东微芯                                                             *
*  网站: http://www.ljd-2008.com                                              *
********************************************************************************
*  描述:                                                                       *
*        液晶屏第一行显示 welcome!                                             *     
*              第二行显示 www.bluemcu.com                                     *
*                                                                              *
********************************************************************************
* 【版权】 Copyright(C)微芯科技 http://www.ljd-2008.com    All Rights Reserved *         
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit rs        = P1^4;       
sbit rw = P1^5;
sbit ep = P1^3;

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

delay(BYTE ms)
{                                                        // 延时子程序
        BYTE i;
        while(ms--)
        {
                for(i = 0; i<250; i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}



lcd_wcmd(BYTE cmd)
{                                                        // 写入指令数据到LCD
    delay(1);
        rs = 0;
        rw = 0;
        ep = 0;
        _nop_();
        _nop_();       
        P0 = cmd;
    _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;       

}

lcd_pos(BYTE pos)
{        //pos=0x40;                                                //设定显示位置
        lcd_wcmd(pos|0x80);
    //lcd_wcmd(pos);
   
}

lcd_wdat(BYTE dat)       
{                                                        //写入字符显示数据到LCD
   delay(1);
        rs = 1;
        rw = 0;
        ep = 0;
        _nop_();
        _nop_();
        P0 = dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;       
       
}

lcd_init()
{       
   delay(1);                                //LCD初始化设定
        lcd_wcmd(0x38);                    //显示模式设置:单行,8字符,5x7点阵
    delay(1);
        delay(1);
        lcd_wcmd(0x06);                        //开显示,关光标,不闪烁
    delay(1);
        delay(1);
        lcd_wcmd(0x0c);                        //设置输入模式:光标增量移动,显示不移位
        delay(1);
        delay(1);
        //lcd_wcmd(0x08);
        //delay(1);
        //delay(1);
        lcd_wcmd(0x01);                        //清除LCD显示的内容
    delay(1);

}

void main()
{
while(1)
{
        BYTE i;
        lcd_init();                                // 初始化LCD                       
    delay(10);
        lcd_pos(0x05);                                // 设置显示位置为第一行的第5个字符
        i = 0;
        while(dis1[i]!='\0')
        {                                                // 显示字符"welcome!"
                lcd_wdat(dis1[i]);
                delay(30);
                i++;
        }
    //delay(20);

   
//lcd_init();
        delay(10);
        lcd_pos(0x40);                        // 设置显示位置为第二行第二个字符
        //delay(10);
        i = 0;
        while(dis2[i]!='\0')
        {
                lcd_wdat(dis2[i]);        // 显示字符"  www.bluemcu.com  "
                delay(30);
                i++;
        }
        //while(1);
   delay(40);
}
}       

使用特权

评论回复
9
qq4988| | 2014-9-23 07:36 | 只看该作者
把初始化写在while外面,还有,发送显示的语句,发送一次就够了,显示相同的内容,没有必要循环刷新的,

使用特权

评论回复
10
ayb_ice| | 2014-9-23 09:01 | 只看该作者
LZ也没说什么错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝