欢迎来到EDA中国!
当前位置:网站首页 >资源共享 > 数字/模拟

怎样在点阵屏上绘图——基于LCD12864【一】

  • 300k
  • pdf
  •  
  •  
  • 下载
  • 2013-07-10
  • 软件简介

怎样在点阵屏上绘图——基于LCD12864【一】

 

前言

前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。

1、为什么我要写这篇文章。

不可否认,我的确受到了Armok的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurAVR上看到很多版本的LCD驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据CoverLCD的显存上,完成一个字或者是图片的显示就等着大家喊了。其实要走的路还很远。对一个工程项目来说,增加n多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading...Please Standy By的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI,虽然比不过XPApple的华丽,但是由各种基本图形组成的窗口界面还是需要的。

当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了的初级驱动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有DirectX的华丽,但是能绘制一个任意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。

2、我如何写这篇文章

考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家胃口,请见谅。

硬件平台:AVRMega8

LCD:不带字库的12864

软件平台:ICC

规范:符合基本的C编程规范

3、何时开始正文

Chapter Zero

预备知识

其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求,考虑到各位兄弟的胃口,我就多罗嗦下。

1、位操作

LCD12864这种二值屏幕,我们习惯于用1个字节表示连续的8个点,1对应对应位被点亮,0表示不亮,所以对图形的操作最基本的手段就是位操作。

复习下,常用的位操作,假设Dis表示某一个现存地址的内容

Dis = Dis~黑颠倒

Dis &=~(1<<n) n处被擦去,

Dis |= (1<<n)n处被画了一个点

Dis ^= (1<<n)如果n处是亮的,就变被擦掉;如果n处是空白的,就被点亮……

…… 差不多就这些

2、作图原理

点是一切光栅显示设备的基本要素,所有的操作都是以点为基础的,所以学会如何利用点构成线、圆、填充就是必须掌握的——几何不能太差哦。

还有,结合屏幕的硬件特点,对算法进行优化的一些方法也是需要掌握的。比方说,如何填充之类的……后面会针对LCD12864作详细介绍的。

3、人机交互学

虽然很多人都没有实实在在学过这门功课,但是多多少少对于界面应该怎样有些许了解。如何利用手中的基本操作函数做出一些特效,如何安排窗体,如何绘制图形界面的一些基本元素如按钮,甚至如何显示汉字,都是人际交互学需要教会你的——总之,如果你没有学过这门课程,你的产品只有你自己用的话——跟着感觉走,没错的。

4、最最重要的物质基础

你要掌握一种单片机,掌握一种点阵屏幕。

AVR Inside

Not Only ForLCD12864

Chapter One

从点滴开始

前面已经说过,对于栅格显示设备来说,点是一切图形的基础,说白了,不会在液晶屏幕的任意位置随心所欲的画点就不能说你已经掌握了某种液晶屏幕的使用了。事实上,根据笔者的经验,尝试画点往往能暴露出很多问题。就拿LCD12864来说吧,一段时间,笔者总是发现,在片切换的地方有一点点错误……

在说明如何画点之前先说明一个概念:显示缓冲区。

所谓显示缓冲区,顾名思义,就是显示数据的一个缓冲地带。一般情况下,我们绘图也是直接对这块缓冲区域进行操作的。

很多小朋友就要提问了:老师,我们为什么不直接对屏幕操作呢?这个问题提得很好。(^_^自己都要吐了)

事实上,LCD本身存在一块显示存储器,也可以被认为是一个显示缓存,直接写在这个存储器的数据并非直接显示出来,而多半需要一个显示指令来影射一下。我们有时候也通过这种类似的技术来实现很大的图片的显示——先画好,再拿给大家看,让人以为你是一下就画好的,当然如果你刻意需要那种图片被出来的效果,则不在讨论之列。问题就在于,LCD是片外资源,对其存储器的访问可以被认为是对片外存储器的访问,其速度显然没有对片内SRAM的操作速度要快。如果我们使用那种常用的串行方式来作图(所谓串行方式作图,就是绘图指令的执行和系统的其他操作时串行的,指令不完成,其它操作就不回被执行),那么对于一些实时性要求高的系统来说就会造成重大隐患——甚至是不符合要求的;如果开辟一段片内存储空间和LCD的存储器一一对应,在相同的时间段内,花费相同的资源来保持着两个存储空间的一致性,那么就可以保证实时系统的稳定和可靠,保证画面显示的正常(因为允许跳帧嘛^_^)。这就是我们为什么需要另外在片内选取一个显示缓冲区的原因。

以后,我们的操作都是针对显示缓冲区的。显示缓冲区将成为一个概念,无论这个缓冲区位于SRAM内还是LCD内部。比方说,我们需要一个低成本的游戏机——如做一个贪食蛇游戏机送给老师作为课程设计,或者送给小侄子,那么,M8甚至是M48成为首选,问题是,M8绝对无法开辟出一个8 * 128 = 1K大小的数组,所以,这个时候,认定LCD的片内存储器作为显示缓冲区就是不二的选择——好在贪食蛇速度太快了也没有办法玩哈。

绕了这么多的弯子,究竟如何画点呢?我还想多补充一个原因,关于,为什么需要显示缓冲区,由于点阵屏幕使用的是1个字节来表示8个点的,如果你想使得一个字节中的某一个点被操作而不影响别的点,你起码要知道原来这个位置是什么内容,对于有些使用595级联的LCD设备来说,无法直接从LCD读取现存数据,所以开辟一个缓冲区,从中获得信息加以加工以后再放回去,是这种设备处理显示图形的唯一方法——当然我们没有那么惨,但是从LCD中获取所需点所在字节的内容还是必须的,不然你画一个点就会破坏一条线上所有的数据。


关键字 : LCD12864 绘图 点阵屏 
获取帮助