STM32HAL库 SPI通讯之TFT1.44屏ST7735驱动

本项目基于这个产品官方给的代码向HAL库进行移植

本文章适合有一定CubeMX使用基础和基本的HAL知识

本项目同时我也上传到了Github上,可供各位参考学习:

https://github.com/Dudu-G/stm32hal_OLED_SPI

这里我使用的是stm32f103RCT6板子与这块屏幕进行配套使用。

 

       所以我们可以在CubeMX里面直接配置相应的环境即可对屏幕进行使用,而CubeMX的配置对于HAL库的使用十分方便,对于新手十分友好。对于一些前期的配置我们跳过,详情可以参照其它博主发的一些使用教程。我们直接进入正题。

CubeMX的前期配置

从板子的引脚上看,我们使用的是SPI2,所以我们对SPI2进行一些配置处理。

 

       我们还需要开启两个GPIO引脚,一个作为RS(即DC),一个作为CS。RST直接连接到了板子的复位引脚,所以不需要另外设置。


       代码里面还需要用到微秒级延时函数,但HAL库本身不带有微秒级延时函数,我写了个微妙级延时函数,这里仅供参考一下。如果有需要可以调用自己的微秒级延时函数。

 我这个微秒级延时函数主要是利用定时器来实现的

主要代码如下:

delay_us.c

#include "delay_us.h"

//设置微妙级延时函数delay_us微秒级延时函数
extern TIM_HandleTypeDef htim6;
	#define DLY_TIM_Handle (&htim6)
	void delay_us(uint16_t nus)
	{
		__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
		__HAL_TIM_ENABLE(DLY_TIM_Handle);
		while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
		{
		}
		__HAL_TIM_DISABLE(DLY_TIM_Handle);
	}

delay_us.h

#ifndef __DELAY_us_H_
#define __DELAY_us_H_

#include "main.h"
void delay_us(uint16_t nus);

#endif /* __DELAY_us_H_ */


主要功能代码实现部分

整个功能的实现,分了五个文件。

lcd.c

#include "lcd.h"


//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;  
uint16_t DeviceCode;	

/****************************************************************************
* 名    称:void  SPIv_WriteData(u8 Data)
* 功    能:STM32_模拟SPI写一个字节数据底层函数
* 入口参数:Data
* 出口参数:无
* 说    明:STM32_模拟SPI读写一个字节数据底层函数
****************************************************************************/
void HAL_LCD_SPIv_WriteData(uint8_t Data) {
  for (uint8_t i = 8; i > 0; i--) {
    if (Data & 0x80) {
      HAL_GPIO_WritePin(GPIOB, LCD_SDA, GPIO_PIN_SET);
    } else {
      HAL_GPIO_WritePin(GPIOB, LCD_SDA, GPIO_PIN_RESET);
    }
	   
    HAL_GPIO_WritePin(GPIOB, LCD_SCL, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, LCD_SCL, GPIO_PIN_SET);
    Data <<= 1; 
  }
}



/****************************************************************************
* 名    称:u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
* 功    能:STM32_硬件SPI读写一个字节数据底层函数
* 入口参数:SPIx,Byte
* 出口参数:返回总线收到的数据
* 说    明:STM32_硬件SPI读写一个字节数据底层函数
****************************************************************************/
uint8_t HAL_SPI_WriteByte(SPI_HandleTypeDef *hspi, uint8_t TxData) {
    uint8_t rxData;
    HAL_StatusTypeDef status;
    
    status = HAL_SPI_TransmitReceive(hspi, &TxData, &rxData, 1, HAL_MAX_DELAY);
    
    if (status != HAL_OK) {
        // Handle error here, if needed
        return 0;
    }
    
    return rxData;
}


//******************************************************************
//函数名:  LCD_WR_REG
//功能:    向液晶屏总线写入写16位指令
//输入参数:Reg:待写入的指令值
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_WR_REG(uint16_t data)
{ 
  LCD_CS_CLR;
  LCD_RS_CLR;
  
#if USE_HARDWARE_SPI
  HAL_SPI_Transmit(&hspi2, (uint8_t*)&data, 1, HAL_MAX_DELAY); // 使用 HAL 库的 SPI 传输函数
#else
  HAL_LCD_SPIv_WriteData(data);  // 使用你的 HAL 库的函数
#endif
  
  LCD_CS_SET;
}


//******************************************************************
//函数名:  LCD_WR_DATA
//功能:    向液晶屏总线写入写8位数据
//输入参数:Data:待写入的数据
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_WR_DATA(uint8_t data)
{
    LCD_CS_CLR;
    LCD_RS_SET;

#if USE_HARDWARE_SPI
    HAL_SPI_Transmit(&hspi2, &data, 1, HAL_MAX_DELAY);
#else
    HAL_LCD_SPIv_WriteData(data); // 自定义的 HAL_SPIv_WriteData 函数
#endif

    LCD_CS_SET;
}

//******************************************************************
//函数名:  LCD_DrawPoint_16Bit
//功能:    8位总线下如何写入一个16位数据
//输入参数:(x,y):光标坐标
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_WR_DATA_16Bit(u16 data)
{	
   LCD_CS_CLR;
   LCD_RS_SET;

#if USE_HARDWARE_SPI   
   // 使用硬件SPI写入数据
	uint8_t buf[2];
	buf[0] = data >> 8;
	buf[1] = data;
   HAL_SPI_Transmit(&hspi2, buf, sizeof(buf), HAL_MAX_DELAY);
#else
   // 使用软件SPI写入数据
   SPIv_WriteData(data >> 8);
   SPIv_WriteData(data);
#endif 

   LCD_CS_SET;
}

//******************************************************************
//函数名:  LCD_WriteReg
//功能:    写寄存器数据
//输入参数:LCD_Reg:寄存器地址
//			LCD_RegValue:要写入的数据
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)
{	
	LCD_WR_REG(LCD_Reg);  
	LCD_WR_DATA(LCD_RegValue);
}	   

//******************************************************************
//函数名:  LCD_WriteRAM_Prepare
//功能:    开始写GRAM
//			在给液晶屏传送RGB数据前,应该发送写GRAM指令
//输入参数:无
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_WriteRAM_Prepare(void)
{
	LCD_WR_REG(lcddev.wramcmd);
}
	   
//******************************************************************
//函数名:  LCD_DrawPoint
//功能:    在指定位置写入一个像素点数据
//输入参数:(x,y):光标坐标
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_DrawPoint(u16 x, u16 y)
{
	LCD_SetCursor(x, y);         // 设置光标位置
	LCD_WR_DATA_16Bit(POINT_COLOR);
}

//******************************************************************
//函数名:  LCD_GPIOInit
//功能:    液晶屏IO初始化,液晶初始化前要调用此函数
//输入参数:无
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_GPIOInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	      
	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
	
	GPIO_InitStructure.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);  

	GPIO_InitStructure.Pin = GPIO_PIN_6;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//******************************************************************
//函数名:  LCD_RESET
//功能:    LCD复位函数,液晶初始化前要调用此函数
//输入参数:无
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_RESET(void)
{

	delay_us(100);

	delay_us(50);
}

