完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 xintuxing 于 2016-1-27 14:51 编辑
本帖内容: 一、回顾整体框图原理。 二、LCD12864实现的显示效果: 1、显示intorobot的LOGO; 2、显示ASCII码字符串; 3、显示汉字; 4、显示系统日期与时间; 5、显示指定大小的图片; 6、图片移动效果。 三、Intorobot ATOM 核心板与LCD12864的连接图分享。 四、各种显示效果的对应代码分享。 一、回顾整体框图原理: 先来回顾一下这个小系统的整体框图,以便更容易看懂本帖的内容: 把LCD12864涂红是为了说明本帖主要介绍LCD12864硬件连接与代码的分享。 再来看一看实物图: 二、LCD12864实现的显示效果: 1、显示IntoRobot 的LOGO: 2、显示ASCII码字符串: 3、显示汉字: 汉字显示可以选择正常显示和反白显示两种。在单机操作的时候,反白显示的可以作为选中的操作项。 4、显示系统日期与时间: 日期与时间是从服务器获取的,不用调整也是准确的。 5、显示指定大小的图片: 图片中的两个箭头是16*16大小的图片,st芯片的轮廓图是24*24大小的图片。 6、图片移动效果展示: 图片中的三个图往下按像素点移动,用LCD12864做动画效果很不好,液晶的速度不够。 三、Intorobot ATOM 核心板与LCD12864的连接图: 图片做得比较难看,认真看还是能够看出连接的原理的。 四、各种显示效果的对应代码分享1、显示ASCII码字符串的函数,是IntoRobot官方函数,加了this->delaytime = 300和WriteCommand(0x30)两句。为了在连续写入图片的后,兼容字符显示。加上this->delaytime = 300原因是写命令和写数据的函数里面都有跟delaytime变量有关的延时,LCD12864写字符的速度和写图片的数据的速度不一样,写字符速度较慢,写图片较快。
2、下面是写入整屏图片的官方函数,为了提高写入速度,也加了this->delaytime = 0。 void LCD12864B::DrawFullScreen(uchar *p) { int ygroup,x,y,i; int tmp; // WriteCommand(0x34); this->delaytime = 0; for (ygroup=0;ygroup<64;ygroup++) { if(ygroup<32) { SetAdrress(1,ygroup); SetAdrress(1,0); } else { SetAdrress(1,ygroup-32); SetAdrress(3,0); } tmp=ygroup*16; if(p!=NULL) { for (i=0;i<16;i++) { WriteData(p[tmp++]); } } else { for (i=0;i<16;i++) { WriteData(0); } } } } 3、下面是描绘一个16*16 的汉字: void LCD12864B::DrawChinese(int Xstart,int Ystart,uchar *ChinesePtr,uchar Reverse) { if((Xstart+16 > 64) || (Ystart+2 > 9) ) return; //可防止显示错误 int x,width; uchar temp; this->delaytime = 0; // WriteCommand(0x34); for (x=Xstart;x if(x<32) { SetAdrress(1,x); SetAdrress(1,Ystart); } else { SetAdrress(1,x-32); SetAdrress(3,Ystart); } for (width=0;width<2;width++) { if(ChinesePtr != NULL) { temp = *ChinesePtr++; if(Reverse==1) { temp = ~temp; } WriteData(temp); } else { WriteData(0); } } } // WriteCommand(0x36); // WriteCommand(0x30); } 4、实现写入指定大小图片的函数: void LCD12864B::DrawAWindow(int Xstart,int Ystart,int Width,int Height,uchar *PicPtr) { if((Xstart+Height > 64) || (Ystart+ Width > 128)) return; int x,y; // WriteCommand(0x34); this->delaytime = 0; for (x=Xstart;x if(x<32) { SetAdrress(1,x); SetAdrress(1,Ystart); } else { SetAdrress(1,x-32); SetAdrress(3,Ystart); } for (y=0;y if(PicPtr != NULL) { WriteData(*PicPtr++); } else { WriteData(0); } } } } 5、SetAdrress函数:
6、函数的工程文件包含如下: LCD12864的基础函数如设置引脚和写命令函数等的函数是从官网公用库里复制过来的,不能直接在库里编辑,但能复制。 让我不解的是为什么省略代码行,编辑了几次依然如此: 本帖到此结束。下一贴将分享NRF24L01无线模块和实现远程控制家用照明灯。 |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 19:56 , Processed in 0.684947 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号