| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3110 人关注过本帖
标题:LCD1602程序错在哪?求助
只看楼主 加入收藏
大漠苍穹
Rank: 1
等 级:新手上路
威 望:1
帖 子:11
专家分:0
注 册:2016-7-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
LCD1602程序错在哪?求助
/*************************************************************************
*    功能:在LCD第一行显示hello world                                     *
*                                                                         *
* P0口接DB0——DB7    P1.0——RS    P1.2——RW    P2.5——E                     *
*                                                                         *
*************************************************************************/
/*************************************** my1602.h *********************************************************/

#define dataline P0     //使用P0作为数据线

sbit RS = P1^0;            
sbit RW = P1^1;
sbit E = P2^5;

bit isBuzy();    //测试是否繁忙
void LCD_init();   //LCD初始化
void delay(unsigned char ms);    //延时x ms
void sendCMD(unsigned char cmd);        //发送指令
void setPos(unsigned char pos);        //设置光标显示的位置
void sendData(unsigned char Data);    //发送数据

/************************************* my1602.c ************************************************************/

#include <reg52.h>
#include <intrins.h>
#include "my1602.h"

void LCD_init()
{
    delay(15);            //延时15ms
    sendCMD(0x38);           //设置为16 * 2显示, 5 * 7点阵,8位数据口
    while(1);
    delay(5);   
    sendCMD(0x38);
    delay(5);
    sendCMD(0x38);
    delay(5);
    sendCMD(0x38);
    sendCMD(0x08);        //显示关闭
    sendCMD(0x01);        //显示清屏
    sendCMD(0x06);        //显示光标移动设置
    delay(5);
    sendCMD(0x0c);        //显示开,光标关
}

/*****************************************************
*            延时 x ms                                 *
*****************************************************/
void delay(unsigned char ms)        
{
    unsigned char i;
    for(ms; ms > 0; ms--)
    {
        for(i = 250; i > 0; i--)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
    }
}

/**********************************************************
*        测试是否处于繁忙                                  *
**********************************************************/
bit isBuzy()
{
    bit result;
     E = 0;
    RS = 0;
    RW = 1;
    _nop_();    //给LCD反应时间
    E = 1;
    _nop_();   //E的周期要达到一定值
       result = (bit)(dataline & 0x80);    //读取端口
    return result;
}

/**********************************************************
*        发送命令函数                                      *
**********************************************************/
void sendCMD(unsigned char cmd)
{
    E = 0;
    while(isBuzy());    //等待LCD空闲
    RS = 0;
    RW = 0;
    dataline = cmd;        //发送指令
    _nop_();            //给LCD芯片反应时间
    E = 1;
    _nop_();           //使E信号周期达到一定值
    E = 0;
}

/******************************************************
*        设置光标位置函数 只能正确显示第一行              *
******************************************************/
void setPos(unsigned char pos)
{
    sendCMD(pos | 0x80);    //发送指令
}

/*****************************************************
*        写入数据函数                                 *
*****************************************************/
void sendData(unsigned char Data)
{
    E = 0;
    while(isBuzy() == 1);    //等待LCD空闲
    RS = 1;
    RW = 0;
    _nop_();              //给LCD芯片反应时间
    E = 1;
    dataline = Data;
    _nop_();      //使E信号周期达到一定值
    E = 0;
}

/******************************************** main.c ***************************************************/

#include <reg52.h>
#include "my1602.h"

sbit DU = P2^6;
sbit WE = P2^7;

void closeLED()         //关闭用于数码管的锁存器
{
    DU = 0;
    WE = 0;   
}

void main()
{
    unsigned char i;
    char *disp = "hello world!";      //定义要显示的字符串


    closeLED();        //关闭锁存器

    LCD_init();       //初始化

    setPos(0x02);    //第一行第三个字符开始显示

   
    i = 0;
    while(disp[i] != '\0')
    {
        sendData(disp[i]);
        delay(5);
        i++;
    }
    while(1);
}

//        下载到芯片后什么都没有显示, 附件有芯片手册
搜索更多相关主题的帖子: hello world 
2017-01-16 23:06
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:20 
首先要确定硬件没有问题,可以通过调整对比度来观察LCD1602是否正常工作,调整过程中能看到矩形的点阵块,就证明硬件基本正常,当然实际使用时应该调整到全白的程度,否则就看不清字符了。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2017-01-17 12:24
大漠苍穹
Rank: 1
等 级:新手上路
威 望:1
帖 子:11
专家分:0
注 册:2016-7-27
收藏
得分:0 
回复 2楼 hu9jj
硬件没有问题,我的引脚用的跟例程的一样,下载例程的程序发现没有问题,然后我的程序可以清屏,我可以看到清屏的过程,但是我写入的数据不能显示。我不知道是不是我对时序图的理解有没有问题,我把时序图给放上来
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-01-17 13:32
大漠苍穹
Rank: 1
等 级:新手上路
威 望:1
帖 子:11
专家分:0
注 册:2016-7-27
收藏
得分:0 
按照我对时序图的理解,写数据操作的程序应该是这样:
令E = 0,为E = 1做准备
RS = 1;
RW = 0;
然后写数据到引脚;
接着延时1us,实际只要延时40ns以上,1us绰绰有余;
再然后E = 1;
延时1us;
E = 0;

不知道是不是这样
2017-01-17 13:39
大漠苍穹
Rank: 1
等 级:新手上路
威 望:1
帖 子:11
专家分:0
注 册:2016-7-27
收藏
得分:0 
已经搞定了,原来是我调试程序时在初始化中加的while(1);语句没有删调,气死我了。抱歉
2017-01-17 14:22
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
刚好学到这,楼主撒时候开始学的?
2017-01-17 15:29
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用大漠苍穹在2017-1-17 14:22:19的发言:

已经搞定了,原来是我调试程序时在初始化中加的while(1);语句没有删调,气死我了。抱歉

哦,程序在此死循环了。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2017-01-18 08:29
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
我刚开始组装的51单片机也是无任何显示,程序在开发板上运行正常,在自己焊接的板上就是不显示。我反复检查连线都找不到原因,最后还是发现对比度的电阻没有调整到合适的位置。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2017-01-18 08:34
大漠苍穹
Rank: 1
等 级:新手上路
威 望:1
帖 子:11
专家分:0
注 册:2016-7-27
收藏
得分:0 
回复 6楼 r316999443
大一有兴趣的时候玩下,现在不搞了
2017-08-13 23:47
快速回复:LCD1602程序错在哪?求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020917 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved