找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 271|回复: 11
收起左侧

LCD1602只显示方格不显示数据,怎么回事呢

  [复制链接]
ID:1121838 发表于 2024-6-25 13:25 | 显示全部楼层 |阅读模式

单片机STC89C52,做了一个HX711的称重电子秤。
程序:
#include <reg52.h>
#include <intrins.h>

// 定义LCD1602相关引脚
sbit RS = P2^6;   // RS引脚
sbit RW = P2^5;   // RW引脚
sbit E = P2^7;    // E引脚
sbit DATA = P0;   // 数据线引脚

// 定义HX711相关引脚
sbit PD_SCK = P1^5;   // 时钟引脚
sbit DOUT = P1^6;     // 数据引脚

// 定义独立按键引脚
sbit KEY = P3^2;

// 定义全局变量
bit tareFlag = 0;     // 去皮操作标志位
long tareValue = 0;   // 去皮值

// LCD1602写命令
void LcdWriteCmd(unsigned char cmd) {
    RS = 0;
    RW = 0;
    DATA = cmd;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}

// LCD1602写数据
void LcdWriteData(unsigned char dat) {
    RS = 1;
    RW = 0;
    DATA = dat;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}

// LCD1602初始化
void LcdInit() {
    LcdWriteCmd(0x38);   // 设置16x2显示模式
    LcdWriteCmd(0x0c);   // 开启光标并关闭闪烁
    LcdWriteCmd(0x06);   // 光标右移
    LcdWriteCmd(0x01);   // 清除显示
    LcdWriteCmd(0x80);   // 设置显示位置为第一行第一个字符
}

// HX711读取数据
long Hx711Read() {
    unsigned char i;
    long value = 0;

    while(DOUT);

    for (i = 0; i < 24; i++) {
        PD_SCK = 1;
        value = value << 1;
        _nop_();
        if (DOUT) {
            value++;
        }
        PD_SCK = 0;
        _nop_();
    }

    for (i = 0; i < 1; i++) {
        PD_SCK = 1;
        _nop_();
        PD_SCK = 0;
        _nop_();
    }

    return value;
}

// 延时函数
void Delay(unsigned int n) {
    unsigned int i, j;

    for (i = n; i > 0; i--) {
        for (j = 110; j > 0; j--);
    }
}

// 显示重量和去皮值
void DisplayWeight(long weight) {
    unsigned char i;
    unsigned long temp;
    unsigned char str[] = "Weight:";

    temp = weight;

    for (i = 7; i >= 0; i--) {
        str[7 - i + 7] = temp % 10 + '0';
        temp /= 10;
    }

    for (i = 0; i < 8; i++) {
        LcdWriteData(str[i]);
    }

    if (tareFlag) {
        unsigned char strTare[] = " Tare:";
        temp = tareValue;

        for (i = 7; i >= 0; i--) {
            strTare[7 - i + 6] = temp % 10 + '0';
            temp /= 10;
        }

        for (i = 0; i < 7; i++) {
            LcdWriteData(strTare[i]);
        }
    }
}

// 去皮操作
void Tare() {
    tareFlag = 1;
    tareValue = Hx711Read();
}

// 主函数
void main() {
    long weight;

    LcdInit();   // 初始化LCD1602
    Delay(5);

    while (1) {
        weight = Hx711Read();   // 读取重量

        if (tareFlag) {
            weight -= tareValue;   // 计算净重
        }

        DisplayWeight(weight);   // 显示重量

        if (KEY == 0) {
            Delay(50);
            if (KEY == 0) {
                Tare();   // 执行去皮操作
                while (!KEY);
                Delay(10);
            }
        }
    }
}


回复

使用道具 举报

ID:262 发表于 2024-6-25 14:23 | 显示全部楼层
来看一下51hei论坛里面解决此问题的痛苦经历吧:
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-208189-1.html
http://www.51hei.com/bbs/dpj-210690-1.html

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

使用道具 举报

ID:619259 发表于 2024-6-25 16:18 | 显示全部楼层
可能的原因:
1.对比度调节没调到最佳状态。
2.写命令和写数据程序存在问题,造成初始化失败和数据传输失败。分析你的代码,无忙检测,说明你采用盲测的方法,即写入数据时需要一定的延时,确保数据传输完毕,才能执行下一个指令。你代码中“E = 1;   _nop_();   E = 0;”,显然延时是不够的。因不同的显示屏的性能有差异,一般采用1ms延时,如果还不行,再加大延时。如果用的是更高速度的芯片,最好还是加上忙检测。
回复

使用道具 举报

ID:366877 发表于 2024-6-25 16:44 | 显示全部楼层
大概率是对比度调节出了问题。延时问题只要看看手册,按规定延时即可。
回复

使用道具 举报

ID:161164 发表于 2024-6-25 17:51 | 显示全部楼层



2024-06-25_174732.png
2024-06-25_174742.png
2024-06-25_175033.png



回复

使用道具 举报

ID:332444 发表于 2024-6-25 19:25 | 显示全部楼层
初学时用过带的代码似乎就是方块的现象,所以,一直没什么信心,很久后自己研究时序,自己写驱动,就再也没遇到方块问题,到我帖子里面对比看看。
回复

使用道具 举报

ID:1127243 发表于 2024-6-27 14:42 | 显示全部楼层
如果在查看了对比度和引脚连接问题后仍无法解决,可以尝试换一个显示屏。我们上次做就是给的显示屏坏掉了,查了很久的错最后换了一个就好了
回复

使用道具 举报

ID:1127342 发表于 2024-6-27 20:18 | 显示全部楼层
应该是对比度调节的问题,先试试改这个看看
回复

使用道具 举报

ID:329625 发表于 2024-7-2 09:08 来自手机 | 显示全部楼层
实物的话会出现这种状况 需要调节背光灯  然后同步做个仿真验证一下 仿真里面不会出现这种现象
回复

使用道具 举报

ID:517951 发表于 2024-7-7 11:45 | 显示全部楼层
如果显示两行的方格, 就应该是V0 需要调节.
如果显示一行的方格, 就应该是初始化代码没有正确的发送到1602的driver IC.
回复

使用道具 举报

ID:1128391 发表于 2024-7-7 14:00 | 显示全部楼层
第1行黑块,第2行空白,是1602本身上电复位成功的标志。意味着单片机没有进行初始化,需要检查电路.
两行都是显示黑块 尝试调节电位器,直到黑块消失。带背光的1602 lcd在上电复位的成功的时候,调整正确的时候是看不见黑块的。
回复

使用道具 举报

ID:1128391 发表于 2024-7-7 14:02 | 显示全部楼层
第1行黑块,第2行空白,是1602本身上电复位成功的标志。意味着单片机没有进行初始化,需要检查电路.两行都是显示黑块 尝试调节电位器,直到黑块消失。带背光的1602 lcd在上电复位的成功的时候,调整正确的时候是看不见黑块的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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