donatello
获得 765 次赞
帮助过2489人
上次我用电容屏显示汉字,这次来点更好玩的,显示图片表情。lcd点阵显示汉字和图片其实区别不大,唯一的区别就是,汉字点阵的色彩单调,只需要1种或几种的颜色即可完成显示,但是图片的颜色是千变万化的,每一个像素点的颜色都不一定完全相同,按照16位真彩色标准,每一个像素点都可以指定为rgb565标准中的任意一种颜色,这种rgb颜色的数据长度为16位,对应红绿蓝三种色彩的位数为5、6、5,即每个点的红绿蓝灰度都分别为2^5、2^6、2^5,总色彩数为2^16=65536,即一个点可以显示65536种颜色,所以这种颜色排布方式又称为rgb565排布。
本帖最后由 donatello 于 2017-5-22 21:46 编辑 f412disco板子自带了一个1.5寸的电容屏,分辨率为240*240,非常的小巧而又漂亮。在官方自带的demo例程中我们已经可以领会到这块小电容屏的强大之处,即使尺寸不大,也能做出类似智能手表的效果。 f412disco板子的电容屏主控为st7789h2,但是官方例程中却有st7789h2和ls016b8uy两种主控芯片的驱动文件,因此在实际应用中可以将ls016b8uy的驱动文件从工程中移除掉,不会有任何影响。 f412disco板子电容屏跟常规的lcd彩屏一样,支持直接采用点阵方式描绘,每一个点都可以指定为某种rgb颜色,因此,在初期开发阶段,可以尝试学习显示点阵汉字或点阵图形,加深对点阵的印象。官方例程自带的显示ascii字符的函数非常好用,支持自定义字体大小和颜色,但是无法直接套用到显示汉字的方法里面,这里我显示32*32汉字的函数是自己写的,具体思路是逐行扫描,扫描够32行,每行有32列,即每行显示4个字节的阳码,因此一个汉字字模需要显示32*32=1024个点,需要用掉32*32/8=128b(字节)的单片机存储空间,另外,存储汉字的字模我是用const修饰的,单片机认为这些数据只要上电运行开始就不会变,因此这些数据是放在内部海量的flash数据区空间中,而不是捉襟见肘的程序区中(若没有const修饰,即字模数据会被单片机认为是变量,会放在程序区中,程序区堆栈很快就会被占满)。
上个报告是使用joystick的中间引脚(pa0)进行外部中断实验,其它四个方向的按键(pg0、pg1、pf14、pf15)没有使用,而由于pg0和pa0都属于同一外部中断线exti0,并且pg0和pa0都是上升沿触发,因此pg0和pa0不能同时用作外部中断,即使强行用作同一外部中断也会导致不可预测的bug,况且一个joystick按键就占去了exti0、exti1、exti15_10三个外部中断线,这是很浪费单片机资源的行为,因此,多按键处理最好使用扫描方式。 这里的按键扫描程序采用正点原子的多按键扫描程序,具有连按、消抖的功能,放置在while循环里面一直执行,加上适当的延时函数,可以实现按键扫描的功能。
f412disco自带了一个joystick,即手柄模拟器,其特点是有上、下、左、右、中五个独立按键,对应pg0、pg1、pf15、pf14、pa0,而其中的pa0则是使用非常广泛的外部中断按钮,对应的中断线为exti0。从电路图中我们可以看到,joystick的公共端连着的是vcc,因此所有基于本joystick的按钮实验都需要设置pg0、pg1、pf15、pf14、pa0为下拉,上升沿触发,若配置为浮空,则会出现相应速度慢的bug。
除了systick以外,单片机要实现高精度精确延时,需要借助定时器外设。定时器外设与systick为同一时钟源,都是sysclk,但是定时器没有经过任何的分频,即stm32十几个定时器的频率都是100mhz,systick的频率显然没得比,并且定时器都是可以独立工作的,定时器中断线程与main函数while(1)循环的线程是完全独立的,既是物理独立也是逻辑独立(rtos的多线程仅仅是通过非抢占轮转调度方式实现逻辑独立,从硬件角度看rtos所有线程都是同一个物理线程,除非采用定时器)。
串口弄好了,那接下来当然是玩玩点灯了。要玩花样点灯的话,则必须要有一个延时函数,不管是精确延时函数还是粗延时函数。这里我引用了之前的nucleo-f412例程中的以systick(系统滴答时钟)为基础的精确延时函数,systick是以sysclock(系统时钟)作为时钟源经过分频进行计数的,以f412的100mhz主频为例,100mhz100分频后为1mhz,1s/1m=1us,即计数1000次后溢出,用时1us,这样,以此为计时单位来延时,就可以得到基于sysclk的精确延时函数,该延时函数的精度要比用while循环死等的粗延时函数要高得多(while循环死等粗延时函数的基础其实是mcu执行一条指令的时间,但是学过汇编的人们都知道,执行指令是要经过寄存器和运算器的,并且极易受环境温湿度影响,而systick虽然也会受温度影响,但是是直接用mcu的时钟源分频后计时的)。 延时函数弄好了之后,就是即为简单的配置gpio引脚,需要配置pe0到pe3。注意,这四盏灯都是接在vcc上面的,因此是灌电流法点亮,即低电平点亮。