手上有一片 SmartM-M051 开发板,板上使用了新唐的 M051,这片板子可以接上了 LCD12864 图型点阵 LCD,板子的硬件架构是使用 74LS164 这样的串入并出IC来输出驱动 LCD 所需要的并口数据:
这种架构的好处是可以减少 GPIO 的使用,使用2支 GPIO 就可以输出所需要的并口数据,但是缺点就是这种电路无法读回 LCD 的内部状态与显示内存 GDRAM 的数据,比如说在写入数据之前无法先判断 LCD 是否在 BUSY 状态,因此只能在写入动作之后增加延时回路来确保 LCD 能够确实的完成工作,而最大的问题是当要使用到点阵绘图功能时,因为无法读回内部 GDRAM 而让绘图功能无法有效的应用,LCD12864 的 GDRAM 读写一次是以 2byte 为单位,当显示内容要更新的时候并无法读回原来的数据处理后再写回,而这样就无法实现在任意位置画点这样的功能。
这里提供了一个解决的办法,我们在程序里宣告了一块跟 LCD 内部 GDRAM 相同大小的二维数组做为显示内存:
GDRAM[16][64]
而程序的所有绘图功能就针对这块显示内存做处理,然后再呼叫 Ds_GDRAM() 函数将数组全部写入 LCD 内部的 GDRAM,这样就可以实现画点的功能了,只是这种方式的缺点就是将数组写入 LCD 内部 GDRAM 的执行时间会比较长,因此 LCD 显示的刷新率就不是太高了。
这里提供了一个演示程序演示了画点,画线跟画圆的功能:
// 画点函数
void PlotDot(uint8_t x , uint8_t y)
// 画水平线函数
void GUI_hline(uint8_t x0 , uint8_t x1 , uint8_t y)
// 画垂直线函数
void GUI_rline(uint8_t x , uint8_t y0 , uint8_t y1)
// 画直线函数
void GUI_line(uint8_t x0 , uint8_t y0 , uint8_t x1 , uint8_t y1)
// 画圆函数
void GUI_circle(uint8_t x0 , uint8_t y0 , uint8_t r)
效果如下:
SmartM-M051 开发板原理图
SmartM-M051.pdf
(45.07 KB)
工程文件,使用 KEIL 4.72 与 M051_Series_BSP_CMSIS_Rev3.00.002 库
A019.rar
(1.44 MB)
|