//******************************************************************
//函数名:  LCD_Init
//功能:    LCD初始化
//输入参数:无
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_Init(void)
{  
										 
	LCD_RESET(); //液晶屏复位

	//************* Start Initial Sequence **********//		
	//开始初始化液晶屏
	LCD_WR_REG(0x11);//Sleep exit 
	HAL_Delay(120);		
	//ST7735R Frame Rate
	LCD_WR_REG(0xB1); 
	LCD_WR_DATA(0x01); 
	LCD_WR_DATA(0x2C); 
	LCD_WR_DATA(0x2D); 

	LCD_WR_REG(0xB2); 
	LCD_WR_DATA(0x01); 
	LCD_WR_DATA(0x2C); 
	LCD_WR_DATA(0x2D); 

	LCD_WR_REG(0xB3); 
	LCD_WR_DATA(0x01); 
	LCD_WR_DATA(0x2C); 
	LCD_WR_DATA(0x2D); 
	LCD_WR_DATA(0x01); 
	LCD_WR_DATA(0x2C); 
	LCD_WR_DATA(0x2D); 
	
	LCD_WR_REG(0xB4); //Column inversion 
	LCD_WR_DATA(0x07); 
	
	//ST7735R Power Sequence
	LCD_WR_REG(0xC0); 
	LCD_WR_DATA(0xA2); 
	LCD_WR_DATA(0x02); 
	LCD_WR_DATA(0x84); 
	LCD_WR_REG(0xC1); 
	LCD_WR_DATA(0xC5); 

	LCD_WR_REG(0xC2); 
	LCD_WR_DATA(0x0A); 
	LCD_WR_DATA(0x00); 

	LCD_WR_REG(0xC3); 
	LCD_WR_DATA(0x8A); 
	LCD_WR_DATA(0x2A); 
	LCD_WR_REG(0xC4); 
	LCD_WR_DATA(0x8A); 
	LCD_WR_DATA(0xEE); 
	
	LCD_WR_REG(0xC5); //VCOM 
	LCD_WR_DATA(0x0E); 
	
	LCD_WR_REG(0x36); //MX, MY, RGB mode 				 
	LCD_WR_DATA(0xC8); 
	
	//ST7735R Gamma Sequence
	LCD_WR_REG(0xe0); 
	LCD_WR_DATA(0x0f); 
	LCD_WR_DATA(0x1a); 
	LCD_WR_DATA(0x0f); 
	LCD_WR_DATA(0x18); 
	LCD_WR_DATA(0x2f); 
	LCD_WR_DATA(0x28); 
	LCD_WR_DATA(0x20); 
	LCD_WR_DATA(0x22); 
	LCD_WR_DATA(0x1f); 
	LCD_WR_DATA(0x1b); 
	LCD_WR_DATA(0x23); 
	LCD_WR_DATA(0x37); 
	LCD_WR_DATA(0x00); 	
	LCD_WR_DATA(0x07); 
	LCD_WR_DATA(0x02); 
	LCD_WR_DATA(0x10); 

	LCD_WR_REG(0xe1); 
	LCD_WR_DATA(0x0f); 
	LCD_WR_DATA(0x1b); 
	LCD_WR_DATA(0x0f); 
	LCD_WR_DATA(0x17); 
	LCD_WR_DATA(0x33); 
	LCD_WR_DATA(0x2c); 
	LCD_WR_DATA(0x29); 
	LCD_WR_DATA(0x2e); 
	LCD_WR_DATA(0x30); 
	LCD_WR_DATA(0x30); 
	LCD_WR_DATA(0x39); 
	LCD_WR_DATA(0x3f); 
	LCD_WR_DATA(0x00); 
	LCD_WR_DATA(0x07); 
	LCD_WR_DATA(0x03); 
	LCD_WR_DATA(0x10);  
	
	LCD_WR_REG(0x2a);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x7f);

	LCD_WR_REG(0x2b);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x9f);
	
	LCD_WR_REG(0xF0); //Enable test command  
	LCD_WR_DATA(0x01); 
	LCD_WR_REG(0xF6); //Disable ram power save mode 
	LCD_WR_DATA(0x00); 
	
	LCD_WR_REG(0x3A); //65k mode 
	LCD_WR_DATA(0x05); 	
	LCD_WR_REG(0x29);//Display on	

	LCD_SetParam();//设置LCD参数	 
//	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);//点亮背光	 
	//LCD_Clear(WHITE);
}

//******************************************************************
//函数名:  LCD_Clear
//功能:    LCD全屏填充清屏函数
//输入参数:Color:要清屏的填充色
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_Clear(uint16_t Color)
{
	uint32_t i, j;      
	LCD_SetWindows(0, 0, lcddev.width - 1, lcddev.height - 1);	  
	for(i = 0; i < lcddev.width; i++)
	{
		for(j = 0; j < lcddev.height; j++)
			LCD_WR_DATA_16Bit(Color);	//写入数据 	 
	}
}

/*************************************************
函数名:LCD_SetWindows
功能:设置lcd显示窗口,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void LCD_SetWindows(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd)
{
#if USE_HORIZONTAL == 1 //使用横屏
	LCD_WR_REG(lcddev.setxcmd);
	LCD_WR_DATA(xStart >> 8);
	LCD_WR_DATA(0x00FF & xStart + 3);
	LCD_WR_DATA(xEnd >> 8);
	LCD_WR_DATA(0x00FF & xEnd + 3);

	LCD_WR_REG(lcddev.setycmd);
	LCD_WR_DATA(yStart >> 8);
	LCD_WR_DATA(0x00FF & yStart + 2);
	LCD_WR_DATA(yEnd >> 8);
	LCD_WR_DATA(0x00FF & yEnd + 2);

#else

	LCD_WR_REG(lcddev.setxcmd);
	LCD_WR_DATA(xStart >> 8);
	LCD_WR_DATA(0x00FF & xStart + 2);
	LCD_WR_DATA(xEnd >> 8);
	LCD_WR_DATA(0x00FF & xEnd + 2);

	LCD_WR_REG(lcddev.setycmd);
	LCD_WR_DATA(yStart >> 8);
	LCD_WR_DATA(0x00FF & yStart + 3);
	LCD_WR_DATA(yEnd >> 8);
	LCD_WR_DATA(0x00FF & yEnd + 3);
#endif

	LCD_WriteRAM_Prepare(); //开始写入GRAM				
}

/*************************************************
函数名:LCD_SetCursor
功能:设置光标位置
入口参数:xy坐标
返回值:无
*************************************************/
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{	  	    			
	LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);
} 

//设置LCD参数
//方便进行横竖屏模式切换
void LCD_SetParam(void)
{ 	
	lcddev.wramcmd=0x2C;
#if USE_HORIZONTAL==1	//使用横屏	  
	lcddev.dir=1;//横屏
	lcddev.width=128;
	lcddev.height=128;
	lcddev.setxcmd=0x2A;
	lcddev.setycmd=0x2B;			
	LCD_WriteReg(0x36,0xA8);

#else//竖屏
	lcddev.dir=0;//竖屏				 	 		
	lcddev.width=128;
	lcddev.height=128;
	lcddev.setxcmd=0x2A;
	lcddev.setycmd=0x2B;	
	LCD_WriteReg(0x36,0xC8);
#endif
}	



lcd.h

#ifndef __LCD_H
#define __LCD_H
#include "main.h"

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;
extern SPI_HandleTypeDef hspi2;

// LCD重要参数集
typedef struct
{
    u16 width;      // LCD 宽度
    u16 height;     // LCD 高度
    u16 id;         // LCD ID
    u8 dir;         // 横屏还是竖屏控制:0,竖屏;1,横屏。
    u16 wramcmd;    // 开始写gram指令
    u16 setxcmd;    // 设置x坐标指令
    u16 setycmd;    // 设置y坐标指令
} _lcd_dev;

extern _lcd_dev lcddev;

