[牛人杂谈]

新唐使用笔记 - M051 的 LCD12864 显示程序

[复制链接]
4456|48
手机看帖
扫描二维码
随时随地手机跟帖
slotg|  楼主 | 2015-3-14 19:33 | 显示全部楼层 |阅读模式
手上有一片 SmartM-M051 开发板,板上使用了新唐的 M051,这片板子可以接上了 LCD12864 图型点阵 LCD,板子的硬件架构是使用 74LS164 这样的串入并出IC来输出驱动 LCD 所需要的并口数据:

02.JPG

这种架构的好处是可以减少 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)

效果如下:

IMAG0282X.jpg

SmartM-M051 开发板原理图
SmartM-M051.pdf (45.07 KB)
rejoice818| | 2015-3-15 09:38 | 显示全部楼层
支持,其实SmartMcu的开发板资料设计都不错,配套书籍上手快。

使用特权

评论回复
mintspring| | 2015-3-15 13:41 | 显示全部楼层
内容不错呀

使用特权

评论回复
mintspring| | 2015-3-15 13:42 | 显示全部楼层
画图很好,我要收藏了

使用特权

评论回复
mmuuss586| | 2015-3-15 17:03 | 显示全部楼层

牛人啊;

使用特权

评论回复
mintspring| | 2015-3-15 22:01 | 显示全部楼层
又看了一遍,发现楼主太有才了

使用特权

评论回复
598330983| | 2015-3-15 22:04 | 显示全部楼层
牛人,这个液晶屏代码通用吗

使用特权

评论回复
slotg|  楼主 | 2015-3-15 22:15 | 显示全部楼层
598330983 发表于 2015-3-15 22:04
牛人,这个液晶屏代码通用吗

应该是的

使用特权

评论回复
springvirus| | 2015-3-16 11:30 | 显示全部楼层
本帖最后由 springvirus 于 2015-3-16 11:32 编辑

楼主你好,手头有款2402的红色屏,2402手册上的51驱动程序,在AT89S52上已试过,可以点亮
现在想移植到Nuc472上,然而根据手册上的读写时序,在例如tAS,tEr这样的地方已添加适当延时,结果还是显示乱码,但看到光标闪烁的位置已是显示内容的末尾位置,能具体指点下移植这方面吗,谢谢了
LCD2402的手册:
DY2402PBL.pdf (948.79 KB)

使用特权

评论回复
slotg|  楼主 | 2015-3-16 11:43 | 显示全部楼层
springvirus 发表于 2015-3-16 11:30
楼主你好,手头有款2402的红色屏,2402手册上的51驱动程序,在AT89S52上已试过,可以点亮
现在想移植到Nuc4 ...

我先下载研究一下

使用特权

评论回复
xiaowu191| | 2015-3-16 13:54 | 显示全部楼层
下载来学习一下,谢谢

使用特权

评论回复
slotg|  楼主 | 2015-3-16 14:11 | 显示全部楼层
springvirus 发表于 2015-3-16 11:30
楼主你好,手头有款2402的红色屏,2402手册上的51驱动程序,在AT89S52上已试过,可以点亮
现在想移植到Nuc4 ...

这个是我先前写的 1602 测试程式让你参考一下:

IMAG0286X.jpg


main.rar (1.53 KB)

使用特权

评论回复
springvirus| | 2015-3-16 17:01 | 显示全部楼层
slotg 发表于 2015-3-16 14:11
这个是我先前写的 1602 测试程式让你参考一下:

非常感谢,看来void DelayUs(uint32_t unCnt),此函数是关键了
研究下472下如何实现

使用特权

评论回复
slotg|  楼主 | 2015-3-16 19:37 | 显示全部楼层
springvirus 发表于 2015-3-16 17:01
非常感谢,看来void DelayUs(uint32_t unCnt),此函数是关键了
研究下472下如何实现 ...

有找到问题后再分享一下了 :D

使用特权

评论回复
gaoyang9992006| | 2015-3-16 19:59 | 显示全部楼层
1602的比较好写,我按照时序自己写过,一次点亮。

使用特权

评论回复
springvirus| | 2015-3-22 15:13 | 显示全部楼层
slotg 发表于 2015-3-16 19:37
有找到问题后再分享一下了

用clk下的systick的us延时函数实现了,驱动2402成功,感谢您的指导:)

使用特权

评论回复
slotg|  楼主 | 2015-3-22 22:35 | 显示全部楼层
springvirus 发表于 2015-3-22 15:13
用clk下的systick的us延时函数实现了,驱动2402成功,感谢您的指导

恭喜,恭喜

使用特权

评论回复
www425531304| | 2015-4-11 14:10 | 显示全部楼层
原理图和程序都贴出了 有参照  辛苦了

使用特权

评论回复
quray1985| | 2015-4-19 20:37 | 显示全部楼层
支持,非常不错的资料
感谢分享

使用特权

评论回复
bobde163| | 2015-4-20 00:12 | 显示全部楼层
这个能不能用并行口转串行口的器件来实现读回数据呢?不知道有没有这样的器件

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1177

帖子

6

粉丝