自从参看例程代码,弄明白了触摸屏驱动后,觉得触摸屏的操作太方便了,而且没有之前想象的那么难
用,我们只要设置好AD和定时器触发采样,驱动程序就会把采样值分析并生成三个参数(unsigned long
ulMessage,long lX, long lY),即动作属性:按下,松开或滑动,以及当前坐标。我们只要在需要相应
的程序里添加一个回调函数就行了。小画板这个项目完全就是靠这三个参数展开的。关于触摸屏的驱动
请看上一篇https://bbs.eeworld.com.cn/thread-330302-1-2.html
1、首先是界面。
标题栏很简单,画几个矩形框就搞定了,略过。
工具栏呢,我从xp的画图里面截取了几个常用的图标,做成16bit的bmp文件,作为一个资源数组引入到
项目里,当我们要显示图片的时候,直接调用数组数据就好了,很方便。这里有个要注意的地方,就是
bmp文件的前0x45个数据是文件描述字符,不是位图数据,所以我们要跳过,从0x46开始,每个像素2字
节,数序读出显示就行了。
启动logo同样的做法,但是我碰到一个问题,就是颜色始终和PC上不对,仔细核对了下LCD的配置,发现
03寄存器的第12位决定了RGB还是BGR的顺序,修改之后问题解决。
2、按钮触摸实现
先创建了一个位图按钮结构体,每个按钮包含有很多属性
typedef struct
{
unsigned char id ; // 识别号
unsigned int x ; // 起始位置横坐标x
unsigned int y ; // 起始位置纵坐标y
unsigned char width ; // 宽度
unsigned char high ; // 高度
unsigned char property ; // 属性
unsigned short font_color ; // 文字颜色
unsigned short button_color ; // 按钮颜色
unsigned char image_index ; // 按钮图像编号
unsigned char status ; // 状态
char *caption ; // 字符串
} BUTTON_DIG ; // 按钮控件
状态又有如下属性
//status位定义
#define Enable 0x01 //使能
#define Visable 0x02 //可见
#define Refresh 0x04 //需要刷新
#define Fouse 0x08 //当前焦点
#define Ico 0x10 //是否使用图形
#define Down 0x20 //按下状态
#define bReadOnly 0x40
#define bSelect 0x80 //按下状态
我们创建按钮时把各自的值赋给它们。
并实现两个简单的方法
extern unsigned char CreateButtonDig(BUTTON_DIG *newbtn);
extern void Refresh_Btn_Dig(BUTTON_DIG newbtn);
第一个用来创建按钮,第二个用来刷新按钮。(真的很简单,我都不好意思说...)
我们在主文件里声明了一个TS_Message()函数来接受触摸驱动过来的数据,通过判断当前的坐标和按钮
的x,y坐标做比较来判定按钮是否被按下。
为了区分那个按钮被点击,我做了两种按钮的背景图片以示区分。
按钮按下或者颜色被选择改变时,右侧的状态文字和它的颜色会变更以作出指示。
每次按钮的文字或图片变更之后会设置Refresh并调用刷新程序,这样有针对性的刷新避免了整个画面的
闪烁。
3、功能的实现
pen和brush功能很简单的做了一下,没做平滑处理,就是在MOVE状态下画点或画小方块,如果想做的好
可以把数据处理一下滤除偏移的噪点,笔画也可以做成园或仿毛笔墨迹,更逼真。
Eraser功能更简单,按背景色画小方框即可。
画线、圆和矩形做了点变通,在PC上都是拖拽而且即时显现的,但那要大量的运算和缓冲区,即内存空
间,考虑到我们的资源有限,我这样变通了一下处理:
线:拖拽画线,在落笔点和起笔点作为两个短点画线,抬笔才画。
圆:需要两次点击,第一次点击确定圆心,第二次点击确定半径,将会以第二点到圆心的距离为半径画
圆。每次点击状态栏会有提示是圆心还是半径。
矩形:需要两次点击,第一次为左上角(或右上角都行)坐标,第二次为对应脚坐标,第二次点击结束
时会画矩形,每次点击会提示。
这里做了一个小选择,即两种画矩形模式,一种为空心矩形,一种为实心矩形,可点击矩形图标切换,
状态栏会有提示Rect M1/M2.
颜色的选择和按钮一样,只是声明了一个全局变量来储存当前颜色值,每次选择会改变。状态栏的文字
颜色也会跟着改变来作为当前颜色的指示。
最后一个图标是清屏按钮,重新开始新的画图
4、缺点
a.原计划是把图像的更新和按键处理部分分开来,分析放到主函数循环里面处理,这样实时性好,节约硬件资源,由于时间精力等%&…¥%杂七杂八的原因,搁浅了。
b.程序很多地方数据声明和函数调用有资源浪费嫌疑,没有检查和优化。
c.很想加入文字功能的,以后看时间吧.....抱歉了。
希望这个小东西能起到抛砖引玉的作用