/用户配置区///	 
//支持横竖屏快速定义切换,支持8/16位模式切换
#define USE_HORIZONTAL  	0	//定义是否使用横屏 		0,不使用.1,使用.
//使用硬件SPI 还是模拟SPI作为测试
#define USE_HARDWARE_SPI    1  //1:Enable Hardware SPI;0:USE Soft SPI
//	  


#if USE_HORIZONTAL == 1
#define LCD_W 320
#define LCD_H 240
#else
#define LCD_W 240
#define LCD_H 320
#endif

//TFTLCD部分外要调用的函数		   
extern u16  POINT_COLOR;//默认红色    
extern u16  BACK_COLOR; //背景颜色.默认为白色



//-----------------LCD端口定义---------------- 
//模块采用了三极管控制背光亮灭,用户也可以接PWM调节背光亮度
//#define LCD_LED        	GPIO_Pin_9  //PB9 连接至TFT -LED
// LCD控制口定义
#define LCD_CTRL GPIOB
#define LCD_CTRL2 GPIOC
#define LCD_RS GPIO_PIN_6
#define LCD_CS GPIO_PIN_12
#define LCD_SCL GPIO_PIN_13
#define LCD_SDA GPIO_PIN_15

// 液晶控制口置1操作宏定义
#define LCD_CS_SET LCD_CTRL->BSRR = LCD_CS
#define LCD_RS_SET LCD_CTRL2->BSRR = LCD_RS
#define LCD_SDA_SET LCD_CTRL->BSRR = LCD_SDA
#define LCD_SCL_SET LCD_CTRL->BSRR = LCD_SCL

// 液晶控制口置0操作宏定义
#define LCD_CS_CLR LCD_CTRL->BRR = LCD_CS
#define LCD_RS_CLR LCD_CTRL2->BRR = LCD_RS
#define LCD_SDA_CLR LCD_CTRL->BRR = LCD_SDA
#define LCD_SCL_CLR LCD_CTRL->BRR = LCD_SCL

//画笔颜色
#define WHITE       0xFFFF
#define BLACK      	0x0000	  
#define BLUE       	0x001F  
#define BRED        0XF81F
#define GRED 			 	0XFFE0
#define GBLUE			 	0X07FF
#define RED         0xF800
#define MAGENTA     0xF81F
#define GREEN       0x07E0
#define CYAN        0x7FFF
#define YELLOW      0xFFE0
#define BROWN 			0XBC40 //棕色
#define BRRED 			0XFC07 //棕红色
#define GRAY  			0X8430 //灰色
//GUI颜色

#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色  
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色 
 
#define LIGHTGREEN     	0X841F //浅绿色
//#define LIGHTGRAY     0XEF5B //浅灰色(PANNEL)
#define LGRAY 			 		0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE      	0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE          0X2B12 //浅棕蓝色(选择条目的反色)
	    															  
extern u16 BACK_COLOR, POINT_COLOR ;  

void HAL_LCD_SPIv_WriteData(uint8_t Data);
uint8_t HAL_SPI_WriteByte(SPI_HandleTypeDef *hspi, uint8_t TxData);
void LCD_WR_REG(uint16_t data);
void LCD_WR_DATA(uint8_t data);
void LCD_WR_DATA_16Bit(u16 data);
void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void LCD_DrawPoint(u16 x, u16 y);
void LCD_GPIOInit(void);
void LCD_RESET(void);
void LCD_Init(void);
void LCD_Clear(uint16_t Color);
void LCD_SetWindows(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd);
void LCD_SetCursor(u16 Xpos, u16 Ypos);
void LCD_SetParam(void);


#endif

show.c

#include "lcd.h"
#include "string.h"
#include "font.h" 
#include "delay_us.h"
#include "show.h"

//******************************************************************
//函数名:  GUI_DrawPoint
//功能:    GUI描绘一个点
//输入参数:x:光标位置x坐标
//        	y:光标位置y坐标
//			color:要填充的颜色
//返回值:  无
//修改记录:无
//******************************************************************
void GUI_DrawPoint(u16 x,u16 y,u16 color)
{
	LCD_SetCursor(x,y);//设置光标位置 
	LCD_WR_DATA_16Bit(color); 
}

//******************************************************************
//函数名:  LCD_Fill
//功能:    在指定区域内填充颜色
//输入参数:sx:指定区域开始点x坐标
//        	sy:指定区域开始点y坐标
//			ex:指定区域结束点x坐标
//			ey:指定区域结束点y坐标
//        	color:要填充的颜色
//返回值:  无
//修改记录:无
//******************************************************************
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{  	

	u16 i,j;			
	u16 width=ex-sx+1; 		//得到填充的宽度
	u16 height=ey-sy+1;		//高度
	LCD_SetWindows(sx,sy,ex-1,ey-1);//设置显示窗口
	for(i=0;i<height;i++)
	{
		for(j=0;j<width;j++)
		LCD_WR_DATA_16Bit(color);	//写入数据 	 
	}

	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口设置为全屏
}

//******************************************************************
//函数名:  LCD_DrawLine
//功能:    GUI画线
//输入参数:x1,y1:起点坐标
//        	x2,y2:终点坐标 
//返回值:  无
//修改记录:无
//****************************************************************** 
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
	u16 t; 
	int xerr=0,yerr=0,delta_x,delta_y,distance; 
	int incx,incy,uRow,uCol; 

	delta_x=x2-x1; //计算坐标增量 
	delta_y=y2-y1; 
	uRow=x1; 
	uCol=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++ )//画线输出 
	{  
		LCD_DrawPoint(uRow,uCol);//画点 
		xerr+=delta_x ; 
		yerr+=delta_y ; 
		if(xerr>distance) 
		{ 
			xerr-=distance; 
			uRow+=incx; 
		} 
		if(yerr>distance) 
		{ 
			yerr-=distance; 
			uCol+=incy; 
		} 
	}  
} 

//******************************************************************
//函数名:  LCD_DrawRectangle
//功能:    GUI画矩形(非填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值:  无
//修改记录:无
//******************************************************************  
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
	LCD_DrawLine(x1,y1,x2,y1);
	LCD_DrawLine(x1,y1,x1,y2);
	LCD_DrawLine(x1,y2,x2,y2);
	LCD_DrawLine(x2,y1,x2,y2);
}  

//******************************************************************
//函数名:  LCD_DrawFillRectangle
//功能:    GUI画矩形(填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值:  无
//修改记录:无
//******************************************************************   
void LCD_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
	LCD_Fill(x1,y1,x2,y2,POINT_COLOR);

}
 
//******************************************************************
//函数名:  _draw_circle_8
//功能:    对称性画圆算法(内部调用)
//输入参数:(xc,yc) :圆中心坐标
// 			(x,y):光标相对于圆心的坐标
//         	c:填充的颜色
//返回值:  无
//修改记录:无
//******************************************************************  
void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
{
	GUI_DrawPoint(xc + x, yc + y, c);

	GUI_DrawPoint(xc - x, yc + y, c);

	GUI_DrawPoint(xc + x, yc - y, c);

	GUI_DrawPoint(xc - x, yc - y, c);

	GUI_DrawPoint(xc + y, yc + x, c);

	GUI_DrawPoint(xc - y, yc + x, c);

	GUI_DrawPoint(xc + y, yc - x, c);

	GUI_DrawPoint(xc - y, yc - x, c);
}

