当前位置: 代码迷 >> 综合 >> STM32F103 嵌入式系统 LCD 电阻液晶显示屏应用 《迷盘》 程序实现讲解 创意绘图
  详细解决方案

STM32F103 嵌入式系统 LCD 电阻液晶显示屏应用 《迷盘》 程序实现讲解 创意绘图

热度:57   发布时间:2023-12-12 20:44:22.0

效果:小破站演示视屏

一、系统分析与总体设计

1、选题的意义

嵌入式课程是我最接近硬件的一次编程课,我对硬件其实特别感兴趣,不过对感兴趣的还是屏幕部分,真好,STM32F103 搭载了一块TFTLCD 电阻触摸屏,我觉得完全可以利用触摸屏来做自己想要做的事情,之前玩过一个叫《迷盘》的手机app 那种对称描绘的感觉我记忆尤深,趁这次机会,来做一个我自己的“迷盘”,在充分学习LCD屏幕 触摸功能底层代码的基础上,实现这些对称的美。

 

2、需求分析

 Android应用商店下载的 《迷盘》:

一下三张结果图,最后一张绘制过程图,需求很简单,制作并实现这样一个功能

     

 

最后一张为 绘制过程图,可以看到有灰色的分割线将手机屏幕分割成若干块,然后选取颜色,在一个块中绘图,其他块中都会复制相同的轨迹,在上手绘制过程中,这种连续同步镜像绘制是一种奇妙的体验。

 

因为分辨率的关系,自制的可能没有那么细腻,但是功能上都是尽量实现了,包括主题线条描绘功能,颜色的选择、模式的切换等。

自制《迷盘》:

 

 

分别是

中间对称

四部分对称

九部分对称(利用了高等数学知识)

 

上方一连串的   nine、 two 、 four、 eight   RST  分别对应了

       九部分、对称、四部分、把部分、一般  的 绘图模式。

右下角有一个颜色块的选择,用以选取颜色(延迟切换)

3、总体设计

   3.1 系统的开发环境

(惠普暗影精灵2代)Intel?i5 6500? 4 2.0GHz,16G内存,1T硬盘 + 128G 固态

?   Microsoft? Windows? 10 Professional

?   Keil 编辑器

3.2 系统总体功能,系统的结构,模块图、每个功能的详细说明

说明: 在原有触摸功能框架下开发,就是上课桌面上那个主要功能均在“main.c”文件内,触屏功能、函数集中在“lcd.h”文件内,“touch.c”文件用来测试、实现触屏功能。

 

3.2.1 主函数设计

“main.c” 为主要设计模块,包含绘图逻辑、运算、调用绘图、触屏函数等。

其中

rtp_test() 函数为整体绘图的逻辑

Load_Drow_Dialog() 函数为界面功能界面加载函数

Load_Color_Block()函数为界面右下角的颜色选取区域。

其中各种子函数科学组合,形成主体功能。

“lcd.h”提供 绘图函数

“touch.c” 提供 触摸位置数据

 

3.2.2 模式设计

提供(也就是这个LCD屏幕左上角的选择个数——5个)

点击即可刷新屏幕,并且绘制对应分隔线,即调用Load_Drow_Dialog()

所有模式选择其实只是对一个flag变量的判断

各个flag值对应的模式

上图绘制分割线

模式加载通过flag 所以绘图的逻辑也是根据flag 来判断的

绘制曲线轨迹函数

其中,九部对称绘图 的方法有别于其他有规则角度对称的方式,完全利用三角函数来计算,九部分轨迹坐标,特附上草稿纸一张——

可以看到用了比例关系,计算每条分割线的起始点坐标

利用了  一个圆上一点,旋转40度(360/9)之后的坐标,利用三角函数

具体原理——

 

3.2.3数据的初始化工作

  接下来,还需要有一些辅助性的变量来构成相关功能。

其中我本来想用struct 结构体来记录点的x,y 坐标,但是这个c语言有点奇怪,不能用(。。。。)所以用了指针数组来存储x,y像个点,其中具体骚操作像这样

这样,用一个temp指针循环用九次,每一次通过运算得到一次映射区域的值并进行绘制之后,再赋值给运算函数来计算下一个点。就是这样。

这个转40度运算坐标的函数——

为了不引入C语言的math.h库,我直接用了cos40 和 sin40 的近似值

返回一个包含x,y 值的指针。

其他,2、4、8对称的,其实只是坐标的正负值变化,乏善可陈,直接将所有结果输出即可

下图分别,左右对称、四部分对称 全部列出即可,当然也可以用上述函数获得旋转角度为90、45的坐标。

 

接下来就是颜色的选择

 

一开始我想用文字切换的方式,但当我看了lcd.h 里的函数之后并且研究一番过后,我发现我可以使一块指定的区域填充我想要的颜色,而且一个色块显示在右下角可能会更明显一些

这个色块的绘制函数——

 

可以看到,这个绘制函数的总体思路是,确定一个矩形区域的左上角、右下角坐标 sx\sy\ex\ey

然后获取这个矩形的宽度、长度 width、height

然后设置一个光标起始点  setCursor(sx,sy+i) 然后用LCD->LCD_RAM 赋值颜色常量值。

因为,这个 选中光标后,之后的n次循环并赋值LCD_RAM缓存会自动换行,而我们的色块是在右下角位置,所以需要一行行换,并且每次指定位置,所以每次起点是 sx,sy+i

注意上面的i !!!

然后再之后的 width长度像素点都赋值颜色常量。

这样效果就是这样—— 我这里用了五种颜色可供选择,点一次切换一次

这样之后,发现屏幕每次刷新频率还是挺高的,我的块点击换颜色切换太快了,所以用了一个延时切换下一个颜色的函数(其实就是一个while循环)

if 是用来判断点击是否在色块范围之内。

二、系统的详细设计

1、绘图功能的实现

 在完成以上所有的交互以及内部数据关联的运算处理后,最后要将这些数据展现到屏幕上。

图1.7

2.2绘图资源的载入与初始化

主要是 LCD_Init()这个函数,是在lcd.c 这个文件内部的——

可以看到这个初始化工作函数有个2000多行,这主要是它首先去判断了这块LCD屏幕的型号,并分别有不同的初始化设置,具体不再赘述。

初始化完屏幕,先呈现的是提示信息界面,这个我自己加了几行。

其中,按板子(STM32F103)上右边红色复位键显示,一开始无法显示屏幕内容的,可能复位才能加载lcd驱动,按复位键上面一个key
0按钮可以进入屏幕测试,类似手机的屏幕测试。

 

四、系统运行的结果

见第二部分截图

 

总结

       经过嵌入式系统的这次大作业学习,我对嵌入式编程有了更深入的了解,对硬件和软件的联系在认知上又加深了一层,这次作业,又了解了lcd屏幕的触摸交互的过程,和逻辑上的应用,这些其实是对自己编程知识系统的扩充,有趣。

 

我把资源上传到csdn上好了

地址:

迷盘,对称的美,学习触摸、显示的好教学代码