大家麻烦帮我看看吧,1602A只能显示第一行,为什么?谢谢

2019-07-15 23:39发布

麻烦大家看一下,为什么郭天祥的lcd1602A程序在普中科技那个单片机上运行不了,只显示第一行,没显示第二行。然后加了一个侧忙函数就可以两行显示了。为什么啊?这个是郭天祥的程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x10);
}
void main()
{
        init();
        for(num=0;num<11;num++)
        {
                write_data(table[num]);
                delay(20);
        }
        write_com(0x80+0x53);
        for(num=0;num<13;num++)
        {
                write_data(table1[num]);
                delay(20);
        }
        for(num=0;num<16;num++)
        {
                write_com(0x18);
                delay(20);
        }
        while(1);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~另一个程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <reg51.h> //51寄存器文件
#include <intrins.h>

typedef unsigned char BYTE;        //用BYTE代替unsigned char
typedef unsigned int WORD;//WORD代替unsigned int
typedef bit BOOL ;//用BOOL代替bit  

sbit rs        = P2^6; //复位端
sbit rw = P2^5; //写数据端
sbit ep = P2^7;        //使能端

BYTE code dis1[] = {"I LIKE MCU!"};
BYTE code dis2[] = {"www.PRECHIN.com"};

/*******************延时函数********************/
delay(BYTE ms)
{                                                       
        BYTE i;
        while(ms--)
        {
                for(i = 0; i< 250; i++)
                {
                        _nop_();
                        _nop_(); //空执行消耗CPU时间达到等待的效果
                        _nop_();
                        _nop_();
                }
        }
}

/*******************LCD侧忙函数********************/
BOOL lcd_bz()
{                                               
        BOOL result;
        rs = 0;
        rw = 1;
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1
        ep = 0;
        return result;//返回侧忙结果       
}

lcd_wcmd(BYTE cmd)
{                                                        // 写入指令数据到LCD
        while(lcd_bz());
        rs = 0;
        rw = 0;
        ep = 0;
        _nop_();
        _nop_();       
        P0 = cmd; //将8位指令通过P0口传给1602
        _nop_();
        _nop_();//用于产生一个脉冲宽度
        ep = 1;
        _nop_();
        _nop_();
        ep = 0;               
}

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

lcd_wdat(BYTE dat)       
{                                                        //写入字符显示数据到LCD
        while(lcd_bz());
        rs = 1;
        rw = 0;
        ep = 0;
        P0 = dat;//将8位数据通过P0口传给1602
        _nop_(); //用于产生一个脉冲宽度
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        ep = 0;       
}

lcd_init()
{                                          //LCD初始化设定
        lcd_wcmd(0x38);          ////16*2显示,5*7点阵,8位数据
        delay(1);
        lcd_wcmd(0x0c);          //显示开,关光标
        delay(1);
        lcd_wcmd(0x06);          //移动光标
        delay(1);
        lcd_wcmd(0x01);          //清除LCD的显示内容
        delay(1);
}

main()
{
        BYTE i;
        lcd_init();                                //初始化LCD                       
        delay(10);
        lcd_pos(4);                                //设置显示位置为第一行的第5个字符
        for(i=0;i<8;i++)
        {                                                //显示字符"welcome!"
                lcd_wdat(dis1);
        }
        lcd_pos(0x41);                        //设置显示位置为第二行第二个字符
        for(i=0;i<16;i++)
        {
                lcd_wdat(dis2);        //显示字符"  www.PRECHIN.com  "
        }
        while(1);                                //
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
兵荒马乱的小青
1楼-- · 2019-07-16 01:59
你这个是看郭天祥视频的吧。
兵荒马乱的小青
2楼-- · 2019-07-16 05:48
void main()
{
        init();
        for(num=0;num<11;num++)
        {
                write_data(table[num]);
                delay(20);
        }
        write_com(0x80+0x53);////////////// 这里改成80+40试试。
        for(num=0;num<13;num++)
        {
                write_data(table1[num]);
                delay(20);
        }
        for(num=0;num<16;num++)
        {
                write_com(0x18);
                delay(20);
        }
        while(1);
skyfly_HUT
3楼-- · 2019-07-16 09:53
 精彩回答 2  元偷偷看……
411123879
4楼-- · 2019-07-16 10:52
skyfly_HUT 发表于 2013-7-18 20:44
你好,我认为你的问题不在测忙函数,1602比较低端,不用测忙函数也行,所以,你的问题主要在于你的write_co ...

嗯嗯,知道了,谢谢~~

一周热门 更多>