当前位置:
文档之家› 由LCD12864初探嵌入式菜单设计(完全资料)
由LCD12864初探嵌入式菜单设计(完全资料)
1、位操作 向 LCD12864 这种二值屏幕,我们习惯于用 1 个字节表示连续的 8 个点,1 对应对应位被点亮,0 表示不
亮,所以对图形的操作最基本的手段就是位操作。 复习下,常用的位操作,假设 Dis 表示某一个现存地址的内容 Dis = Dis~ 黑白颠倒 Dis &= ~(1<<n) 第 n 处被擦去, Dis |= (1<<n) 第 n 处被画了一个点 Dis ^= (1<<n) 如果 n 处是亮的,就变被擦掉;如果 n 处是空白的,就被点亮…… …… 差不多就这些
default: TempData |= (1 << BX);
}
setY(X);
500361 sendDataToLCD(TempData); ll648 } om/ba 特别说明一下,关于贪食蛇范例的问题,这篇文章里面只会简单得提及一下。 idu.c 作为嵌入式系统开发的一个范例,我会另外开一个帖子详细说明开发过程。 i.ba 这个范例将作为介绍嵌入式系统开发方法的一个很好的例子,用于解释一个系统和一段表示您调通了某一 ://h 个功能的代码之间有什么区别,同时也将介绍嵌入式开发系统的几种模式(超级循环、调度器),顺便侃一
PDF 文件使用 "pdfFactory Pro" 试用版本创建
首先,我们从最基本的数学算法说起。 如果我们使用公式 y = kx + b 来作为绘图的依据,那么就需要分 3 种情况:水平直线,斜率为 0;垂直直
硬件平台:AVR Mega8 级 LCD: 不带字库的 12864 软件平台:ICC 规范: 符合基本的 C 编程规范
3、何时开始正文 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求, 考虑到各位兄弟的胃口,我就多罗嗦下。
PDF 文件使用 "pdfFactory Pro" 试用版本创建
2、作图原理 点是一切光栅显示设备的基本要素,所有的操作都是以点为基础的,所以学会如何利用点构成线、圆、
填充就是必须掌握的——几何不能太差哦。 还有,结合屏幕的硬件特点,对算法进行优化的一些方法也是需要掌握的。比方说,如何填充之类的……
后面会针对 LCD12864 ቤተ መጻሕፍቲ ባይዱ详细介绍的。
361 3、人机交互学 0 虽然很多人都没有实实在在学过这门功课,但是多多少少对于界面应该怎样有些许了解。如何利用手中 50 的基本操作函数做出一些特效,如何安排窗体,如何绘制图形界面的一些基本元素如按钮,甚至如何显示 48 汉字,都是人际交互学需要教会你的——总之,如果你没有学过这门课程,你的产品只有你自己用的话—— ll6 跟着感觉走,没错的。 m/ba 4、最最重要的物质基础 o 你要掌握一种单片机,掌握一种点阵屏幕。 u.c AVR Inside id Not Only For LCD12864 ://hi.ba 前面已经说过,对于栅格显示设备来说,点是一切图形的基础,说白了,不会在液晶屏幕的任意位置随
{
char DX = (Y >> 3); char BX = Y - (DX << 3);
//计算出属于哪个字节 //计算出属于字节哪一位
char TempData = 0;
PDF 文件使用 "pdfFactory Pro" 试用版本创建
LCD12864_ChooseBoth;
以后,我们的操作都是针对显示缓冲区的。显示缓冲区将成为一个概念,无论这个缓冲区位于 SRAM 内 还是 LCD 内部。比方说,我们需要一个低成本的游戏机——如做一个贪食蛇游戏机送给老师作为课程设计, 或者送给小侄子,那么,M8 甚至是 M48 成为首选,问题是,M8 绝对无法开辟出一个 8 * 128 = 1K 大小的 数组,所以,这个时候,认定 LCD 的片内存储器作为显示缓冲区就是不二的选择——好在贪食蛇速度太快 了也没有办法玩哈。
很多朋友就要提问了:我们为什么不直接对屏幕操作呢?
事实上,LCD 本身存在一块显示存储器,也可以被认为是一个显示缓存,直接写在这个存储器的数据并 非直接显示出来,而多半需要一个显示指令来影射一下。我们有时候也通过这种类似的技术来实现很大的 图片的显示——先画好,再拿给大家看,让人以为你是一下就画好的,当然如果你刻意需要那种图片被“画” 出来的效果,则不在讨论之列。问题就在于,LCD 是片外资源,对其存储器的访问可以被认为是对片外存
setX(DX); if (X > 63) {
LCD12864_ChooseCS2; X -= 64;
}e{}selstLeYC(XD)1;2864_ChooseCS1h; ttp:///ball648500361
TempData = getLCD12864Data();
switch (Type) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建
假设输入的是正常习惯的坐标 X,Y DX DY 就是 LCD 上的坐标,那么转换关系是
char DX = (Y >> 3); char BX = Y - (DX << 3); char DY = X;
m/ba # define LCD12864_Graphic_Draw
0x01
u.co # define LCD12864_Graphic_Clear
0x00
http://hi.baid # define LCD12864_Graphic_Not
0x02
……
void LCD12864Draw(char X,char Y,char Type)
当然,太过于理论的东西对我们是没有多少实际价值的。下面,我就介绍两种常见的画线思路,一种就 是最容易被想到的直线方程计算的方法,另外一种则是被称为布兰森汉姆(Bresenham)的计算机图形学主流 算法。
在介绍完这两种算法以后,我们会针对 LCD12864 的硬件结构为例子,介绍,具体算法的实现和优化。
再次,根据用户所需画点的类型(擦除、画点、反相点)来进行相应的操作获得一个新的数据; 最后,将该数据写回原来的地址。
--------------------------------------------LCD12864 补充知识 1、关于坐标系。很多人,包括笔者,一开始都看不懂 LCD12864 的内存影射方式,感觉 X、Y 似乎不是那 么回事。后来才发现,只要把屏幕竖着放一切就好懂了。X 还是横轴,Y 还是竖轴……但是这显然不符合 我们的习惯,我们习惯于长的那个边作为横轴,所以需要一点点坐标之间的转换。
由 LCD12864 初探嵌入式系统设计
--菜单设计
声明:本文来自互联网,由于年代久远未能找到出处,现整理如下希望大家喜欢,如有侵权请联系 真的好想你 QQ: 1320249827 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。 1、为什么我要写这篇文章。
不可否认,我的确受到了 Armok 的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有 必要的。在 OurAVR 上看到很多版本的 LCD 驱动程序,几乎每一个版本都只是简单的将全部或部分的显示 数据 Cover 到 LCD 的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。 对一个工程项目来说,增加 n 多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和 Now Loading...Please Standy By 的提示能糊弄的过去的。用户希望你提供的是友好的图形界面 GUI,虽然比
PDF 文件使用 "pdfFactory Pro" 试用版本创建
储器的访问,其速度显然没有对片内 SRAM 的操作速度要快。如果我们使用那种常用的串行方式来作图(所 谓串行方式作图,就是绘图指令的执行和系统的其他操作时串行的,指令不完成,其它操作就不回被执行), 那么对于一些实时性要求高的系统来说就会造成重大隐患——甚至是不符合要求的;如果开辟一段片内存 储空间和 LCD 的存储器一一对应,在相同的时间段内,花费相同的资源来保持着两个存储空间的一致性, 那么就可以保证实时系统的稳定和可靠,保证画面显示的正常(因为允许跳帧嘛^_^)。这就是我们为什么 需要另外在片内选取一个显示缓冲区的原因。
case LCD12864_Graphic_Clear: TempData &= ~(1<<BX); break;
PDF 文件使用 "pdfFactory Pro" 试用版本创建
case LCD12864_Graphic_Not: TempData ^= (1 << BX); break;
1 不过 XP 和 Apple 的华丽,但是由各种基本图形组成的窗口界面还是需要的。 036 当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱 50 动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有 DirectX 的华丽,但是能绘制一个任 48 意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入 ll6 式工程师和一个业余电子爱好者之间的门槛。 /ba 2、我如何写这篇文章 i.baid 考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续 ://h 集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家 http 胃口,请见谅。
1 绕了这么多的弯子,究竟如何画点呢?我还想多补充一个原因,关于,为什么需要显示缓冲区,由于点 36 阵屏幕使用的是 1 个字节来表示 8 个点的,如果你想使得一个字节中的某一个点被操作而不影响别的点, 0 你起码要知道原来这个位置是什么内容,对于有些使用 595 级联的 LCD 设备来说,无法直接从 LCD 读取 50 现存数据,所以开辟一个缓冲区,从中获得信息加以加工以后再放回去,是这种设备处理显示图形的唯一 48 方法——当然我们没有那么惨,但是从 LCD 中获取所需点所在字节的内容还是必须的,不然你画一个点就 ll6 会破坏一条线上所有的数据。 /ba 好的,那么我们实际上已经明确了如何去画一个点。 i.baid 首先,根据用户给出的坐标计算出所要画的点所在现存内的地址偏移量; http://h 然后,我们读出该地址内的数据;