找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6037|回复: 6
打印 上一主题 下一主题
收起左侧

请教关于lcd1602液晶显示一行黑块的问题

[复制链接]
跳转到指定楼层
楼主
本帖最后由 啊_奶瓶 于 2021-1-8 21:08 编辑

大佬们,为什么我的液晶可以亮,但是不能显示字符呢
代码是没有问题的,我直接抄书上的代码也不能让他显示字符,只是单纯的亮着,请问是怎么一回事,该怎么解决

单片机源程序如下:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LOVE MCU!";
uchar code table1[]="www.51hei.COM";
sbit lcden=P3^4;//液晶使能端
sbit lcdrs=P3^5;//液晶数据命令选择端
sbit dula=P2^6;//声明U1锁存器的锁存端
sbit wela=P2^7;//声明U2锁存器的锁存端
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(0x0c);
write_com(0x06);
write_com(0x01);
}

void main()
{
init();

write_com(0x80);
for(num=0;num<11;num++)
        {
         write_data(table[num]);
         delay(5);
        }
        write_com(0x80+0x40);
        for(num=0;num<11;num++)
        {
         write_data(table1[num]);        
   delay(5);               
        }
  while(1);
}

51hei图片20210107160429.jpg (2.36 MB, 下载次数: 64)

51hei图片20210107160429.jpg

BST-V51原理图 v3.0.pdf

70.84 KB, 下载次数: 4

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2021-1-7 17:17 | 只看该作者
来看一下51hei论坛里面解决此问题的痛苦经历吧:
搜索"1602 方块"或者"1602 黑块"或者"1602 白块"或者"1602 格":

这个是io口设置问题,最终搞定了:http://www.51hei.com/bbs/dpj-199732-1.html
http://www.51hei.com/bbs/dpj-168643-1.html

既有可能是软件问题也有硬件问题
http://www.51hei.com/bbs/dpj-187378-1.html
http://www.51hei.com/bbs/dpj-160754-1.html
回复

使用道具 举报

板凳
ID:390416 发表于 2021-1-7 18:28 | 只看该作者
LCD1602显示数字 以及℃ 这种自定义符号  你可以看看我的贴子
http://www.51hei.com/bbs/dpj-200685-1.html
回复

使用道具 举报

地板
ID:743654 发表于 2021-1-7 20:11 | 只看该作者
调节对比度,VO 和 GND之间接一个10k的可调电阻。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:213173 发表于 2021-1-7 20:38 | 只看该作者
软件都是基于硬件编写的,如果这个程序不是此学习板的配套示例,就不能保证正常工作。把此板的原理图发上来帮你看看。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:517466 发表于 2021-1-7 21:17 | 只看该作者
从现象来看,是LCD1602处于刚加电状态下的显示情况。说明你的驱动处理没有起作用。
建议:
1、检查接线情况是否正常
2、检查程序中IO口设置和硬件的实际连线是否一致
3、LCD1602的驱动部分,与LCD1602的技术要求是否一致(时序是否匹配、指令和数据的执行顺序是否正确)
看你的代码,在液晶初始化的处理中,指令之间没有必要的延时,恐怕是问题所在。
以下是我用过的代码:
sbit rs=P0^7;
sbit rw=P0^6;
sbit ep=P0^5;

void delay (ulong m) {
        while(m--);
}

BOOL lcd_bz() {
        BOOL result;
        rs=0;           // 读忙信号
        rw=1;
        ep=1;
        _nop_();_nop_();_nop_();_nop_();
        result = (BOOL)(PDATA&0x80);
        ep=0;
        result ;
}

void lcd_wcmd (BYTE cmd) {
        while (lcd_bz());
        rs=0;
        rw=0;
        ep=0;
        _nop_();
        _nop_();
        PDATA=cmd ;
        _nop_();_nop_();_nop_();_nop_();
        ep=1;
        _nop_();_nop_();_nop_();_nop_();
        ep=0;
}
//80H+ 地址码( 0-27H ,40H-67H)
void lcd_pos (BYTE pos) {
          lcd_wcmd (pos|0x80);
}
void lcd_wdat (BYTE dat) {
        while (lcd_bz());
        rs=1;
        rw=0;
        ep=0;
        _nop_();_nop_();
        PDATA=dat ;
        _nop_();        _nop_();        _nop_();        _nop_();
        ep=1;
        _nop_();        _nop_();        _nop_();        _nop_();
        ep=0;
}

void lcd_init () {
        lcd_wcmd (0x38);
        delay(1200);
        lcd_wcmd (0x0c);
        delay(1200);
        lcd_wcmd (0x06);
        delay(1200);
        lcd_wcmd (0x01);
        delay(1200);
}

主程序中:
        lcd_init();
        delay (20);
       
        lcd_pos (0); // 定位第一行
        i=0;
        while (dis1 [i]!='\0')        {
                 lcd_wdat (dis1 [i]); // 显示一行数据
                 i++;       
        }
       
        lcd_pos (0x40); // 定位第二行
        i=0;
        while (dis2 [i]!='\0')        {
                 lcd_wdat (dis2 [i]); // 显示一行数据
                 i++;       
        }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:517951 发表于 2021-1-7 21:24 | 只看该作者
显示一行黑块的原因就是LCD1602的初始化代码没有送入显示器的驱动IC,需要检查11条数据线是否可靠连接, 数据线位宽4位还是8位,4位宽数据线设置时指令和数据要分2次送入。1602驱动IC是慢速器件,时序需要一定时间的保持宽度。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表