




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
怎样在点阵屏上绘图基于LCD12864【一】专业 2008-09-27 16:37 阅读146评论0字号: 大大 中中 小小 前言 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会本文也不例外。1、为什么我要写这篇文章。不可否认,我的确受到了Armok的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurAVR上看到很多版本的LCD驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据Cover到LCD的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。对一个工程项目来说,增加n多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading.Please Standy By的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI,虽然比不过XP和Apple的华丽,但是由各种基本图形组成的窗口界面还是需要的。当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱动,我们需要的是一个图形引擎一个自定义的图形函数包,没有DirectX的华丽,但是能绘制一个任意的直线或是矩形就够了结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。2、我如何写这篇文章考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家胃口,请见谅。硬件平台:AVRMega8级LCD:不带字库的12864软件平台:ICC规范:符合基本的C编程规范3、何时开始正文Chapter Zero 预备知识 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求,考虑到各位兄弟的胃口,我就多罗嗦下。1、位操作向LCD12864这种二值屏幕,我们习惯于用1个字节表示连续的8个点,1对应对应位被点亮,0表示不亮,所以对图形的操作最基本的手段就是位操作。复习下,常用的位操作,假设Dis表示某一个现存地址的内容Dis = Dis黑颠倒Dis &= (1n) 第n处被擦去,Dis |= (1n)第n处被画了一个点Dis = (1 3); /计算出属于哪个字节char BX = Y - (DX 3); /计算出属于哪个字节char BX = Y - (DX 63)LCD12864_ChooseCS2;X -= 64;elseLCD12864_ChooseCS1;setY(X);TempData = getLCD12864Data();switch (Type)case LCD12864_Graphic_Clear:TempData &= (1BX);break;case LCD12864_Graphic_Not:TempData = (1 BX);break;default:TempData |= (1 inc thenplot = truex -= incif dx 0 then plotx +if dx inc thenplot = truey -= incif dy 0 then ploty +if dy 0 then ploty -if plot = true then 在(plotx,ploty)处画点这就是计算机图形学中流行的布兰森汉姆(Bresenham)算法,他的意图就是采用离散的整数增量来代替斜率增量计算,学习这个算法,最好的方法不是看多少理论,而是按照上面的伪代码自己完成一条直线的绘制工作,你就能心领神会了不是小弟我偷懒。所有的计算都是简单得整数计算,代码效率自然不用小弟我罗嗦哈。俗语说,巧妇难为无米之炊,有了点再有了直线算法,距离窗体的绘制不远了,But Stop! “没有最好,但求更好”这是我们做系统开发应该谨记的一条准则。有了上面的算法还不够,毕竟,他们只是一些伪代码,针对不同的屏幕准确地说,是针对不同的显存映射方式,有不同的算法优化方法。究竟有哪些优化方法暂且不论,其实他们都是一个原理,我想先解释一下,为什么我们需要优化算法,或者说,我们需要先弄清楚是什么地方产生了冗余。还记得黑白点阵屏幕的显存映射方式么?它简单的使用1个字节表示8个坐标点,同时这1个字节是沿着屏幕的短边方向映射的,所以当我们想画一条垂直的直线时,对于每一个牵涉到的字节都有可能要重复的操作8次之多,这种操作不是简单的画线,而是要先读取再计算最后再写这样的复合操作,重复8次只是为了把整个字节变黑显然是一种超级不可容忍的冗余大家都知道,直接把这个字节读取一次,计算一次,再写一次就完成了。基于这种思想,我们需要把这种特殊情况单独提取出来,重新优化代码具体优化代码就留给大家做作业了哈。同时补充一下,这样做,不是只对画线作了优化,事实上,在后面,矩形的填充里面,这种优化会极大地提高速度,因为填充的本质就是画线(点)例子程序:(这里就不附送了,为了大家不偷懒哈,最后一起会都给大家的)(Chapter One 完)Chapter Two Windows的世界 本章导读有一种技术被众人传说为GUI,神秘高深的程度不可言表,就连书店里面的电脑书籍封面上一旦印刷上这几个字就会身价百倍当然,也不乏像笔者这样买回去以后大呼上当的。我们今天不说桌面系统(Desktop System),笔者只是想戳穿一下GUI的虚伪表面,让书店生意冷淡下方解心头之恨。那么什么是GUI呢?就是图形界面接口(Graphic User Interface),说得通俗就是,一个方便人们和电脑打交道的傻瓜工具。一个简单的道理大家都懂得,文字说不清楚的事情,往往图形和表格能够让人一目了然。所以GUI对于电脑和人类交往起到一个平台的作用。说了这么多,我想说明一个问题,就是什么时候我们需要GUI系统。1、需要表达的信息和数据相当众多,关系用文字很难表达清楚;2、本身就存在大量图形的系统;3、没有任何追求花哨目的的系统开发;4、用户群体复杂,非固定群体,或者这一群体需要有好清晰的用户界面。苏东坡写诗文尚且追求让家里的老婆婆能懂得一二,何况我们花费大量心血的嵌入式系统(Embedded System)呢?大部分时候,一个由花哨的窗体和图标组成的窗口远不及一个句请稍候让人心中要坦然的许多。本章的内容,我们将首先介绍窗体的基本实现方法;然后我们将介绍一种非常适合LCD系统的美术窗体;最后我们将针对LCD12864举例说明窗体里面的一些实现的细节。首先,我们来看看一个立体的窗口是如何组成的,请看图片:这就是一个GUI系统中经典窗口风格的原理被放大了N倍的事实:只不过是一些表现明暗效果的线条和表示窗体轮廓的边框罢了。没有了这些神秘,那么我们如何在LCD12864这样的二值屏幕上面实现这一效果呢?首先,我要说,因人而异,每个人的审美观不同,各有各的设计思路,我只说说我的建议和看法。因为LCD12864这样的屏幕时二值屏,只有两种颜色,亮或者灭,那么,就无法通过灰度的颜色来表现窗口的实体,那么一个表现窗口轮廓的方框就是必须的,同时,通过简单的画黑色线条来表现明暗就已经足够了。甚至有些时候,窗口方框可以直接忽略,只要一个表现明暗的黑色线条就可以了。实际上,窗口和按钮是一个同一个东西(从绘图角度来说),当按钮被按下的时候,就改变黑色线条的位置就可以了Very Easy ,isnt it?然而,以我个人的脾气来说,什么样的系统配合什么等级的Interface(接口)。一块使用128*64点阵屏幕的图形系统往往使用简单的框框和反相显示的黑色条条就已经能够实现功能而且美观大方了,一个有明暗效果的窗体不仅浪费资源而且,会给用户一个画面拥挤的感觉。下面我们就简单说一下适用于二值屏幕的一种常用图形界面风格。不管您相信与否,这种菜单实现仅仅是一个函数多次使用的结果(除了显示汉字的)我们将使用伪代码的形式写一下这个函数的声明形式:void BOX(char Xbegin,char Ybegin,char Xend,char Yend,char BoxModel,char FillType)我们一一来说明一下函数的各个参数:Xbegin 方框左上角横坐标Ybegin 方框左上角纵坐标Xend 方框右下角横坐标Yend 方框右下角纵坐标BoxModel 画方框的模式其中 画方框有以下的宏定义表示的模式# define BoxModel_Draw 0x01 /画边框# define BoxModel_NoBox 0x03 /无边框# define BoxModel_Clear 0x00 /画白色边框# define BoxModel_Not 0x02 /边框反显FillType 矩形填充模式其中,矩形填充模式有以下的宏定义# define FillType_Fill 0x01 /填充黑色# define FillType_Clear 0x00 /填充白色# define FillType_Not 0x02 /填充反色# define FillType_NoFill 0x03 /不填充为了方便说明图片上的效果是如何实现的,我使用伪代码简单举个例子,同时假设,我们拥有一个函数可以显示汉字Print(char x,char y,String);窗体:Box(2,2,100,64,BoxModel_NoBox,FillType_Clear); /清扫出一片空地Box(2,2,100,64,BoxModel_Draw,FillType_NoFill); /窗体轮廓Print(4,4,标题栏);Box(3,3,99,22,BoxModel_NoBox,FillType_Not); /反显效果,注意坐标的细节具体如法炮制说明窗口:关于说明窗口,我想,我们可以写一个函数了,就像Windows编程中的控件一样来用。void Window(char X,char Y,char Width,char Height)Box(X+6,Y+6,X+Width+6,Y+Height+6,BoxModel_NoBox,FillType_Fill); /黑色阴影Box(X,Y,Width+X,Height+Y,BoxModel_NoBox,FillType_Clear); /清扫空地Box(X,Y,Width+X,Height+Y,BoxModel_Draw,FillType_NoFill);/画框框前面说了那么多的废话,所有问题似乎都集中到一个函数Box的编写上了。那么在LCD12864和其他同类屏幕上如何实现这个函数呢?我们把这个问题分成两个小的问题来解决:一个是矩形边框的绘制;另外一个问题自然就是填充了。依然是那句老话,像素点是构成光栅图形的基本元素,如果不考虑速度的问题,那么直接使用画点的方法来实现边框和填充也是毫无问题的,但嵌入式系统中最终要的恰恰就是效率。首先,我们来说说画外框的问题。还记得我们之前的画线函数么?我想很多人应该都试验成功了吧。同样,我们在这就先不给出源代码了,但是我们需要一个便于交流的函数声明,在这里我就自作主张的规定一个画线函数:void Line(char Xbegin,char Ybegin,char Xend,char Yend,char LineModel)同样对应LineModel我们规定一下宏定义# define LineModel_Draw 0x01 /画线# define LineModel_Clear 0x00 /清除直线# define LineModel_Not0x02 /反相直线很显然这些参数对应着原先的画点函数和优化过的画线函数。那么,Box函数的一个片断就可以写成下面的模式if (BoxModel = BoxModel_NoBox)if (FillType = FillType_NoFill)/运行到这里说明我们被程序员耍了什么不做到这里干什么?return ;BoxModel = FillType;Line(Xbegin,Ybegin,Xend,Ybegin,BoxModel);Line(Xbegin,Ybegin,Xbegin,Yend,BoxModel);Line(Xbegin,Yend,Xend,Yend,BoxModel);Line(Xend,Ybegin,Xend,Yend,BoxModel);这样我们就完成了边框的绘制,而且显然这个函数由于Line函数本身就是经过优化的,那么这个函数也可以说是拥有初步速度优化的。下面,我们来说说简单的矩形填充,关于矩形填充,应该是填充技术中最简单的一种,因为填充对象的形状属性和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 增收帮扶活动方案
- 大宋官窑双十一活动方案
- 城投公司融媒活动方案
- 地铁pr活动方案
- 大剧院参观活动方案
- 夏季班级活动方案
- 天然气公司环保活动方案
- 大庆市民刷卡活动方案
- 夏季野炊郊游活动方案
- 在公司团建火锅活动方案
- 3.6.3关门车课件讲解
- 2024年小学四年级下册数学期末测试卷附完整答案【典优】
- 人教版二年级数学下册乘除法专项考点练习
- 养老院老人走失免责协议书
- JCT 2768-2024 木塑制品行业绿色工厂评价要求(正式版)
- 拟投入的主要物资计划
- 广东省中山市2022-2023学年高一年级下册期末统一考试物理试题含解析
- 2024年横州茉莉花投资集团有限责任公司招聘笔试冲刺题(带答案解析)
- 新人教版六年级数学下册期末试卷及答案【可打印】
- 产品封样管理制度
- 2024年湖北襄阳市检察机关襄阳市城郊地区检察院招聘笔试参考题库附带答案详解
评论
0/150
提交评论