ghj2932 2026-01-28 01:36 采纳率: 0%
浏览 1

在LCD12864上 为什么一直是0FF(十进制是255)

img

img

img

img

img

img

这个是江协科技51单片机的DS1302时钟project的作品 我的源代码 找不出有什么问题(同标题) 很苦恼 可否来救一下

而且 我更想问 我这个单片机计时器 我更想知道解除保护的指令是什么。

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-28 01:37
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你提到在使用 LCD12864 显示时,一直显示 0xFF(十进制是 255),这说明你在向 LCD 发送数据时可能出现了问题。根据你的描述,这是江协科技的 51 单片机 DS1302 时钟项目,所以我们可以从以下几个方面来分析和解决这个问题。


    🚨 问题分析

    1. 0xFF 的含义

    • 在 LCD 中,0xFF 表示的是一个字符码,通常代表“空白”或“无效字符”,也可能是因为没有正确发送字符代码。
    • 如果你看到的是 0xFF,说明你可能在写入 LCD 时,没有正确发送字符内容,或者 LCD 没有被正确初始化。

    ✅ 可能的原因及解决方案

    1. LCD 初始化不正确

    重点:LCD 必须先进行初始化,否则无法正常显示字符。

    解决方案:

    • 确保你已经执行了 LCD 的初始化函数,包括设置显示模式、关闭光标、清屏等操作。
    • 例如,以下是一个标准的 LCD12864 初始化流程:
    void LCD_Init() {
        // 设置为 8 位数据模式
        LCD_Write_Cmd(0x38); // 8-bit data, 2 lines, 5x7 dots
        LCD_Write_Cmd(0x0C); // Display on, cursor off, blink off
        LCD_Write_Cmd(0x01); // Clear display
        LCD_Write_Cmd(0x06); // Entry mode set: increment, no shift
    }
    

    加粗部分:必须确保初始化函数被执行。


    2. 数据/命令写入错误

    重点:LCD 需要区分“写入命令”和“写入数据”。

    解决方案:

    • 确保你使用了正确的函数来发送命令或数据。
    • 例如:
    void LCD_Write_Cmd(unsigned char cmd) {
        P0 = cmd;             // 假设 P0 是数据总线
        RS = 0;               // 选择命令寄存器
        RW = 0;               // 写操作
        EN = 1;               // 使能信号高电平
        delay_ms(1);          // 等待稳定
        EN = 0;               // 使能信号低电平
    }
    
    void LCD_Write_Data(unsigned char data) {
        P0 = data;
        RS = 1;               // 选择数据寄存器
        RW = 0;
        EN = 1;
        delay_ms(1);
        EN = 0;
    }
    

    加粗部分:必须正确区分命令和数据写入。


    3. 未正确发送字符内容

    重点:LCD 显示的是字符码,不是 ASCII 或十六进制数值。

    解决方案:

    • 如果你想显示数字,比如 12,应该发送对应的字符码,而不是 0xFF
    • 例如:
    LCD_Write_Cmd(0x80); // 移动光标到第一行第一个位置
    LCD_Write_Data('1'); // 显示 '1'
    LCD_Write_Data('2'); // 显示 '2'
    

    加粗部分:不要直接发送 0xFF,而是发送字符的 ASCII 值。


    4. 硬件连接问题

    重点:LCD 接线错误可能导致显示异常。

    解决方案:

    • 检查 LCD 与单片机之间的接线是否正确,尤其是:
      • 数据线(D0-D7)
      • RS、RW、EN 控制线
      • 电源和地线
    • 使用万用表测试各引脚是否正常。

    5. 未正确控制显示位置

    重点:LCD 显示的位置需要通过命令控制。

    解决方案:

    • 使用 0x80 + 地址 来移动光标到特定位置。
    • 例如:
    LCD_Write_Cmd(0x80); // 第一行第一列
    LCD_Write_Data('A');
    LCD_Write_Cmd(0xC0); // 第二行第一列
    LCD_Write_Data('B');
    

    加粗部分:必须正确设置光标位置。


    🧠 代码建议(修改后的示例)

    下面是一个完整的 LCD12864 显示“HELLO”的示例代码片段:

    #include <reg52.h>
    
    #define LCD_PINS P0
    #define RS P2_0
    #define RW P2_1
    #define EN P2_2
    
    // 延时函数
    void delay_ms(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 127; j++);
    }
    
    // 写命令
    void LCD_Write_Cmd(unsigned char cmd) {
        LCD_PINS = cmd;
        RS = 0;
        RW = 0;
        EN = 1;
        delay_ms(1);
        EN = 0;
    }
    
    // 写数据
    void LCD_Write_Data(unsigned char data) {
        LCD_PINS = data;
        RS = 1;
        RW = 0;
        EN = 1;
        delay_ms(1);
        EN = 0;
    }
    
    // 初始化 LCD
    void LCD_Init() {
        LCD_Write_Cmd(0x38); // 8-bit mode, 2 lines, 5x7 dots
        LCD_Write_Cmd(0x0C); // Display on, cursor off
        LCD_Write_Cmd(0x01); // Clear display
        LCD_Write_Cmd(0x06); // Increment cursor
    }
    
    // 显示字符串
    void LCD_Display_String(char *str) {
        while (*str) {
            LCD_Write_Data(*str++);
        }
    }
    
    void main() {
        LCD_Init();
        LCD_Write_Cmd(0x80); // 移动到第一行
        LCD_Display_String("HELLO");
        while (1);
    }
    

    ✅ 总结

    | 问题 | 原因 | 解决方案 | |------|------|----------| | 显示 0xFF | 未正确发送字符或命令 | 确保使用 LCD_Write_Cmd()LCD_Write_Data() | | 显示乱码 | 初始化错误 | 执行 LCD_Init() | | 光标位置错误 | 未设置光标位置 | 使用 0x80 + 地址 设置位置 | | 硬件连接错误 | 引脚未正确连接 | 检查所有引脚连接 |


    如果你能提供具体的源代码片段,我可以进一步帮你定位问题所在。希望以上内容能帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 修改了问题 1月28日
  • 创建了问题 1月28日