//******************************************************************
//函数名:  gui_circle
//功能:    在指定位置画一个指定大小的圆(填充)
//输入参数:(xc,yc) :圆中心坐标
//         	c:填充的颜色
//		 	r:圆半径
//		 	fill:填充判断标志,1-填充,0-不填充
//返回值:  无
//修改记录:无
//******************************************************************  
void gui_circle(int xc, int yc,u16 c,int r, int fill)
{
	int x = 0, y = r, yi, d;

	d = 3 - 2 * r;


	if (fill) 
	{
		// 如果填充(画实心圆)
		while (x <= y) {
			for (yi = x; yi <= y; yi++)
				_draw_circle_8(xc, yc, x, yi, c);

			if (d < 0) {
				d = d + 4 * x + 6;
			} else {
				d = d + 4 * (x - y) + 10;
				y--;
			}
			x++;
		}
	} else 
	{
		// 如果不填充(画空心圆)
		while (x <= y) {
			_draw_circle_8(xc, yc, x, y, c);
			if (d < 0) {
				d = d + 4 * x + 6;
			} else {
				d = d + 4 * (x - y) + 10;
				y--;
			}
			x++;
		}
	}
}

//******************************************************************
//函数名:  LCD_ShowChar
//功能:    显示单个英文字符
//输入参数:(x,y):字符显示位置起始坐标
//        	fc:前置画笔颜色
//			bc:背景颜色
//			num:数值(0-94)
//			size:字体大小
//			mode:模式  0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************  
void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
{  
    u8 temp;
    u8 pos,t;
	u16 colortemp=POINT_COLOR;      
		   
	num=num-' ';//得到偏移后的值
	LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
	if(!mode) //非叠加方式
	{
		
		for(pos=0;pos<size;pos++)
		{
			if(size==12)temp=asc2_1206[num][pos];//调用1206字体
			else temp=asc2_1608[num][pos];		 //调用1608字体
			for(t=0;t<size/2;t++)
		    {                 
		        if(temp&0x01)LCD_WR_DATA(fc); 
				else LCD_WR_DATA(bc); 
				temp>>=1; 
				
		    }
			
		}	
	}else//叠加方式
	{
		for(pos=0;pos<size;pos++)
		{
			if(size==12)temp=asc2_1206[num][pos];//调用1206字体
			else temp=asc2_1608[num][pos];		 //调用1608字体
			for(t=0;t<size/2;t++)
		    {   
				POINT_COLOR=fc;              
		        if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点    
		        temp>>=1; 
		    }
		}
	}
	POINT_COLOR=colortemp;	
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏    	   	 	  
} 

//******************************************************************
//函数名:  LCD_ShowChar
//功能:    显示单个英文字符
//输入参数:(x,y):字符显示位置起始坐标
//        	fc:前置画笔颜色
//			bc:背景颜色
//			num:数值(0-94)
//			size:字体大小
//			mode:模式  0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************  
void LCD_ShowNum2412(u16 x,u16 y,u16 fc, u16 bc,u8 *p ,u8 size,u8 mode)
{  
    u16 temp;
    u8 pos,t;
	u16 colortemp=POINT_COLOR;      
	u16 x0=x;
	u16 y0=y; 
	u8 num=0;
	

    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {   

		if(x>(lcddev.width-1)||y>(lcddev.height-1)) 
		return;   
		num=*p;
		if(':'==num) //特殊字符":"
		num=10;	
		else if('.'==num)//特殊字符"."
		num=11;	
		else  //纯数字   	
		num=num-'0';   
		x0=x;
		    
		for(pos=0;pos<48;pos++)
		{
			temp=asc2_2412[num][pos];
			for(t=0;t<8;t++)
		    {   
				POINT_COLOR=fc;              
		        if(temp&0x80)LCD_DrawPoint(x,y);//画一个点  
				//else LCD_WR_DATA_16Bit(bc);   
		        temp<<=1; 
				x++;
				if((x-x0)==12)
				{
					x=x0;
					y++;
					break;
				}
		    }
		}
	if(num<10)
	x+=16;	//人为控制字距,使得排版更好看,原值为12
	else
	x+=8; //人为控制字距,使得排版更好看,原值为12

	y=y0;
    p++;
    }  
	POINT_COLOR=colortemp;	 	 	  
} 


//******************************************************************
//函数名:  LCD_ShowString
//功能:    显示英文字符串
//输入参数:x,y :起点坐标	 
//			size:字体大小
//			*p:字符串起始地址
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************  	  
void LCD_ShowString(u16 x,u16 y,u8 size,u8 *p,u8 mode)
{         
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {   
		if(x>(lcddev.width-1)||y>(lcddev.height-1)) 
		return;     
        LCD_ShowChar(x,y,POINT_COLOR,BACK_COLOR,*p,size,mode);
        x+=size/2;
        p++;
    }  
} 

//******************************************************************
//函数名:  mypow
//功能:    求m的n次方(gui内部调用)
//输入参数:m:乘数
//	        n:幂
//返回值:  m的n次方
//修改记录:无
//******************************************************************  
u32 mypow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;    
	return result;
}

//******************************************************************
//函数名:  LCD_ShowNum
//功能:    显示单个数字变量值
//输入参数:x,y :起点坐标	 
//			len :指定显示数字的位数
//			size:字体大小(12,16)
//			color:颜色
//			num:数值(0~4294967295)
//返回值:  无
//修改记录:无
//******************************************************************  			 
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,' ',size,1);
				continue;
			}else enshow=1; 
		 	 
		}
	 	LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,temp+'0',size,1); 
	}
} 

//******************************************************************
//函数名:  GUI_DrawFont16
//功能:    显示单个16X16中文字体
//输入参数:x,y :起点坐标
//			fc:前置画笔颜色
//			bc:背景颜色	 
//			s:字符串地址
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************
void GUI_DrawFont16(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
	u8 i,j;
	u16 k;
	u16 HZnum;
	u16 x0=x;
	HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);	//自动统计汉字数目
	
			
	for (k=0;k<HZnum;k++) 
	{
	  if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
	  { 	LCD_SetWindows(x,y,x+16-1,y+16-1);
		    for(i=0;i<16*2;i++)
		    {
				for(j=0;j<8;j++)
		    	{	
					if(!mode) //非叠加方式
					{
						if(tfont16[k].Msk[i]&(0x80>>j))	LCD_WR_DATA_16Bit(fc);
						else LCD_WR_DATA_16Bit(bc);
					}
					else
					{
						POINT_COLOR=fc;
						if(tfont16[k].Msk[i]&(0x80>>j))	LCD_DrawPoint(x,y);//画一个点
						x++;
						if((x-x0)==16)
						{
							x=x0;
							y++;
							break;
						}
					}

				}
				
			}
			
			
		}				  	
		continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
	}

	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏  
} 

//******************************************************************
//函数名:  GUI_DrawFont24
//功能:    显示单个24X24中文字体
//输入参数:x,y :起点坐标
//			fc:前置画笔颜色
//			bc:背景颜色	 
//			s:字符串地址
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************
void GUI_DrawFont24(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
	u8 i,j;
	u16 k;
	u16 HZnum;
	u16 x0=x;
	HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);	//自动统计汉字数目
		
			for (k=0;k<HZnum;k++) 
			{
			  if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
			  { 	LCD_SetWindows(x,y,x+24-1,y+24-1);
				    for(i=0;i<24*3;i++)
				    {
							for(j=0;j<8;j++)
							{
								if(!mode) //非叠加方式
								{
									if(tfont24[k].Msk[i]&(0x80>>j))	LCD_WR_DATA_16Bit(fc);
									else LCD_WR_DATA_16Bit(bc);
								}
							else
							{
								POINT_COLOR=fc;
								if(tfont24[k].Msk[i]&(0x80>>j))	LCD_DrawPoint(x,y);//画一个点
								x++;
								if((x-x0)==24)
								{
									x=x0;
									y++;
									break;
								}
							}
						}
					}
					
					
				}				  	
				continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
			}

	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏  
}

