基于STM32电子秤系统的设计与实现 下载本文

开始初始化显示固定界面根据数值的改变刷新显示结束 图4-2 TFT触控液晶模块程序流程图

TFT触控液晶屏的初始化包括主控芯片与模块相连IO口工作模式的设置和显示驱动芯片ILI9320的初始化,其具体设置如下:

IO口PB0~15作为液晶显示的数据口,采用16位并行方式连接。当主控芯片从模块读数据时设置为上拉输入模式,写数据时设置为上拉输出模式。其余引脚如8080并口的信号线CS、WR、RD和RS都设为推挽输出模式[11]。对于显示驱动芯片ILI9320的初始化,首先读取TFTLCD的控制芯片的型号,然后再根据具体型号向芯片写入一系列的特定命令,例如开启振荡器、设置纵向26万色显示、设置纵向更新GRAM等,然后启动TFTLCD的显示,整屏填充白色[13]。

在程序工程中初始化函数为:void LCD_Init(void)。通过函数将字符和数字显示到TFTLCD模块上。本设计编写的各个功能函如下:

显示数字的函数:void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);

显示一个字符串的函数:void LCD_ShowString(u16 x,u16 y,const u8 *p); 显示汉字的函数:void Show_Str(u16 x, u16 y, u8 *str, u8 mode); 绘制矩形的函数:void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); 系统显示界面如图4-3。

- XXI -

图4-3 开机前的初始化界面

图4-4 使用时的主界面

TFT触控液晶屏的触控部分程序流程如图4-5。

- XXII -

开始初始化是否有校正值YN校正是否触摸?Y中断服务函数N结束

图4-5 触控部分程序流程图

在初始化程序中主要执行TFT触控液晶模块和主控芯片连接的IO配置和中断初始化,触控芯片XPT2046与主控芯片采用模拟SPI通讯,接口MOSI、SCK、CS都设为推挽输出模式,SPI的MISO和触控标志PEN设置为上拉输入模式。此外还初始化了外部中断,当有触控动作时,触控动作产生的下降沿会触发中断,进而执行中断服务函数[11]。中断服务函数中包括了键值扫描(根据触摸位置返回不同键值)和一些设置界面的标志位处理。

在初始化完后还要进行触控点和液晶显示位置的匹配。每触摸一次屏幕,触控芯片XPT2046都会得出一个触控点坐标,液晶屏自身有像素坐标,这两个坐标之间的关系是线性的,因此计算公式如下:

XLCD=Xfac*Px+xoff; YLCD=Yfac*Py+yoff。

式中的XLCD和YLCD是液晶屏上的像素坐标;Xfac和Yfac是触摸屏上读出的触控点坐标;Px和Py分别为两坐标的比例系数;xoff和yoff是横向和纵向的偏移量。

在程序工程中关于触控的主要功能函数如下: 触控初始化函数:void Touch_Init(void); 触控点校准程序:void Convert_Pos(void); 触控键值扫描函数:u8 touch_scan(void)。

- XXIII -

4.2.2 WT588D语音模块部分

在使用WT588D语音模块前需要将语音块下载到模块中,然后再通过主控芯片向WT588D芯片发送命令,WT588D调用flash的语音进而发音。

本设计中使用语音合成软件合成0~9、十、百、千和各个商品等的读音,然后通过VoiceChip V-B编译软件来建立语音工程,将各个语音块对应到flash的固定地址,然后编译下载到WT588D语音模块中。VoiceChip V-B的语音工程如图4-6。

图4-6 VoiceChip V-B建立的语音工程

WT588D语音模块与主控芯片之间采用一线串口通讯模式,主控芯片通过模块的DATA脚发送指令,从而控制WT588D芯片调用flash发某个音。一线串口通讯模式时序如图4-7。

图4-7 WT588D时序图

一线串口是只通过一条数据通信线控制时序,根据时序电平的占空比不同来

- XXIV -

代表0或1。先拉低RESET复位信号5ms,然后置高电平等待大于17ms的时间,再将数据信号拉低5ms,最后发送数据。若高电平与低电平的时间比为1:3则代表数据位0,3:1则代表数据位1,且高电平在前,低电平在后,先发数据的低位再发高位。图4-7中D0~D7表示一个地址或者命令数据,数据中的00H~DBH是地址指令,F2H是循环播放命令,FEH是停止播放命令,E0H~E7H是音量调节命令。

本设计的程序工程中WT588D模块的程序流程图如图4-8。

开始初始化接收到指令?Y发音NN完成发音?Y结束

图4-8 WT588D的程序流程图

在初始化部分中设置主控芯片与WT588D模块相连接的IO口。WT588D模块的SDA、REST设置为上拉推挽输出模式,BUSY设置为上拉输入模式。当WT588D接收到指令后调用flash内的语音进行发音。程序中利用模块的BUSY信号来判断是否完成发音。

根据WT588D模块的时序图编写写数据函数void send_dat(u8 addr)(由于该模块与主控芯片的连接为单向,所以无需编写读数据函数),具体代码如下: void send_dat(u8 addr) {

u8 i; rst=0;

delay_ms(5);

//复位信号保持低电平5ms

- XXV -