小兔子先生 2024-07-14 11:43 采纳率: 75%
浏览 2
已结题

LCD12864 显示屏 C51 编程

使用 89c52 针对 LCD 12864 编程,我想单独画点是可以实现的,但是因为绘图行是 16 位写入, 同一行的临近 16 个点位,会存在复写问题,我的想法是读取当前 绘图 RAM 位置的数据 GDRAM _data,然后GDRAM _data&NEW _data ,就可以实现多次画点,不复写的情况,但是编写读取数据的函数出现了问题,请求解答疑惑。

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-07-14 11:45
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在使用89c52单片机对LCD12864显示屏进行编程时,遇到了绘图行16位写入导致的临近点位复写问题。用户希望通过读取当前绘图RAM位置的数据GDRAM _data,并与新数据NEW _data进行按位与操作,以避免复写问题。但在编写读取数据的函数时遇到了问题。

    解决方案

    1. 读取GDRAM数据的函数编写

    首先,我们需要编写一个函数来读取GDRAM中的数据。LCD12864的GDRAM地址分为X地址和Y地址,我们需要分别设置这两个地址,然后读取对应的数据。

    2. 按位与操作

    读取到GDRAM数据后,我们需要将其与新数据进行按位与操作,以确保不会覆盖原有数据。

    3. 代码实现

    以下是详细的代码实现步骤:

    #include <reg52.h>
    
    #define LCD12864_RS P2_0
    #define LCD12864_RW P2_1
    #define LCD12864_EN P2_2
    #define LCD12864_DATA P0
    
    // 函数声明
    void LCD12864_WriteCmd(unsigned char cmd);
    void LCD12864_WriteData(unsigned char data);
    unsigned char LCD12864_ReadData(void);
    void LCD12864_SetGDRAMAddress(unsigned char x, unsigned char y);
    unsigned int LCD12864_ReadGDRAM(unsigned char x, unsigned char y);
    void LCD12864_DrawPoint(unsigned char x, unsigned char y, unsigned char data);
    
    // 写命令
    void LCD12864_WriteCmd(unsigned char cmd) {
        LCD12864_RS = 0;
        LCD12864_RW = 0;
        LCD12864_DATA = cmd;
        LCD12864_EN = 1;
        LCD12864_EN = 0;
    }
    
    // 写数据
    void LCD12864_WriteData(unsigned char data) {
        LCD12864_RS = 1;
        LCD12864_RW = 0;
        LCD12864_DATA = data;
        LCD12864_EN = 1;
        LCD12864_EN = 0;
    }
    
    // 读数据
    unsigned char LCD12864_ReadData(void) {
        unsigned char data;
        LCD12864_RS = 1;
        LCD12864_RW = 1;
        LCD12864_EN = 1;
        data = LCD12864_DATA;
        LCD12864_EN = 0;
        return data;
    }
    
    // 设置GDRAM地址
    void LCD12864_SetGDRAMAddress(unsigned char x, unsigned char y) {
        LCD12864_WriteCmd(0x34); // 扩展指令集
        LCD12864_WriteCmd(0x80 | y); // 设置Y地址
        LCD12864_WriteCmd(0x80 | x); // 设置X地址
        LCD12864_WriteCmd(0x30); // 基本指令集
    }
    
    // 读取GDRAM数据
    unsigned int LCD12864_ReadGDRAM(unsigned char x, unsigned char y) {
        unsigned int data;
        LCD12864_SetGDRAMAddress(x, y);
        data = LCD12864_ReadData(); // 读取高字节
        data <<= 8;
        data |= LCD12864_ReadData(); // 读取低字节
        return data;
    }
    
    // 画点
    void LCD12864_DrawPoint(unsigned char x, unsigned char y, unsigned char data) {
        unsigned int GDRAM_data;
        unsigned int new_data;
        GDRAM_data = LCD12864_ReadGDRAM(x, y);
        new_data = (data << (y % 16)) & 0xFFFF;
        GDRAM_data |= new_data;
        LCD12864_SetGDRAMAddress(x, y);
        LCD12864_WriteData(GDRAM_data >> 8); // 写入高字节
        LCD12864_WriteData(GDRAM_data & 0xFF); // 写入低字节
    }
    

    代码解释

    1. 写命令和写数据函数:用于向LCD12864发送命令和数据。
    2. 读数据函数:用于从LCD12864读取数据。
    3. 设置GDRAM地址函数:用于设置GDRAM的X和Y地址。
    4. 读取GDRAM数据函数:用于读取GDRAM中的数据。
    5. 画点函数:用于在指定位置画点,并通过按位与操作避免复写问题。

    总结

    通过上述代码实现,用户可以成功读取GDRAM数据,并通过按位与操作实现多次画点而不复写。希望这个解决方案能帮助用户解决LCD12864编程中的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月22日
  • 已采纳回答 7月14日
  • 创建了问题 7月14日

悬赏问题

  • ¥15 android studio导航组件根据导航图配置如何自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)