//******************************************************************
//函数名:  GUI_DrawFont32
//功能:    显示单个32X32中文字体
//输入参数:x,y :起点坐标
//			fc:前置画笔颜色
//			bc:背景颜色	 
//			s:字符串地址
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//****************************************************************** 
void GUI_DrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
	u8 i,j;
	u16 k;
	u16 HZnum;
	u16 x0=x;
	HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);	//自动统计汉字数目
	for (k=0;k<HZnum;k++) 
			{
			  if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
			  { 	LCD_SetWindows(x,y,x+32-1,y+32-1);
				    for(i=0;i<32*4;i++)
				    {
						for(j=0;j<8;j++)
				    	{
							if(!mode) //非叠加方式
							{
								if(tfont32[k].Msk[i]&(0x80>>j))	LCD_WR_DATA_16Bit(fc);
								else LCD_WR_DATA_16Bit(bc);
							}
							else
							{
								POINT_COLOR=fc;
								if(tfont32[k].Msk[i]&(0x80>>j))	LCD_DrawPoint(x,y);//画一个点
								x++;
								if((x-x0)==32)
								{
									x=x0;
									y++;
									break;
								}
							}
						}
					}
					
					
				}				  	
				continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
			}
	
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏  
} 

//******************************************************************
//函数名:  Show_Str
//功能:    显示一个字符串,包含中英文显示
//输入参数:x,y :起点坐标
// 			fc:前置画笔颜色
//			bc:背景颜色
//			str :字符串	 
//			size:字体大小
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************    	   		   
void Show_Str(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode)
{					
	u16 x0=x;							  	  
  	u8 bHz=0;     //字符或者中文 
    while(*str!=0)//数据未结束
    { 
        if(!bHz)
        {
			if(x>(lcddev.width-size/2)||y>(lcddev.height-size)) 
			return; 
	        if(*str>0x80)bHz=1;//中文 
	        else              //字符
	        {          
		        if(*str==0x0D)//换行符号
		        {         
		            y+=size;
					x=x0;
		            str++; 
		        }  
		        else
				{
					if(size==12||size==16)
					{  
					LCD_ShowChar(x,y,fc,bc,*str,size,mode);
					x+=size/2; //字符,为全字的一半 
					}
					else//字库中没有集成16X32的英文字体,用8X16代替
					{
					 	LCD_ShowChar(x,y,fc,bc,*str,16,mode);
						x+=8; //字符,为全字的一半 
					}
				} 
				str++; 
		        
	        }
        }else//中文 
        {   
			if(x>(lcddev.width-size)||y>(lcddev.height-size)) 
			return;  
            bHz=0;//有汉字库    
			if(size==32)
			GUI_DrawFont32(x,y,fc,bc,str,mode);	 	
			else if(size==24)
			GUI_DrawFont24(x,y,fc,bc,str,mode);	
			else
			GUI_DrawFont16(x,y,fc,bc,str,mode);
				
	        str+=2; 
	        x+=size;//下一个汉字偏移	    
        }						 
    }   
}

//******************************************************************
//函数名:  Gui_StrCenter
//功能:    居中显示一个字符串,包含中英文显示
//输入参数:x,y :起点坐标
// 			fc:前置画笔颜色
//			bc:背景颜色
//			str :字符串	 
//			size:字体大小
//			mode:模式	0,填充模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************   
void Gui_StrCenter(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode)
{
	u16 len=strlen((const char *)str);
	u16 x1=(lcddev.width-len*8)/2;
	Show_Str(x+x1,y,fc,bc,str,size,mode);
} 
 
//******************************************************************
//函数名:  Gui_Drawbmp16
//功能:    显示一副16位BMP图像
//输入参数:x,y :起点坐标
// 			*p :图像数组起始地址
//返回值:  无
//修改记录:无
//******************************************************************  
void Gui_Drawbmp16(u16 x,u16 y,const unsigned char *p) //显示40*40 QQ图片
{
  	int i; 
	unsigned char picH,picL; 
	LCD_SetWindows(x,y,x+40-1,y+40-1);//窗口设置
    for(i=0;i<40*40;i++)
	{	
	 	picL=*(p+i*2);	//数据低位在前
		picH=*(p+i*2+1);				
		LCD_WR_DATA_16Bit(picH<<8|picL);  						
	}	
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复显示窗口为全屏	

}

show.h

#ifndef _SHOW_H_
#define _SHOW_H_

#include "main.h"

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

extern uint16_t POINT_COLOR;
extern uint16_t BACK_COLOR;  
extern uint16_t DeviceCode;	


void GUI_DrawPoint(u16 x,u16 y,u16 color);
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);
void Draw_Circle(u16 x0,u16 y0,u16 fc,u8 r);
void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode);
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);
void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode);
void LCD_ShowString(u16 x,u16 y,u8 size,u8 *p,u8 mode);
void GUI_DrawFont16(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode);
void GUI_DrawFont24(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode);
void GUI_DrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode);
void Show_Str(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode);
void Gui_Drawbmp16(u16 x,u16 y,const unsigned char *p); //显示40*40 QQ图片
void gui_circle(int xc, int yc,u16 c,int r, int fill);
void Gui_StrCenter(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode);
void LCD_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2);
void LCD_ShowNum2412(u16 x,u16 y,u16 fc, u16 bc,u8 *p ,u8 size,u8 mode);

#endif /* _SHOW_H_ */

font.h

