在上一章已经实现串口不定长接收帧的基础上,完成LCD相关的显示功能,使用串口发送任意字符串,在LCD屏幕上进行显示。
显示相关需要完成的内容包括:
LCD模块也是合宙的LCD扩展板,分辨率是160*80的,驱动是ST7735,这款屏之前在启光电子的STM32F103高级版C8开发板上见过,所以相关的控制函数将主要移植自启光的相关例程,对其进行简单优化。
打开合宙的SPI文件夹,里面含有LCD的例程:ModuleDemo\SPI\SPI_Air10x_LCD\USER\SPI.uvprojx。
打开启光电子的相关例程:
主要包括底层的驱动:引脚初始化、SPI初始化、SPI读写、写数据、写命令等函数。方便后面在上层GUI中进行调用。
#include "st7735v.h"
#include "delay.h"
void SPI_WriteByte(u8 TxData) //TxData 可以是8位或16位的,在启用SPI之前就确定好数据帧格式
{
u8 retry = 0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //0:发送缓冲非空 等待发送缓冲器变空
{
retry++;
if(retry>200)return;
}
SPI_I2S_SendData(SPI1, TxData);
return;
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
LCD_DC_Set();//写数据
SPI_WriteByte(dat);
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
LCD_DC_Set();//写数据
SPI_WriteByte(dat>>8);
SPI_WriteByte(dat);
}
/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_Clr();//写命令
SPI_WriteByte(dat);
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
LCD_CS_Clr(); //打开屏幕片选
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+LCD_OFFSET_X);
LCD_WR_DATA(x2+LCD_OFFSET_X);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+LCD_OFFSET_Y);
LCD_WR_DATA(y2+LCD_OFFSET_Y);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+LCD_OFFSET_X);
LCD_WR_DATA(x2+LCD_OFFSET_X);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+LCD_OFFSET_Y);
LCD_WR_DATA(y2+LCD_OFFSET_Y);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+LCD_OFFSET_X);
LCD_WR_DATA(x2+LCD_OFFSET_X);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+LCD_OFFSET_Y);
LCD_WR_DATA(y2+LCD_OFFSET_Y);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+LCD_OFFSET_X);
LCD_WR_DATA(x2+LCD_OFFSET_X);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+LCD_OFFSET_Y);
LCD_WR_DATA(y2+LCD_OFFSET_Y);
LCD_WR_REG(0x2c);//储存器写
}
LCD_CS_Set(); //关闭屏幕片选
}
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORT时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
GPIO_SetBits(GPIOA,GPIO_Pin_5 | GPIO_Pin_7);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 0;
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2 2分频
//SPI_BaudRatePrescaler_8 8分频
//SPI_BaudRatePrescaler_16 16分频
//SPI_BaudRatePrescaler_256 256分频
void SPI_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler;
SPI_Cmd(SPI1,ENABLE);
}
void ST7735V_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6);
SCREEN_CS_1;
}
//屏幕初始化
void ST7735V_Init(void)
{
ST7735V_GPIO_Init();
SPI1_Init(); //初始化SPI
SPI_SetSpeed(SPI_BaudRatePrescaler_2);
SCREEN_BL_0;
SCREEN_DC_1;
SCREEN_RST_0;
delay_ms(100);
SCREEN_RST_1;
delay_ms(120);
SCREEN_CS_0;
LCD_WR_REG(0x11);
delay_ms(120);//ms
LCD_WR_REG(0x20);//lcd_inv_off如果颜色错了就用0x21
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB4);//Dotinversion
LCD_WR_DATA8(0x03);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x62);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0xC0);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x6A);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
LCD_WR_REG(0xC5);//VCOM
LCD_WR_DATA8(0x0E);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
//direction
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0x29);
delay_ms(100);
SCREEN_CS_1;
SCREEN_BL_1;
}
#ifndef __ST7735V_H
#define __ST7735V_H
#include "air32f10x.h"
//gpio
#define SCREEN_CS_0 GPIO_ResetBits(GPIOA,GPIO_Pin_3)
#define SCREEN_DC_0 GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define SCREEN_RST_0 GPIO_ResetBits(GPIOA,GPIO_Pin_6)
#define SCREEN_BL_0 GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define SCREEN_CS_1 GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define SCREEN_DC_1 GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define SCREEN_RST_1 GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define SCREEN_BL_1 GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define USE_HORIZONTAL 2 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#define LCD_DC_Clr() SCREEN_DC_0//DC RS
#define LCD_DC_Set() SCREEN_DC_1
#define LCD_CS_Clr() SCREEN_CS_0//CS
#define LCD_CS_Set() SCREEN_CS_1
//screen size
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 80
#define LCD_H 160
#define LCD_OFFSET_X 24//offset
#define LCD_OFFSET_Y 0
#else
#define LCD_W 160
#define LCD_H 80
#define LCD_OFFSET_X 0//offset
#define LCD_OFFSET_Y 24
#endif
void SPI_WriteByte(u8 TxData);
void LCD_Writ_Bus(u8 dat);
void LCD_WR_DATA8(u8 dat);
void LCD_WR_DATA(u16 dat);
void LCD_WR_REG(u8 dat);
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);
void ST7735V_GPIO_Init(void);
void ST7735V_Init(void);
#endif
主要包括清屏、画点、画线、画图、英文字符显示、中文汉字显示等。在此基础上又增加了混合显示英文和中文的函数,以及自动换行的函数。
#include
#include
#include
#include "gui.h"
#include "delay.h"
#include "st7735v.h"
#include "hz16x16.h"
#include "zifu8x16.h"
//#include "picture.h"
//清屏函数
//color是背景颜色。
//说明:使用背景颜色清除TFT模块屏幕的全部显示内容。
void GUI_Clear(u16 color)
{
u16 i;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
LCD_CS_Clr(); //打开屏幕片选
for(i=0;i<LCD_W*LCD_H;i++)
{
LCD_WR_DATA(color);
}
LCD_CS_Set(); //关闭屏幕片选
}
//画图
//p_Data为数据指针,需要传160x80个数据,每个数据2个字节
void GUI_Pic(u16 *p_data)
{
unsigned int i;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
LCD_CS_Clr(); //打开屏幕片选
for(i=0;i<LCD_W*LCD_H;i++)//显示以存好的图片数据
{
LCD_WR_DATA(p_data[i]);
}
LCD_CS_Set(); //关闭屏幕片选
}
//画点
//(x,y)是点的坐标
//color 是点的颜色。
//说明:用指定的颜色在指定的坐标位置上画出一个点。
void GUI_Point(u8 x, u16 y, u16 color)
{
LCD_Address_Set(x,y,x,y);
LCD_CS_Clr(); //打开屏幕片选
LCD_WR_DATA(color);
LCD_CS_Set(); //关闭屏幕片选
}
//画直线(可以画任意方向直线,包括横线、竖线、斜线)。
//(x1,y1)起点, (x2,y2)终点, color颜色。
//说明:用指定的颜色在指定的两点间画出一条直线。
void GUI_Line(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy;
u16 row,col;
delta_x = x2-x1;//计算坐标增量
delta_y = y2-y1;
col=x1;
row=y1;
if(delta_x>0) incx=1;//设置单步方向
else
{
if(delta_x==0) incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
}
if(delta_y>0)incy=1;
else
{
if(delta_y==0) incy=0;//水平线
else {incy=-1;delta_y=-delta_y;}
}
if(delta_x>delta_y) distance=delta_x;//选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++)
{ //画线输出
GUI_Point(col, row, color);
xerr+=delta_x;
yerr+=delta_y;
if(xerr>distance)
{
xerr-=distance;
col+=incx;
}
if(yerr>distance)
{
yerr-=distance;
row+=incy;
}
}
}
//画8点(Bresenham算法)
//(rx,ry,a,b):参数
//color:颜色
void GUI_Circle8(u16 rx,u16 ry,int a,int b,u16 color)
{
GUI_Point(rx+a,ry-b,color);
GUI_Point(rx+b,ry-a,color);
GUI_Point(rx+b,ry+a,color);
GUI_Point(rx+a,ry+b,color);
GUI_Point(rx-a,ry+b,color);
GUI_Point(rx-b,ry+a,color);
GUI_Point(rx-b,ry-a,color);
GUI_Point(rx-a,ry-b,color);
}
//在指定位置画一个指定大小的圆
//(rx,ry):圆心
//r :半径
//color:颜色
//mode :0,不填充;1,填充
void GUI_Arc(u16 rx,u16 ry,u16 r,u16 color,u8 mode)
{
int a,b,c;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
if(mode)
for(c=a;c<=b;c++)
GUI_Circle8(rx,ry,a,c,color);//画实心圆
else GUI_Circle8(rx,ry,a,b,color); //画空心圆
a++;
//使用Bresenham算法画圆
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
}
//画实心矩形
//(sx,sy)左上角顶点坐标,
//(ex,ey)右下角顶点坐标, color颜色
//返回: 无
//说明:在指定位置上画出实心矩形。
void GUI_Box(u8 sx,u16 sy,u8 ex,u16 ey,u16 color)
{
u16 temp,temp1,m,n;
LCD_Address_Set(sx,sy,ex,ey);
n=ex-sx+1;
m=ey-sy+1;
for(temp=0;temp<m;temp++)
{
for(temp1=0;temp1<n;temp1++)
{
LCD_WR_DATA(color);
}
}
}
//画颜色递变巨型 可以是横条 竖条等
//(sx,sy)左上角顶点坐标,
//(ex,ey)右下角顶点坐标, color颜色
// mode 模式 mode=1 纵向颜色变化 mode=2 横向颜色变化
void GUI_BoxChange(u8 sx,u16 sy,u8 ex,u16 ey,u16 color,u8 mode)
{
u16 temp,temp1,m,n,color2;
LCD_Address_Set(sx,sy,ex,ey);
n=ex-sx+1;
m=ey-sy+1;
if(mode==2)color2=color;
for(temp=0;temp<m;temp++)
{
for(temp1=0;temp1<n;temp1++)
{
LCD_WR_DATA(color);
if(mode==2)color+=15;
}
if(mode==1)color+=15;
if(mode==2)color=color2;
}
}
//填充矩形
//x0,y0:矩形的左上角坐标
//width,height:矩形的尺寸
//color:颜色
void GUI_FillBox(u16 x0,u16 y0,u16 width,u16 height,u16 color)
{
if(width==0||height==0)return;//非法.
GUI_Box(x0,y0,x0+width-1,y0+height-1,color);
}
//显示英文或数字字符
//函数支持 字符的纵向和横向显示 (要配合扫描方式)
// 支持忽略背景颜色显示 (横向没有开此功能)
//x y 要显示字符的初始坐标
//value 显示字符数据
//dcolor 显示的字符颜色 bgcolor显示字符的背景颜色
// bgcolor 只给1 说明背景颜色使用 当前屏幕颜色(只适用于纵向显示)
//mode 0 字符纵向显示 1 字符横向显示
void GUI_ShowChar(u8 x,u16 y,u8 value,u16 dcolor,u16 bgcolor,u8 mode)
{
u8 i,j;
u8 *temp=(u8 *)zifu816; //temp是*temp的地址 这里temp就是zifu的首地址
u8 ma;
temp+=(value-32)*16; //确定要显示的值
//用ascii表 前32个ascii没有存入zifu库里 所以要减32
//每个字符用16个字节显示 所以在乘以16 就是对应的显示位的首地址
if(bgcolor!=1) //用自己设定的背景色
{ //注意 不管设置哪一显示方向 前提是扫描要对应
if(mode==0)LCD_Address_Set(x,y,x+7,y+15); //设置区域
if(mode==1)LCD_Address_Set(x,y,x+15,y+7); //设置区域
LCD_CS_Clr(); //打开屏幕片选
for(j=0;j<16;j++)
{
for(i=0;i<8;i++) //先横扫
{
if((*temp&(1<<(7-i)))!=0) //将1 左移 然后对应位进行相与
{
LCD_WR_DATA(dcolor); //显示字符颜色
}
else
{
LCD_WR_DATA(bgcolor); //显示背景颜色
}
}
temp++; //下一字节
}
LCD_CS_Set(); //关闭屏幕片选
}
else //用屏幕上自有的颜色做背景色 (只支持纵向显示)
{
ma=x; //赋值x的初始值给ma
for(j=0;j<16;j++)
{
for(i=0;i<8;i++) //先横扫
{
LCD_Address_Set(x,y,x,y);
LCD_CS_Clr(); //打开屏幕片选
if((*temp&(1<<(7-i)))!=0) //将1 左移 然后对应位进行相与
{
LCD_WR_DATA(dcolor); //显示字符颜色
x++;
if((x-ma)==8){x=ma;y++;} //判断是否到一行
}
else
{
x++; //没有要显示的数据 x自加跳过
if((x-ma)==8){x=ma;y++;} //判断是否到一行
}
LCD_CS_Set(); //关闭屏幕片选
}
temp++; //下一字节
}
}
}
//程序汉字显示
//说明:汉字是用取模软件制作好的 指定的汉字 汉字大小是16x16 即32个字节存储一个汉字
// 这部分汉字是存在程序空间 所以汉字的多少直接影响程序空间的剩余量
// 主要方便于就显示几个指定的汉字来说就不用调用字库了
//x y 要显示汉字的坐标
//c[2] 汉字的数据 一个汉字两个字节表示
//dcolor 汉字的颜色 bgcolor 背景颜色
void GUI_ShowHZ(u8 x, u16 y, u8 c[2], u16 dcolor,u16 bgcolor)
{
u8 i,j,m; //定义临时变量
u16 k=0;
LCD_Address_Set(x,y ,x+16-1, y+16-1); //选择坐标位置
LCD_CS_Clr(); //打开屏幕片选
for (k=0;k<N_codeHZ;k++) //64表示自建汉字库中的个数,循环查询内码 这个数并不确定 取决于存如的汉字个数
{
if ((codeHZ_16[k].Index[0]==c[0])&&(codeHZ_16[k].Index[1]==c[1])) //寻找对应汉字 一个汉字需要两个字节
{
for(i=0;i<32;i++)
{ //32个字节 每个字节都要一个点一个点处理 所以是处理了32X8次
m=codeHZ_16[k].Msk[i]; //读取对应字节数据
for(j=0;j<8;j++) //显示一个字节 一个字节8位 也就是8个点
{
if((m&0x80)==0x80) //判断是否是要写入点 如果是 给字体颜色
LCD_WR_DATA(dcolor);
else //如果不是 为背景色 给颜色
LCD_WR_DATA(bgcolor);
m<<=1; //左移一位 判断下一点
}
}
}
}
LCD_CS_Set(); //关闭屏幕片选
}
//显示汉字及字符 纵向显示
//x1 y1 显示的初始位置
//*str 要显示的数据
//dcolor 显示汉字 字符的颜色
//bgcolor 显示汉字 字符的背景颜色 当bgcolor=1是 那么背景颜色为屏幕自有颜色
void GUI_ShowHzChar(u8 x1,u16 y1,char*str1,u16 dcolor,u16 bgcolor)
{
u8 *str=(u8*)str1;
u8 l=0;
while(*str)
{
if(*str<0x80) //小于128 ascii 都在数组内
{
GUI_ShowChar(x1+l*8,y1,*str,dcolor,bgcolor,0);
l+=1;
str++;
}
else
{
GUI_ShowHZ(x1+l*8,y1,(u8*)str,dcolor, bgcolor);
str+=2;l+=2;
}
}
}
void GUI_ShowHzCharAuto(u8 x1,u16 y1,char*str1,u16 dcolor,u16 bgcolor)
{
u8 *str=(u8*)str1;
while(*str)
{
if(*str<0x80) //小于128 ascii 都在数组内
{
if(x1>LCD_W-8)
{x1=0;y1+=16;if(y1>LCD_H)y1=0;}
GUI_ShowChar(x1,y1,*str,dcolor,bgcolor,0);
x1+=8;
str++;
}
else
{
if(x1>LCD_W-16)
{x1=0;y1+=16;if(y1>LCD_H)y1=0;}
GUI_ShowHZ(x1,y1,(u8*)str,dcolor, bgcolor);
str+=2;x1+=16;
}
}
}
#ifndef __GUI_H__
#define __GUI_H__
#include "air32f10x.h"
#include "st7735v.h"
/*定义常用颜色码*/
#define Red 0xf800 //红
#define Yellow 0xffe0 //黄
#define Green 0x07e0 //绿
#define Cyan 0x07ff //青
#define Blue 0x001f //蓝
#define Purple 0xf81f //紫
#define Black 0x0000 //黑
#define White 0xffff //白
#define Gray 0x7bef //灰
#define Blue1 0xa5ff //淡蓝
#define Blue2 0x7cdf
#define Purple1 0x8a9e //淡紫
#define Green1 0x0410 //墨绿
#define Green2 0x2616
#define Blue3 0x751E
#define Purple2 0xcd9e //淡紫
#define Red2 0XF260 //淡红
#define Red3 0X8000 //棕红
#define window 0XDED7
void GUI_Clear(u16 color);//清屏
void GUI_Pic(u16 *p_data);//画图
void GUI_Point(u8 x, u16 y, u16 color);//画点
void GUI_Line(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//画直线
void GUI_Circle8(u16 rx,u16 ry,int a,int b,u16 color);//画8点(Bresenham算法)
void GUI_Arc(u16 rx,u16 ry,u16 r,u16 color,u8 mode);//在指定位置画一个指定大小的圆
void GUI_Box(u8 sx,u16 sy,u8 ex,u16 ey,u16 color);//画实心矩形
void GUI_BoxChange(u8 sx,u16 sy,u8 ex,u16 ey,u16 color,u8 mode);//画颜色递变巨型 可以是横条 竖条等
void GUI_FillBox(u16 x0,u16 y0,u16 width,u16 height,u16 color);//填充矩形
void GUI_ShowChar(u8 x,u16 y,u8 value,u16 dcolor,u16 bgcolor,u8 mode); //显示英文或数字字符
void GUI_ShowHZ(u8 x, u16 y, u8 c[2], u16 dcolor,u16 bgcolor);//程序汉字显示
void GUI_ShowHzChar(u8 x1,u16 y1,char*str1,u16 dcolor,u16 bgcolor);//显示汉字及字符 纵向显示
void GUI_ShowHzCharAuto(u8 x1,u16 y1,char*str1,u16 dcolor,u16 bgcolor);//显示中英文字符串,自动换行
#endif
用到了中英文显示,当然也少不了字库的需要。
/*16x8英文字符点阵数据文件*/
/*纵向取模*/
//包括以下字符的点阵数据:
//sp
//!"#$%&'()*+,-./
//0123456789
//:;<=>?@
//ABCDEFGHIJKLMNOPQRSTUVWXYZ
//[\]^_'
//abcdefghijklmnopqrstuvwxyz
//{|}~
#ifndef __ZIFU8X16_H
#define __ZIFU8X16_H
#include "air32f10x.h"
const unsigned char zifu816[]={
/* sp */
/*空格*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: ! --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,
/*-- 文字: " --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x12,0x36,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: # --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x24,0x24,0x24,0xFE,0x48,0x48,0x48,0xFE,0x48,0x48,0x48,0x00,0x00,
/*-- 文字: $ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x10,0x38,0x54,0x54,0x50,0x30,0x18,0x14,0x14,0x54,0x54,0x38,0x10,0x10,
/*-- 文字: % --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0xA8,0x54,0x1A,0x2A,0x2A,0x2A,0x44,0x00,0x00,
/*-- 文字: & --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x50,0x6E,0xA4,0x94,0x88,0x89,0x76,0x00,0x00,
/*-- 文字: ' --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x60,0x60,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: ( --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00,
/*-- 文字: ) --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00,
/*-- 文字: * --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x00,
/*-- 文字: + --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x00,0x00,0x00,
/*-- 文字: , --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0xC0,
/*-- 文字: - --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: . --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,
/*-- 文字: / --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,
/* 0123456789 */
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,
/* :;<=>?@ */
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,
/*-- 文字: ; --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,
/*-- 文字: < --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00,
/*-- 文字: = --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: > --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00,
/*-- 文字: ? --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x62,0x02,0x04,0x08,0x08,0x00,0x18,0x18,0x00,0x00,
/*-- 文字: @ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x38,0x44,0x5A,0xAA,0xAA,0xAA,0xAA,0xB4,0x42,0x44,0x38,0x00,0x00,
/* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
/*-- 文字: A --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00,
/*-- 文字: B --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,
/*-- 文字: C --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00,
/*-- 文字: D --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,
/*-- 文字: E --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0x42,0xFC,0x00,0x00,
/*-- 文字: F --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0x40,0xE0,0x00,0x00,
/*-- 文字: G --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3C,0x44,0x44,0x80,0x80,0x80,0x8E,0x84,0x44,0x44,0x38,0x00,0x00,
/*-- 文字: H --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,
/*-- 文字: I --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
/*-- 文字: J --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0,
/*-- 文字: K --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xEE,0x44,0x48,0x50,0x70,0x50,0x48,0x48,0x44,0x44,0xEE,0x00,0x00,
/*-- 文字: L --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00,
/*-- 文字: M --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,
/*-- 文字: N --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC7,0x62,0x62,0x52,0x52,0x4A,0x4A,0x4A,0x46,0x46,0xE2,0x00,0x00,
/*-- 文字: O --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
/*-- 文字: P --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0xE0,0x00,0x00,
/*-- 文字: Q --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0xB2,0xCA,0x4C,0x38,0x06,0x00,
/*-- 文字: R --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x7C,0x48,0x48,0x44,0x44,0x42,0xE3,0x00,0x00,
/*-- 文字: S --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x20,0x18,0x04,0x02,0x42,0x42,0x7C,0x00,0x00,
/*-- 文字: T --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,
/*-- 文字: U --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,
/*-- 文字: V --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00,
/*-- 文字: W --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xD6,0x92,0x92,0x92,0x92,0xAA,0xAA,0x6C,0x44,0x44,0x44,0x00,0x00,
/*-- 文字: X --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00,
/*-- 文字: Y --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,
/*-- 文字: Z --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x7E,0x84,0x04,0x08,0x08,0x10,0x20,0x20,0x42,0x42,0xFC,0x00,0x00,
/* [\]^_' */
/*-- 文字: [ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00,
/*-- 文字: \ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x02,
/*-- 文字: ] --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00,
/*-- 文字: ^ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x1C,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: _ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
/*-- 文字: ' --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x60,0x60,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* abcdefghijklmnopqrstuvwxyz */
/*-- 文字: a --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00,
/*-- 文字: b --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x00,0x00,
/*-- 文字: c --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,
/*-- 文字: d --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x06,0x02,0x02,0x02,0x1E,0x22,0x42,0x42,0x42,0x26,0x1B,0x00,0x00,
/*-- 文字: e --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x40,0x42,0x3C,0x00,0x00,
/*-- 文字: f --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x0F,0x11,0x10,0x10,0x7E,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
/*-- 文字: g --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x44,0x44,0x38,0x40,0x3C,0x42,0x42,0x3C,
/*-- 文字: h --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,
/*-- 文字: i --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
/*-- 文字: j --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78,
/*-- 文字: k --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x4E,0x48,0x50,0x68,0x48,0x44,0xEE,0x00,0x00,
/*-- 文字: l --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
/*-- 文字: m --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x49,0x49,0x49,0x49,0x49,0xED,0x00,0x00,
/*-- 文字: n --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,
/*-- 文字: o --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,
/*-- 文字: p --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,
/*-- 文字: q --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x22,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,
/*-- 文字: r --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x32,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,
/*-- 文字: s --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x40,0x3C,0x02,0x42,0x7C,0x00,0x00,
/*-- 文字: t --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x0C,0x00,0x00,
/*-- 文字: u --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00,
/*-- 文字: v --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x10,0x10,0x00,0x00,
/*-- 文字: w --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x92,0x92,0xAA,0xAA,0x44,0x44,0x00,0x00,
/*-- 文字: x --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00,
/*-- 文字: y --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x18,0x10,0x10,0xE0,
/*-- 文字: z --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00,
/* {|}~ */
/*-- 文字: { --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x03,0x04,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x00,
/*-- 文字: | --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
/*-- 文字: } --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x60,0x00,
/*-- 文字: ~ 126--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x30,0x4C,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 向上箭头 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x10,0x10,0x18,0x38,0x38,0x3c,0x3C,0x7c,0x7e,0x7e,0xff,0x00,0x00,
/*-- 向下箭头 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xff,0x7e,0x7e,0x7c,0x3c,0x3c,0x38,0x38,0x18,0x10,0x10,0x00,0x00,
};
//
//unsigned char code num16x32[]={
// /*-- 文字: 0 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x0F,0x78,
//0x0C,0x18,0x1C,0x1C,0x18,0x0C,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x30,0x06,0x30,0x06,
//0x30,0x06,0x30,0x06,0x30,0x06,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x18,0x0C,0x1C,0x1C,
//0x0C,0x18,0x0F,0x78,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 1 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,
//0x1F,0x80,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
//0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
//0x01,0x80,0x07,0xE0,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 2 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x1C,0x78,
//0x30,0x1C,0x30,0x1C,0x30,0x0C,0x30,0x0C,0x30,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x38,
//0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x04,0x0C,0x04,0x18,0x0C,
//0x30,0x1C,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 3 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0xF0,
//0x30,0x38,0x30,0x38,0x30,0x18,0x30,0x18,0x00,0x38,0x00,0x38,0x01,0xF0,0x03,0xE0,
//0x00,0xF0,0x00,0x38,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x30,0x0C,0x30,0x1C,0x30,0x1C,
//0x30,0x38,0x1C,0xF0,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 4 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0x70,
//0x00,0xF0,0x00,0xF0,0x01,0xF0,0x03,0x70,0x03,0x70,0x06,0x70,0x0C,0x70,0x0C,0x70,
//0x18,0x70,0x30,0x70,0x30,0x70,0x60,0x70,0x7F,0xFE,0x00,0x70,0x00,0x70,0x00,0x70,
//0x00,0x70,0x00,0x70,0x03,0xFE,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 5 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x1F,0xFC,
//0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF0,0x1E,0x78,0x18,0x18,
//0x18,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x30,0x1C,0x30,0x1C,0x30,0x1C,
//0x30,0x38,0x1C,0xF8,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 6 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x07,0x9C,
//0x0E,0x0C,0x1C,0x0C,0x18,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x33,0xF8,0x37,0x3C,
//0x3C,0x0C,0x38,0x0E,0x38,0x0E,0x30,0x06,0x30,0x06,0x38,0x06,0x38,0x0E,0x18,0x0E,
//0x1C,0x0C,0x0F,0x38,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 7 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x3F,0xFC,
//0x3C,0x08,0x30,0x18,0x30,0x10,0x20,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0xC0,
//0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,
//0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 8 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x1E,0x78,
//0x38,0x1C,0x38,0x1C,0x30,0x0C,0x38,0x0C,0x38,0x1C,0x3C,0x1C,0x1F,0x38,0x0F,0xF0,
//0x0F,0xF0,0x38,0xF8,0x30,0x7C,0x70,0x1C,0x70,0x1C,0x60,0x0C,0x60,0x0C,0x70,0x1C,
//0x70,0x1C,0x3C,0x78,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
///*-- 文字: 9 --*/
///*-- 宋体24; 此字体下对应的点阵为:宽x高=16x33 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,
//0x38,0x38,0x70,0x18,0x70,0x1C,0x60,0x1C,0x60,0x0C,0x60,0x0C,0x70,0x1C,0x70,0x1C,
//0x78,0x3C,0x3C,0xFC,0x1F,0xDC,0x00,0x1C,0x00,0x1C,0x00,0x18,0x00,0x38,0x30,0x30,
//0x30,0x70,0x39,0xE0,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
//
// };
#endif
中文字库这部分,是重新做的,是使用的PCtoLCD2002工具取模的,取模方式为阴码、逐行式、顺向。
#ifndef HZ16x16_H
#define HZ16x16_H
// ------------------ 汉字字模的数据结构定义 ------------------------ //
struct typFNT_HZ16 // 汉字字模数据结构
{
unsigned char Msk[32]; // 点阵码数据 存放内码后对应的 点阵序列 每个字需要32个字节的点阵序列
unsigned char Index[3]; // 汉字内码索引 存放内码 如"硕" 但是一个字要两个字节表示
};
//阴码、逐行式、顺向
const struct typFNT_HZ16 codeHZ_16[] = // 数据表
{
0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08,"测",
0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02,"试",
0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,"欢",
0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,"迎",
0x10,0x40,0x10,0x40,0x1F,0xFE,0x20,0x40,0x20,0x40,0x67,0xFC,0x64,0x44,0xA4,0x44,0x27,0xFC,0x20,0x40,0x22,0x40,0x21,0x40,0x20,0x80,0x21,0x40,0x22,0x30,0x2C,0x0E,"使",
0x00,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x41,0x08,0x41,0x28,0x80,0x10,"用",
};
#define N_codeHZ (sizeof(codeHZ_16)/sizeof(codeHZ_16[0]))
#endif
按照如下方式取模方式和字体格式,取出来的数据,只需要删掉每行最后的数字即可直接使用,还是多方便。
在本例程中还用到了一幅五星红旗的图,使用的是启光电子的数据,显示效果非常好。由于手机像素无法拍出较好的效果,使用启光电子的宣传图作为展示。
在此部分,将系统时钟提高到了216M,所以需要对起时钟进行配置,这个是来自于合宙官方的例程。
#include
#include "rcc_clk.h"
void RCC_ClkConfiguration(void)
{
RCC_DeInit(); //复位RCC寄存器
RCC_HSEConfig(RCC_HSE_ON); //使能HSE
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待HSE就绪
RCC_PLLCmd(DISABLE); //关闭PLL
AIR_RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_27, 1); //配置PLL,8*27=216MHz
RCC_PLLCmd(ENABLE); //使能PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择PLL作为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2时钟
RCC_LSICmd(ENABLE); //使能内部低速时钟
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); //等待LSI就绪
RCC_HSICmd(ENABLE); //使能内部高速时钟
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //等待HSI就绪
}
//SYSCLK:72.0Mhz,HCLK:72.0Mhz,PCLK1:36.0Mhz,PCLK2:72.0Mhz,ADCCLK:36.0Mhz
//SYSCLK:216.0Mhz,HCLK:216.0Mhz,PCLK1:108.0Mhz,PCLK2:216.0Mhz,ADCCLK:108.0Mhz
void CLK_Printf(void)
{
RCC_ClocksTypeDef clocks;
RCC_GetClocksFreq(&clocks); //获取系统时钟频率
printf("SYSCLK:%.1fMhz,HCLK:%.1fMhz,PCLK1:%.1fMhz,PCLK2:%.1fMhz,ADCCLK:%.1fMhz\r\n",
(float)clocks.SYSCLK_Frequency/1000000,(float)clocks.HCLK_Frequency/1000000,
(float)clocks.PCLK1_Frequency/1000000,(float)clocks.PCLK2_Frequency/1000000,(float)clocks.ADCCLK_Frequency/1000000);
}
#ifndef __RCC_CLK_H__
#define __RCC_CLK_H__
#include "sys.h"
#include "air_rcc.h"
void CLK_Printf(void);
void RCC_ClkConfiguration(void);
#endif
由于将系统时钟提高到了216M,滴答计时器的相关流程就不准了,需要进行优化。
首先在system_air32f10x.c中的SystemCoreClock定义中添加216M的部分
/*******************************************************************************
* Clock Definitions
*******************************************************************************/
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_216MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_216MHz; /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */
#endif
与此同时,还需要在system_air32f10x.h中将使用的宏进行修改
//#define SYSCLK_FREQ_HSE HSE_VALUE
//#define SYSCLK_FREQ_24MHz 24000000
//#define SYSCLK_FREQ_36MHz 36000000
//#define SYSCLK_FREQ_48MHz 48000000
//#define SYSCLK_FREQ_56MHz 56000000
//#define SYSCLK_FREQ_72MHz 72000000
#define SYSCLK_FREQ_216MHz 216000000
这样改了之后,使用delay_us和delay_ms的延时才是准确的,因为用到了SystemCoreClock这个值。
但是由于系统时钟的提高,按照之前的计算方式,会导致delay_ms的延时很短,好像只有200多ms(没有计算,感觉出来的,需要确定)。所以按照如下修改,即可实现长时间的延时。
#include "delay.h"
static uint8_t UsNumber=0;
//static uint16_t MsNumber=0;
void DELAY_Init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
UsNumber=SystemCoreClock/8000000;//为系统时钟的1/8
// MsNumber=(u16)UsNumber*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*UsNumber;
SysTick->VAL=0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{
// u32 temp;
// SysTick->LOAD=(u32)nms*MsNumber;
// SysTick->VAL =0x00;
// SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
// do
// {
// temp=SysTick->CTRL;
// }while((temp&0x01)&&!(temp&(1<<16)));
// SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
// SysTick->VAL =0X00;
while(nms--)
delay_us(1000);
}
完成上述工作后,就需要开始使用了。在main.c中主要包括各类初始化、显示图像、接收串口的数据并且显示到屏幕上。
由于系统时钟发生了变化,所以定时器的配置也需要相应调整。
#include
#include
#include
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "timer.h"
#include "gui.h"
#include "rcc_clk.h"
#include "picture.h"
char str[50];
int main(void)
{
RCC_ClkConfiguration(); //配置时钟
DELAY_Init(); //延时初始化
USART1_Init(115200); //串口1初始化
LED_GPIO_Init(); //LED闪烁
ST7735V_Init(); //LCD初始化
GUI_Clear(Black); //LCD清屏
TIM3_Int_Init(30000-1,72-1); //定时器3初始化,10ms(216M/30k/72=100k)
TIM2_Int_Init(30000-1,36000-1); //定时器2初始化,5000ms(216M/30k/36k=0.2HZ=5000ms)
USART1_ClearBuffer(); //清空串口1接收buffer
CLK_Printf(); //打印时钟频率
printf("wuzjjj\r\n"); //打印欢迎语句
GUI_Pic((u16*)gImage_wl); //LCD显示图片
delay_ms(5000);
GUI_Clear(Black); //LCD清屏
GUI_ShowHzChar(0,0,"Air32F103_LCD测试",White,Black);
while (1)
{
if(USART1_RX_STA&0x8000) //收到串口数据
{
GUI_ShowHzCharAuto(0,16,(char*)USART1_RX_BUF,White,Black);
if(strcmp((char*)USART1_RX_BUF,"LEDR_ON")==0)
LEDR_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDR_OFF")==0)
LEDR_OFF;
else if(strcmp((char*)USART1_RX_BUF,"LEDG_ON")==0)
LEDG_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDG_OFF")==0)
LEDG_OFF;
else if(strcmp((char*)USART1_RX_BUF,"LEDB_ON")==0)
LEDB_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDB_OFF")==0)
LEDB_OFF;
USART1_RX_STA = USART1_RX_STA&0x7FFF; //去掉标志位,剩下数据长度
printf("received,%d:",USART1_RX_STA); //发送辅助信息及收到的数据长度
printf("%s\r\n",USART1_RX_BUF); //将收到的数据发回
USART1_ClearBuffer(); //清空串口1接受buffer
}
}
}
此部分有很大的内容来自与参考启光电子的程序,而且我发现合宙的官方例程,包括SPI的读写,初始化等内容都是非常相似的。
另外在此也发现了合宙官方的一个bug,在SPI写数据的时候,还将数据读了回来,但是在配置SPI的时候却是配置的单向模式,导致每次读写到这里的时候,都需要浪费大量的时间,将其优化后,LCD速度大幅提升。
需要接线如下:
A2<------------>BL
A3<----------->CS
A4<----------->DC
A6<----------->RES
A7<----------->SDA
A5<----------->SCK
3.3V<--------->3V3
GND<------->GND
可以使用排针直接相连,但是这样MCU的正面就在LCD板的下面了,要操作板上的按键就不是很方便,准备后面画一块小板,用于转接,可以直接将MCU板和LCD板插在底板上。
下载程序后,显示界面如下。显示图像,5秒后显示测试字符
在上位机发送“测试12”给MCU,发送的内容是支持中文的,但是需要在中文字库中添加对应的字库
(手机拍摄效果较差,实际显示效果很好)