4.合宙Air32F103_LCD

一、简介

1.1本章目的

在上一章已经实现串口不定长接收帧的基础上,完成LCD相关的显示功能,使用串口发送任意字符串,在LCD屏幕上进行显示。

显示相关需要完成的内容包括:

  1. 英文字符、中文汉字、画图等基础显示函数
  2. 画图、画线、画圆等GUI
  3. 解决例程刷新慢的问题

1.2LCD模块

LCD模块也是合宙的LCD扩展板,分辨率是160*80的,驱动是ST7735,这款屏之前在启光电子的STM32F103高级版C8开发板上见过,所以相关的控制函数将主要移植自启光的相关例程,对其进行简单优化。
4.合宙Air32F103_LCD_第1张图片

二、例程移植

打开合宙的SPI文件夹,里面含有LCD的例程:ModuleDemo\SPI\SPI_Air10x_LCD\USER\SPI.uvprojx。
4.合宙Air32F103_LCD_第2张图片
打开启光电子的相关例程:
4.合宙Air32F103_LCD_第3张图片

三、移植

3.1st7735v.c

主要包括底层的驱动:引脚初始化、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;
} 

3.2st7735.h

#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

3.3gui.c

主要包括清屏、画点、画线、画图、英文字符显示、中文汉字显示等。在此基础上又增加了混合显示英文和中文的函数,以及自动换行的函数。

#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;
	  }
	}	
}

3.4gui.h

#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

3.5英文字库

用到了中英文显示,当然也少不了字库的需要。

/*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

3.6中文字库

中文字库这部分,是重新做的,是使用的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

按照如下方式取模方式和字体格式,取出来的数据,只需要删掉每行最后的数字即可直接使用,还是多方便。
4.合宙Air32F103_LCD_第4张图片

3.7图像

在本例程中还用到了一幅五星红旗的图,使用的是启光电子的数据,显示效果非常好。由于手机像素无法拍出较好的效果,使用启光电子的宣传图作为展示。

4.合宙Air32F103_LCD_第5张图片

在这里插入图片描述

3.8 rcc_clk.c

在此部分,将系统时钟提高到了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);
}

3.9rcc_clk.h

#ifndef __RCC_CLK_H__
#define __RCC_CLK_H__
#include "sys.h"
#include "air_rcc.h"


void CLK_Printf(void);
void RCC_ClkConfiguration(void);

#endif

3.10delay.c

由于将系统时钟提高到了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);
}

3.11main.c

完成上述工作后,就需要开始使用了。在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
		}
	}
}

3.12说明

此部分有很大的内容来自与参考启光电子的程序,而且我发现合宙的官方例程,包括SPI的读写,初始化等内容都是非常相似的。

另外在此也发现了合宙官方的一个bug,在SPI写数据的时候,还将数据读了回来,但是在配置SPI的时候却是配置的单向模式,导致每次读写到这里的时候,都需要浪费大量的时间,将其优化后,LCD速度大幅提升。

4.合宙Air32F103_LCD_第6张图片
4.合宙Air32F103_LCD_第7张图片

四、调试

4.1接线

需要接线如下:

A2<------------>BL
A3<----------->CS
A4<----------->DC
A6<----------->RES
A7<----------->SDA
A5<----------->SCK
3.3V<--------->3V3
GND<------->GND
可以使用排针直接相连,但是这样MCU的正面就在LCD板的下面了,要操作板上的按键就不是很方便,准备后面画一块小板,用于转接,可以直接将MCU板和LCD板插在底板上。

4.2调试结果

下载程序后,显示界面如下。显示图像,5秒后显示测试字符
4.合宙Air32F103_LCD_第8张图片

在上位机发送“测试12”给MCU,发送的内容是支持中文的,但是需要在中文字库中添加对应的字库

4.合宙Air32F103_LCD_第9张图片

(手机拍摄效果较差,实际显示效果很好)

你可能感兴趣的:(合宙Air32F103,单片机,stm32,嵌入式硬件)