使用 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); // 写入低字节 }
代码解释
- 写命令和写数据函数:用于向LCD12864发送命令和数据。
- 读数据函数:用于从LCD12864读取数据。
- 设置GDRAM地址函数:用于设置GDRAM的X和Y地址。
- 读取GDRAM数据函数:用于读取GDRAM中的数据。
- 画点函数:用于在指定位置画点,并通过按位与操作避免复写问题。
总结
通过上述代码实现,用户可以成功读取GDRAM数据,并通过按位与操作实现多次画点而不复写。希望这个解决方案能帮助用户解决LCD12864编程中的问题。
如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 android studio导航组件根据导航图配置如何自动生成
- ¥20 C#上传XML格式数据
- ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
- ¥100 单片机hardfaulr
- ¥20 手机截图相片分辨率降低一半
- ¥50 求一段sql语句,遇到小难题了,可以50米解决
- ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
- ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
- ¥15 虚拟机检测,可以是封装好的DLL,可付费
- ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)