#ifndef __FONT_H
#define __FONT_H 	   
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
const unsigned char asc2_1206[95][12] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x00,0x00},/*"!",1*/
{0x00,0x14,0x0A,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x14,0x14,0x3F,0x14,0x0A,0x3F,0x0A,0x0A,0x00,0x00},/*"#",3*/
{0x00,0x04,0x1E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0F,0x04,0x00},/*"$",4*/
{0x00,0x00,0x12,0x15,0x0D,0x0A,0x14,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/
{0x00,0x00,0x04,0x0A,0x0A,0x1E,0x15,0x15,0x09,0x36,0x00,0x00},/*"&",6*/
{0x00,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x00},/*"(",8*/
{0x00,0x02,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x00},/*")",9*/
{0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x04,0x04,0x04,0x1F,0x04,0x04,0x04,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/
{0x00,0x10,0x08,0x08,0x08,0x04,0x04,0x02,0x02,0x02,0x01,0x00},/*"/",15*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/
{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/
{0x00,0x00,0x08,0x0C,0x0A,0x0A,0x09,0x1E,0x08,0x18,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x01,0x01,0x0F,0x10,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/
{0x00,0x00,0x0E,0x09,0x01,0x0F,0x11,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x1E,0x10,0x12,0x0E,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/
{0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x1F,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/
{0x00,0x00,0x0E,0x11,0x19,0x15,0x15,0x1D,0x01,0x1E,0x00,0x00},/*"@",32*/
{0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/
{0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/
{0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
{0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/
{0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/
{0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/
{0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x00},/*"J",42*/
{0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x0A,0x12,0x37,0x00,0x00},/*"K",43*/
{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/
{0x00,0x00,0x1B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x15,0x00,0x00},/*"M",45*/
{0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/
{0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/
{0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/
{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/
{0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/
{0x00,0x00,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/
{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/
{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/
{0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/
{0x00,0x02,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x00,0x00},/*"\",60*/
{0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/
{0x00,0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/
{0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/
{0x00,0x00,0x03,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x02,0x1C,0x00,0x00},/*"c",67*/
{0x00,0x00,0x18,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/
{0x00,0x00,0x38,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1E,0x22,0x1C},/*"g",71*/
{0x00,0x00,0x03,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/
{0x00,0x00,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/
{0x00,0x00,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/
{0x00,0x00,0x03,0x02,0x02,0x3A,0x0A,0x0E,0x12,0x37,0x00,0x00},/*"k",75*/
{0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x04,0x04,0x0E,0x04,0x04,0x04,0x18,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0A,0x0C,0x04,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0A,0x0C,0x04,0x04,0x03},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/
{0x00,0x18,0x08,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/
{0x00,0x06,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/
{0x02,0x25,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} /*"~",94*/
};
const unsigned char asc2_1608[95][16] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00},/*"!",1*/
{0x00,0x48,0x6C,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x24,0x24,0x24,0x7F,0x12,0x12,0x12,0x7F,0x12,0x12,0x12,0x00,0x00},/*"#",3*/
{0x00,0x00,0x08,0x1C,0x2A,0x2A,0x0A,0x0C,0x18,0x28,0x28,0x2A,0x2A,0x1C,0x08,0x08},/*"$",4*/
{0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2A,0x58,0x54,0x54,0x54,0x22,0x00,0x00},/*"%",5*/
{0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0A,0x76,0x25,0x29,0x11,0x91,0x6E,0x00,0x00},/*"&",6*/
{0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*"(",8*/
{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x6B,0x1C,0x1C,0x6B,0x08,0x08,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x08,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00},/*".",14*/
{0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},/*"/",15*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},/*"7",23*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",24*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04},/*";",27*/
{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x1C,0x22,0x5A,0x55,0x55,0x55,0x55,0x2D,0x42,0x22,0x1C,0x00,0x00},/*"@",32*/
{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/
{0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00},/*"C",35*/
{0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"D",36*/
{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00},/*"E",37*/
{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,0x00,0x00},/*"G",39*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"H",40*/
{0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F},/*"J",42*/
{0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00},/*"K",43*/
{0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00},/*"L",44*/
{0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00},/*"M",45*/
{0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00},/*"O",47*/
{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x4D,0x53,0x32,0x1C,0x60,0x00},/*"Q",49*/
{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00},/*"R",50*/
{0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00},/*"S",51*/
{0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"T",52*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"U",53*/
{0x00,0x00,0x00,0xE7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00},/*"V",54*/
{0x00,0x00,0x00,0x6B,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,0x00,0x00},/*"W",55*/
{0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00},/*"X",56*/
{0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00},/*"Z",58*/
{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"[",59*/
{0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40},/*"\",60*/
{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"]",61*/
{0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/
{0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00},/*"a",65*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C},/*"g",71*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/
{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E},/*"j",74*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00},/*"z",90*/
{0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00},/*"{",91*/
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*"|",92*/
{0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00},/*"}",93*/
{0x0C,0x32,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
const unsigned char asc2_2412[12][48] = {
#if 1
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x1F,0xC0,0x6F,0xD0,0x77,0xB0,0x70,0x30,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x20,0x10,0x70,0x30,0x70,0x30,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x67,0xD0,0x6F,0xE0,0x1F,0xE0,0x1F,0xE0},/*"0",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x78,0x00,0x36,0x00,0x2E,0x00,0x0E,0x00,
0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,
0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00},/*"1",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x7F,0xE0,0x7F,0xE0,0x3F,0xD0,0x00,0x30,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x1F,0xD0,0x1F,0xE0,0x2F,0xE0,0x77,0xE0,
0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x6F,0xF0,0x5F,0xF0,0x3F,0xF0,0x3F,0xF0},/*"2",2*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x7F,0xF0,0x7F,0xE0,0x3F,0xD0,0x00,0x30,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x3F,0xB0,0x7F,0xD0,0x7F,0xD0,0x3F,0xB0,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x3F,0xD0,0x7F,0xE0,0x7F,0xF0,0x3F,0xF0},/*"3",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x37,0xB0,0x0F,0xD0,0x0F,0xD0,0x07,0xB0,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x10},/*"4",4*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x5F,0xF0,0x6F,0xF0,0x77,0xF0,0x70,0x00,
0x70,0x00,0x70,0x00,0x70,0x00,0x3F,0x80,0x1F,0xC0,0x1F,0xC0,0x0F,0xB0,0x00,0x30,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x3F,0xD0,0x7F,0xD0,0x7F,0xE0,0x3F,0xE0},/*"5",5*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x1F,0xF0,0x6F,0xF0,0x77,0xF0,0x70,0x00,
0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x77,0xC0,0x2F,0xC0,0x6F,0xD0,0x77,0xB0,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x67,0xD0,0x6F,0xE0,0x1F,0xE0,0x1F,0xE0},/*"6",6*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x7F,0xE0,0x7F,0xD0,0x3F,0x90,0x00,0x30,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x10,0x00,0x30,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x10},/*"7",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x1F,0xC0,0x6F,0xD0,0x77,0xB0,0x70,0x30,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x77,0xB0,0x2F,0xD0,0x6F,0xF0,0x77,0xB0,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x67,0xD0,0x6F,0xE0,0x1F,0xE0,0x1F,0xC0},/*"8",8*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x1F,0xC0,0x6F,0xD0,0x77,0xB0,0x70,0x30,
0x70,0x30,0x70,0x30,0x70,0x30,0x70,0x30,0x6F,0xB0,0x0F,0xD0,0x0F,0xF0,0x0F,0xB0,
0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x3F,0xD0,0x7F,0xE0,0x7F,0xE0,0x3F,0xC0},/*"9",9*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x60,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",0*/
#endif
};



typedef struct
{
    unsigned char Index[2];
    char Msk[32];
}typFNT_GB16;
//字体取模:宋体常规小四
const typFNT_GB16 tfont16[] =
{
"系",0x00,0x00,0x00,0x0C,0x3F,0xF8,0x03,0x00,0x06,0x38,0x0C,0x70,0x1F,0xC0,0x03,0x8C,
0x0E,0x0C,0x3F,0xFE,0x0D,0xB6,0x0D,0x98,0x19,0x9C,0x31,0x8C,0x31,0x86,0x67,0x86,/*0*/
"统",0x00,0x00,0x00,0x00,0x18,0x30,0x1B,0xFF,0x30,0x60,0x36,0xCC,0x6C,0xCC,0x7D,0x86,
0x19,0xFE,0x18,0xDB,0x30,0xD8,0x7F,0xD8,0x70,0xDB,0x01,0x9B,0x1F,0x9B,0x77,0x1F,/*1*/
"监",0x00,0x00,0x00,0x00,0x06,0xC0,0x36,0xFF,0x36,0xC0,0x37,0x80,0x37,0xB0,0x37,0x18,
0x06,0x0C,0x00,0x00,0x3F,0xFE,0x36,0x66,0x36,0x66,0x36,0x66,0x36,0x66,0x7F,0xFF,/*2*/
"控",0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x37,0xFF,0x7E,0xFB,0x37,0x9E,0x33,0x8C,
0x3F,0x06,0x38,0x00,0x31,0xFC,0x70,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x7F,0xFF,/*3*/
"℃",0xC0,0x00,0x23,0xE8,0x2C,0x18,0xD8,0x08,0x10,0x08,0x30,0x00,0x30,0x00,0x30,0x00,
0x30,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x18,0x08,0x0C,0x10,0x03,0xE0,0x00,0x00,/*0*/
};
typedef struct
{
    unsigned char Index[2];
    char Msk[72];
}typFNT_GB24;
//字体取模:宋体常规小四
const typFNT_GB24 tfont24[] =
{
"温",0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0C,0x7F,0xF0,0x04,0x40,0x20,0x04,
0x40,0x20,0x01,0x40,0x20,0x02,0x7F,0xE0,0x62,0x40,0x20,0x32,0x40,0x20,0x12,0x40,
0x20,0x04,0x7F,0xE0,0x04,0x00,0x00,0x05,0x00,0x10,0x04,0xFF,0xF8,0x08,0x89,0x10,
0x78,0x89,0x10,0x18,0x89,0x10,0x18,0x89,0x10,0x18,0x89,0x10,0x18,0x89,0x10,0x18,
0x89,0x16,0x07,0x76,0xE8,0x00,0x00,0x00,/*0*/
"湿",0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x08,0x7F,0xF8,0x0C,0x60,0x10,0x04,
0x60,0x10,0x01,0x60,0x10,0x42,0x7F,0xF0,0x32,0x60,0x10,0x1A,0x60,0x10,0x12,0x7F,
0xF0,0x04,0x69,0x00,0x04,0x08,0x80,0x05,0x08,0x8C,0x08,0x88,0x8C,0x18,0xC8,0x98,
0x38,0x48,0x90,0x18,0x68,0xA0,0x10,0x48,0xC0,0x10,0x08,0x80,0x30,0x08,0x80,0x10,
0x08,0x8C,0x03,0xF7,0x70,0x00,0x00,0x00,/*1*/
"度",0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x0C,0x08,0x0F,0xFF,0xFC,0x08,
0x40,0x00,0x08,0x30,0xC0,0x08,0x20,0x88,0x08,0x20,0x9C,0x0F,0xFF,0xE0,0x08,0x20,
0x80,0x08,0x20,0x80,0x08,0x3F,0x80,0x08,0x00,0x00,0x19,0xFF,0xE0,0x18,0x20,0xC0,
0x10,0x20,0x80,0x10,0x11,0x80,0x10,0x0B,0x00,0x20,0x06,0x00,0x20,0x1B,0x80,0x40,
0x60,0xFE,0x47,0x80,0x18,0x00,0x00,0x00,/*2*/
"电",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,
0x10,0x00,0x0F,0xFF,0xF0,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,
0x20,0x0F,0xFF,0xE0,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,
0x0F,0xFF,0xE0,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x10,0x08,0x00,0x10,0x04,0x00,
0x18,0x0C,0x00,0x0F,0xF8,0x00,0x00,0x00,/*3*/
"压",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0F,0xFF,0xFC,0x0C,0x00,0x00,0x0C,
0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,
0x00,0x0D,0xFF,0xF0,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x08,0x0C,0x80,0x08,0x0C,0x40,
0x08,0x0C,0x60,0x08,0x0C,0x30,0x10,0x0C,0x20,0x10,0x0C,0x00,0x20,0x0C,0x0C,0x27,
0xF3,0xF0,0x40,0x00,0x00,0x00,0x00,0x00,/*4*/
"流",0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x06,0x00,0x08,0x02,0x08,0x04,0xFF,0xFC,0x06,
0x04,0x00,0x00,0x04,0x00,0x01,0x08,0x40,0x41,0x10,0x20,0x31,0x20,0x30,0x12,0x7F,
0xD0,0x12,0x00,0x10,0x04,0x64,0x60,0x04,0x64,0x40,0x04,0x64,0x40,0x08,0x64,0x40,
0x78,0x64,0x40,0x18,0x44,0x40,0x18,0x44,0x44,0x18,0xC4,0x44,0x18,0x84,0x44,0x19,
0x04,0x7E,0x06,0x04,0x00,0x00,0x00,0x00,/*5*/
"℃",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x12,0x1F,0x80,0x12,
0x30,0x68,0x12,0x60,0x18,0x0C,0xC0,0x18,0x00,0x80,0x08,0x01,0x80,0x08,0x01,0x80,
0x00,0x01,0x80,0x00,0x01,0x80,0x00,0x01,0x80,0x00,0x01,0x80,0x00,0x00,0x80,0x00,
0x00,0xC0,0x00,0x00,0xC0,0x10,0x00,0x60,0x20,0x00,0x38,0xC0,0x00,0x0F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*,6*/
":",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
"%",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0x08,
0x80,0x30,0x08,0x80,0x60,0x08,0x80,0xC0,0x08,0x81,0x80,0x08,0x81,0x00,0x08,0x82,
0x00,0x05,0x04,0x00,0x02,0x08,0x00,0x00,0x11,0xE0,0x00,0x21,0x10,0x00,0x41,0x10,
0x00,0x83,0x10,0x01,0x03,0x10,0x02,0x01,0x10,0x04,0x01,0x10,0x08,0x00,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*0*/
"V",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC1,0xF0,0x03,
0x00,0x40,0x03,0x00,0x40,0x01,0x00,0x80,0x01,0x80,0x80,0x01,0x81,0x00,0x00,0xC1,
0x00,0x00,0xC3,0x00,0x00,0x62,0x00,0x00,0x62,0x00,0x00,0x24,0x00,0x00,0x34,0x00,
0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*0*/
"A",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x00,0x18,0x00,0x00,0x1C,0x00,0x00,0x2C,0x00,0x00,0x24,0x00,0x00,0x66,
0x00,0x00,0x46,0x00,0x00,0xC3,0x00,0x00,0x83,0x00,0x00,0xFF,0x00,0x01,0x01,0x80,
0x01,0x01,0x80,0x02,0x00,0xC0,0x02,0x00,0xC0,0x0F,0x83,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*1*/
};
typedef struct
{
    unsigned char Index[2];
    char Msk[128];
}typFNT_GB32;
//字体取模:宋体常规小四
const typFNT_GB32 tfont32[] =
{
"字",0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xC0,0x00,
0x00,0x01,0xC0,0xC0,0x00,0x01,0x07,0xC0,0x00,0x01,0xFF,0x00,0x02,0x1F,0xFE,0x00,
0x07,0xF0,0x1C,0x00,0x07,0xC0,0x70,0x00,0x0F,0x00,0xE0,0x00,0x0E,0x03,0xF0,0x00,
0x1C,0x0F,0xF0,0x00,0x3C,0x0F,0x70,0x00,0x3C,0x00,0xE0,0x00,0x18,0x00,0xC0,0x00,
0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,
0x00,0x00,0x37,0x00,0x00,0x01,0xFF,0x00,0x00,0x7F,0xF8,0x00,0x07,0xF8,0x30,0x00,
0x1F,0x80,0x30,0x00,0x00,0x80,0x30,0x00,0x00,0xC0,0x30,0x00,0x00,0x60,0x60,0x00,
0x00,0x18,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*0*/
};
#endif

       完成了前期配置之后,我们只需要将这些文件移植到我们的工程中即可使用。需要注意的是,我们在打印中文时,要注意字体的大小,用取模工具取出代码后放入font.h的相应字体大小的数组中。

主函数中包含这些头文件并初始化

	LCD_Init();	   //液晶屏初始化
	LCD_Clear(BLACK); //清屏
	POINT_COLOR=WHITE; 
	
	LCD_DrawRectangle(0,0,128-1,128-1);	//画矩形 
	Show_Str(2,2,GREEN,YELLOW,(u8 *)"Dudu",16,1);

       我觉得新手刚开始HAL库可能会面临资源信息不足的情况,现在很多产品都是标准库的,我们要将标准库的一些基本函数逻辑给弄清楚之后再开始HAL库的学习。这样我们才能更得心应手的做项目。32最方便的就是能将不同的功能写在不同的文件里面,我们需要什么功能的时候能够直接调用即可,所以很多时候我们在做项目开发时,不可避免的会面临移植别人的代码,学会使用何尝不是一种能力呢。

本文章是基于标准库的移植代码,所以会存在一些小问题,欢迎各位大佬指正!

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32F4 HAL库下的ST7735S硬件驱动程序应该包含如下内容: 1. 配置ST7735S的引脚管脚,如时钟、数据总线、命令/数据线、重置线等。 2. 实现ST7735S的初始化函数,用于对幕进行设置,如初始化寄存器、开启显示等。 3. 实现ST7735S的写命令函数,用于向幕发送指令。 4. 实现ST7735S的写数据函数,用于向幕发送数据。 5. 实现ST7735S的读数据函数,用于从幕读取数据。 6. 实现ST7735S的清函数,用于清除幕上的数据。 7. 实现ST7735S的显示字符串函数,用于在幕上显示字符串。 8. 其他辅助函数,如绘制点,绘制线等。 需要注意的是这些函数都应该是在STM32F4 HAL库下实现。 ### 回答2: ST7735S是一款常用的TFT液晶显示模块,使用它进行硬件驱动可以使STM32F4系列微控制器能够显示图形和文本信息。下面是一个简单的例子,展示如何编写一个ST7735S的硬件驱动: 首先,需要先定义ST7735S使用的引脚: ``` #define ST7735S_SPI_PORT SPI1 #define ST7735S_RST_PIN GPIO_PIN_0 #define ST7735S_RST_PORT GPIOA #define ST7735S_DC_PIN GPIO_PIN_1 #define ST7735S_DC_PORT GPIOA #define ST7735S_CS_PIN GPIO_PIN_2 #define ST7735S_CS_PORT GPIOA ``` 接下来,需要编写初始化函数,用于配置SPI和GPIO引脚,并初始化ST7735S模块: ``` void ST7735S_Init(void) { // 配置SPI引脚 HAL_GPIO_Init(ST7735S_DC_PORT, ST7735S_DC_PIN, GPIO_MODE_OUTPUT_PP); HAL_GPIO_Init(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_MODE_OUTPUT_PP); HAL_GPIO_Init(ST7735S_RST_PORT, ST7735S_RST_PIN, GPIO_MODE_OUTPUT_PP); // 配置SPI SPI_HandleTypeDef spi; spi.Instance = ST7735S_SPI_PORT; spi.Init.Mode = SPI_MODE_MASTER; spi.Init.Direction = SPI_DIRECTION_2LINES; spi.Init.DataSize = SPI_DATASIZE_8BIT; spi.Init.CLKPolarity = SPI_POLARITY_LOW; spi.Init.CLKPhase = SPI_PHASE_1EDGE; spi.Init.NSS = SPI_NSS_SOFT; spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; spi.Init.FirstBit = SPI_FIRSTBIT_MSB; spi.Init.TIMode = SPI_TIMODE_DISABLE; spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spi.Init.CRCPolynomial = 7; HAL_SPI_Init(&spi); // 重置ST7735S HAL_GPIO_WritePin(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(ST7735S_RST_PORT, ST7735S_RST_PIN, GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(ST7735S_RST_PORT, ST7735S_RST_PIN, GPIO_PIN_SET); HAL_Delay(100); // 初始化ST7735S ST7735S_WriteCommand(ST7735S_SLPOUT); HAL_Delay(100); ST7735S_WriteCommand(ST7735S_DISPON); } ``` 接下来,可以编写函数用于向ST7735S发送命令和数据: ``` void ST7735S_WriteCommand(uint8_t cmd) { HAL_GPIO_WritePin(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(ST7735S_DC_PORT, ST7735S_DC_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(&spi, &cmd, sizeof(cmd), HAL_MAX_DELAY); HAL_GPIO_WritePin(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_PIN_SET); } void ST7735S_WriteData(uint8_t data) { HAL_GPIO_WritePin(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(ST7735S_DC_PORT, ST7735S_DC_PIN, GPIO_PIN_SET); HAL_SPI_Transmit(&spi, &data, sizeof(data), HAL_MAX_DELAY); HAL_GPIO_WritePin(ST7735S_CS_PORT, ST7735S_CS_PIN, GPIO_PIN_SET); } ``` 最后,可以编写函数用于绘制图形和文本信息: ``` void ST7735S_DrawPixel(uint16_t x, uint16_t y, uint16_t color) { ST7735S_WriteCommand(ST7735S_CASET); // 设置X轴范围 ST7735S_WriteData(0x00); ST7735S_WriteData(x); ST7735S_WriteData(0x00); ST7735S_WriteData(x + 1); ST7735S_WriteCommand(ST7735S_RASET); // 设置Y轴范围 ST7735S_WriteData(0x00); ST7735S_WriteData(y); ST7735S_WriteData(0x00); ST7735S_WriteData(y + 1); ST7735S_WriteCommand(ST7735S_RAMWR); // 写入像素数据 ST7735S_WriteData(color >> 8); ST7735S_WriteData(color & 0xFF); } ``` 这只是一个简单的示例,用于说明如何编写ST7735S的硬件驱动。实际应用中可能需要更多功能和更复杂的操作,可以根据实际需求进行相应的扩展和修改。 ### 回答3: STM32F4 HAL库是STMicroelectronics为其STM32F4系列微控制器开发的一套硬件抽象层,用于简化对硬件的底层驱动编程。而ST7735S是一种常用的彩色TFT LCD控制器芯片。因此,编写一个STM32F4 HAL库驱动ST7735S芯片,需要进行以下步骤: 1. 硬件连接:首先,将LCD控制器芯片ST7735S与STM32F4微控制器相连接。这通常包括连接SPI总线(串行外设接口)的引脚,如SCK(时钟线)、MISO(数据输入线)、MOSI(数据输出线)和CS(片选线)。还需要连接复位引脚和数据/命令切换引脚。 2. 初始化:使用STM32F4 HAL库的初始化函数,对SPI总线进行初始化配置。设置SPI的时钟速度、数据位大小等参数,并初始化控制器芯片的复位引脚和数据/命令切换引脚。 3. 发送命令和数据:为了与ST7735S通信,需要先发送一些命令以配置LCD的各种参数,例如幕分辨率、颜色模式等。之后可以发送数据来实现图形、文本等的显示。使用STM32F4 HAL库SPI传输函数,可以向ST7735S发送命令和数据。 4. 图形绘制:开发一个图形绘制模块,以便可以绘制点、线、矩形、圆等各种基本图形。这需要将绘图命令转换为相应的ST7735S命令和数据,并使用STM32F4 HAL库SPI传输函数进行发送。 5. 文本显示:实现一个文本显示模块,可以定义字体和字符大小,并根据需要在幕上显示文本。同样,需要将字符数据转换为ST7735S命令和数据,并使用SPI传输函数发送。 6. 其他功能:根据需要,可以实现其他功能,例如显示位图、绘制曲线、图像反色等。这些功能的实现也需要将相应的数据转换为ST7735S命令和数据,并使用SPI传输函数进行发送。 总结起来,编写一个STM32F4 HAL库驱动ST7735S芯片,需要了解ST7735S的通信协议和寄存器设置,并利用STM32F4 HAL库中的SPI功能函数进行相应的数据传输。这样就可以实现通过STM32F4微控制器控制和显示彩色TFT LCD幕的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值