TFT-LCD显示屏(1.8寸 STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.工作原理:TFT-LCD色彩空间

三、程序设计

main.c文件

lcd.h文件

lcd.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        TFT-LCD全称Thin Film Transistor Liquid Crystal Display即薄膜晶体管液晶显示器,是多数液晶显示器的一种,使用薄膜晶体管技术改善影象品质。它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。

以下是TFT-LCD显示屏模块的参数:

尺寸

1.8

模块电压

DC:3.3V

模块电流

30mA

分辨率

128×160

驱动

ST7735

管脚数

8

接口

4线SPI接口

工作温度

-20~70

哔哩哔哩视频链接:

TFT-LCD显示屏(1.8寸 STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

2.引脚描述

引脚名称

描述

GND

电源地

VCC

电源正3.3~5V

SCL

SPI时钟线

SDA

SPI数据线

RES

复位接口

DC

SPI数据/命令选择线

CS

SPI片选

BLK

背光控制

3.工作原理:TFT-LCD色彩空间

    颜色是一种物理量,但是在计算机中人们将物理世界中的颜色进行量化,利用二进制来表示不同的颜色,从而有了RGB的概念。RGB又分为RGB565RGB666RGB888.

RGB565的意思是用5位表示R分量,6位表示G分量和5位表示B分量,每个像素的颜色用2个字节来表示。RGB565最多可以显示65536种颜色。

三、程序设计

使用STM32F103C8T6中英文字符数字图片显示在LCD显示屏上

LCD_SCL

PA0

LCD_SDA

PA1

LCD_RES

PA2

LCD_DC

PA3

LCD_CS

PA4

LCD_BLK

PA5

main.c文件

#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "pic.h"
#include "led.h"/*****************辰哥单片机设计******************STM32* 项目			:	TFT-LCD显示屏(1.8寸)实验                     * 版本			: V1.0* 日期			: 2024.9.13* MCU			:	STM32F103C8T6* 接口			:	参看lcd.h							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/int main(void)
{SystemInit();//配置系统时钟为72M	delay_init(72);LED_Init();LED_On();LCD_Init();LCD_Fill(0,0,LCD_W,LCD_H,WHITE);//	LCD_ShowChinese(0,0,"你好世界",RED,BLACK,16,0);
//		LCD_ShowString(0,30,"HELLO WORLD",RED,WHITE,16,0);
//	LCD_ShowIntNum(20,30,666,3,RED,WHITE,32);LCD_ShowPicture(10,10,100,100,gImage_PIC);while(1){LED_Toggle();delay_ms(500);}
}

lcd.h文件

#ifndef __LCD_H
#define __LCD_H 
#include "sys.h"
#include "stdlib.h"	/*****************辰哥单片机设计******************STM32* 文件			:	TFT-LCD显示屏(1.8寸)h文件                     * 版本			: V1.0* 日期			: 2024.9.13* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************///----------------OLED端口定义----------------- 
/***************根据自己需求更改****************/
#define LCD_SCL_GPIO_PORT				GPIOA
#define LCD_SCL_GPIO_PIN				GPIO_Pin_0#define LCD_SDA_GPIO_PORT				GPIOA
#define LCD_SDA_GPIO_PIN				GPIO_Pin_1#define LCD_RST_GPIO_PORT				GPIOA
#define LCD_RST_GPIO_PIN				GPIO_Pin_2#define LCD_DC_GPIO_PORT				GPIOA
#define LCD_DC_GPIO_PIN					GPIO_Pin_3#define LCD_CS_GPIO_PORT				GPIOA
#define LCD_CS_GPIO_PIN					GPIO_Pin_4#define LCD_BLK_GPIO_PORT				GPIOA
#define LCD_BLK_GPIO_PIN				GPIO_Pin_5/*********************END**********************/#define LCD_SCLK_Clr() GPIO_ResetBits(LCD_SCL_GPIO_PORT,LCD_SCL_GPIO_PIN)//SCL=SCLK
#define LCD_SCLK_Set() GPIO_SetBits(LCD_SCL_GPIO_PORT,LCD_SCL_GPIO_PIN)#define LCD_MOSI_Clr() GPIO_ResetBits(LCD_SDA_GPIO_PORT,LCD_SDA_GPIO_PIN)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetBits(LCD_SDA_GPIO_PORT,LCD_SDA_GPIO_PIN)#define LCD_RES_Clr()  GPIO_ResetBits(LCD_RST_GPIO_PORT,LCD_RST_GPIO_PIN)//RES
#define LCD_RES_Set()  GPIO_SetBits(LCD_RST_GPIO_PORT,LCD_RST_GPIO_PIN)#define LCD_DC_Clr()   GPIO_ResetBits(LCD_DC_GPIO_PORT,LCD_DC_GPIO_PIN)//DC
#define LCD_DC_Set()   GPIO_SetBits(LCD_DC_GPIO_PORT,LCD_DC_GPIO_PIN)#define LCD_CS_Clr()   GPIO_ResetBits(LCD_CS_GPIO_PORT,LCD_CS_GPIO_PIN)//CS
#define LCD_CS_Set()   GPIO_SetBits(LCD_CS_GPIO_PORT,LCD_CS_GPIO_PIN)#define LCD_BLK_Clr()  GPIO_ResetBits(LCD_BLK_GPIO_PORT,LCD_BLK_GPIO_PIN)//BLK
#define LCD_BLK_Set()  GPIO_SetBits(LCD_BLK_GPIO_PORT,LCD_BLK_GPIO_PIN)#define USE_HORIZONTAL 1  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160#else
#define LCD_W 160
#define LCD_H 128
#endif//画笔颜色
#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 //灰色
#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色  
#define GRAYBLUE       	 0X5458 //灰蓝色
#define LIGHTGREEN     	 0X841F //浅绿色
#define LGRAY 			     0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(u8 dat);//模拟SPI时序
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 LCD_Init(void);//LCD初始化void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//指定区域填充颜色
void LCD_DrawPoint(u16 x,u16 y,u16 color);//在指定位置画一个点
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//在指定位置画一条线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置画一个矩形
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//在指定位置画一个圆void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示汉字串
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个12x12汉字
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个16x16汉字
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个24x24汉字
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个32x32汉字void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//显示一个字符
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//显示字符串
u32 mypow(u8 m,u8 n);//求幂
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//显示整数变量
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//显示两位小数变量void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);//显示图片#endif

lcd.c文件

#include "lcd.h"
#include "stdlib.h"
#include "lcdfont.h"  	 
#include "delay.h"/*****************辰哥单片机设计******************STM32* 文件			:	TFT-LCD显示屏(1.8寸)c文件                     * 版本			: V1.0* 日期			: 2024.9.13* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/void LCD_GPIO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能A端口时钟GPIO_InitStructure.GPIO_Pin = LCD_SCL_GPIO_PIN|LCD_SDA_GPIO_PIN|LCD_RST_GPIO_PIN|LCD_DC_GPIO_PIN|LCD_CS_GPIO_PIN|LCD_BLK_GPIO_PIN;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(LCD_SCL_GPIO_PORT, &GPIO_InitStructure);	  //初始化GPIOAGPIO_SetBits(LCD_SCL_GPIO_PORT,LCD_SCL_GPIO_PIN|LCD_SDA_GPIO_PIN|LCD_RST_GPIO_PIN|LCD_DC_GPIO_PIN|LCD_CS_GPIO_PIN|LCD_BLK_GPIO_PIN);
}/******************************************************************************函数说明:LCD串行数据写入函数入口数据:dat  要写入的串行数据返回值:  无
******************************************************************************/
void LCD_Writ_Bus(u8 dat) 
{	u8 i;LCD_CS_Clr();for(i=0;i<8;i++){			  LCD_SCLK_Clr();if(dat&0x80){LCD_MOSI_Set();}else{LCD_MOSI_Clr();}LCD_SCLK_Set();dat<<=1;}	LCD_CS_Set();	
}/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{LCD_Writ_Bus(dat);
}/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{LCD_Writ_Bus(dat>>8);LCD_Writ_Bus(dat);
}/******************************************************************************函数说明:LCD写入命令入口数据:dat 写入的命令返回值:  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{LCD_DC_Clr();//写命令LCD_Writ_Bus(dat);LCD_DC_Set();//写数据
}/******************************************************************************函数说明:设置起始和结束地址入口数据:x1,x2 设置列的起始和结束地址y1,y2 设置行的起始和结束地址返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{if(USE_HORIZONTAL==0){LCD_WR_REG(0x2a);//列地址设置LCD_WR_DATA(x1+2);LCD_WR_DATA(x2+2);LCD_WR_REG(0x2b);//行地址设置LCD_WR_DATA(y1+1);LCD_WR_DATA(y2+1);LCD_WR_REG(0x2c);//储存器写}else if(USE_HORIZONTAL==1){LCD_WR_REG(0x2a);//列地址设置LCD_WR_DATA(x1+2);LCD_WR_DATA(x2+2);LCD_WR_REG(0x2b);//行地址设置LCD_WR_DATA(y1+1);LCD_WR_DATA(y2+1);LCD_WR_REG(0x2c);//储存器写}else if(USE_HORIZONTAL==2){LCD_WR_REG(0x2a);//列地址设置LCD_WR_DATA(x1+1);LCD_WR_DATA(x2+1);LCD_WR_REG(0x2b);//行地址设置LCD_WR_DATA(y1+2);LCD_WR_DATA(y2+2);LCD_WR_REG(0x2c);//储存器写}else{LCD_WR_REG(0x2a);//列地址设置LCD_WR_DATA(x1+1);LCD_WR_DATA(x2+1);LCD_WR_REG(0x2b);//行地址设置LCD_WR_DATA(y1+2);LCD_WR_DATA(y2+2);LCD_WR_REG(0x2c);//储存器写}
}void LCD_Init(void)
{LCD_GPIO_Init();//初始化GPIOLCD_RES_Clr();//复位delay_ms(100);LCD_RES_Set();delay_ms(100);LCD_BLK_Set();//打开背光delay_ms(100);//************* Start Initial Sequence **********//LCD_WR_REG(0x11); //Sleep out delay_ms(120);              //Delay 120ms //------------------------------------ST7735S Frame Rate-----------------------------------------// LCD_WR_REG(0xB1); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x05);LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); //------------------------------------End ST7735S Frame Rate---------------------------------// LCD_WR_REG(0xB4); //Dot inversion LCD_WR_DATA8(0x03); //------------------------------------ST7735S Power Sequence---------------------------------// LCD_WR_REG(0xC0); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x08); 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(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8D); LCD_WR_DATA8(0xEE); //---------------------------------End ST7735S Power Sequence-------------------------------------// LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA8(0x1A); LCD_WR_REG(0x36); //MX, MY, RGB mode if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);else LCD_WR_DATA8(0xA0); //------------------------------------ST7735S Gamma Sequence---------------------------------// LCD_WR_REG(0xE0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x2E); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2A); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x26); LCD_WR_DATA8(0x2E); LCD_WR_DATA8(0x3A); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x13); LCD_WR_REG(0xE1); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x16); LCD_WR_DATA8(0x06); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x26); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x27); LCD_WR_DATA8(0x27); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x3B); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x13); //------------------------------------End ST7735S Gamma Sequence-----------------------------// LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29); //Display on 
} /******************************************************************************函数说明:在指定区域填充颜色入口数据:xsta,ysta   起始坐标xend,yend   终止坐标color       要填充的颜色返回值:  无
******************************************************************************/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{          u16 i,j; LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围for(i=ysta;i<yend;i++){													   	 	for(j=xsta;j<xend;j++){LCD_WR_DATA(color);}} 					  	    
}/******************************************************************************函数说明:在指定位置画点入口数据:x,y 画点坐标color 点的颜色返回值:  无
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 color)
{LCD_Address_Set(x,y,x,y);//设置光标位置 LCD_WR_DATA(color);
} /******************************************************************************函数说明:画线入口数据:x1,y1   起始坐标x2,y2   终止坐标color   线的颜色返回值:  无
******************************************************************************/
void LCD_DrawLine(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,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,color);//画点xerr+=delta_x;yerr+=delta_y;if(xerr>distance){xerr-=distance;uRow+=incx;}if(yerr>distance){yerr-=distance;uCol+=incy;}}
}/******************************************************************************函数说明:画矩形入口数据:x1,y1   起始坐标x2,y2   终止坐标color   矩形的颜色返回值:  无
******************************************************************************/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{LCD_DrawLine(x1,y1,x2,y1,color);LCD_DrawLine(x1,y1,x1,y2,color);LCD_DrawLine(x1,y2,x2,y2,color);LCD_DrawLine(x2,y1,x2,y2,color);
}/******************************************************************************函数说明:画圆入口数据:x0,y0   圆心坐标r       半径color   圆的颜色返回值:  无
******************************************************************************/
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{int a,b;a=0;b=r;	  while(a<=b){LCD_DrawPoint(x0-b,y0-a,color);             //3           LCD_DrawPoint(x0+b,y0-a,color);             //0           LCD_DrawPoint(x0-a,y0+b,color);             //1                LCD_DrawPoint(x0-a,y0-b,color);             //2             LCD_DrawPoint(x0+b,y0+a,color);             //4               LCD_DrawPoint(x0+a,y0-b,color);             //5LCD_DrawPoint(x0+a,y0+b,color);             //6 LCD_DrawPoint(x0-b,y0+a,color);             //7a++;if((a*a+b*b)>(r*r))//判断要画的点是否过远{b--;}}
}/******************************************************************************函数说明:显示汉字串入口数据:x,y显示坐标*s 要显示的汉字串fc 字的颜色bc 字的背景色sizey 字号 可选 16 24 32mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{while(*s!=0){if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);else return;s+=2;x+=sizey;}
}/******************************************************************************函数说明:显示单个12x12汉字入口数据:x,y显示坐标*s 要显示的汉字fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{u8 i,j,m=0;u16 k;u16 HZnum;//汉字数目u16 TypefaceNum;//一个字符所占字节大小u16 x0=x;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);	//统计汉字数目for(k=0;k<HZnum;k++) {if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1))){ 	LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);for(i=0;i<TypefaceNum;i++){for(j=0;j<8;j++){	if(!mode)//非叠加方式{if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);else LCD_WR_DATA(bc);m++;if(m%sizey==0){m=0;break;}}else//叠加方式{if(tfont12[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizey){x=x0;y++;break;}}}}}				  	continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}
} /******************************************************************************函数说明:显示单个16x16汉字入口数据:x,y显示坐标*s 要显示的汉字fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{u8 i,j,m=0;u16 k;u16 HZnum;//汉字数目u16 TypefaceNum;//一个字符所占字节大小u16 x0=x;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;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_Address_Set(x,y,x+sizey-1,y+sizey-1);for(i=0;i<TypefaceNum;i++){for(j=0;j<8;j++){	if(!mode)//非叠加方式{if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);else LCD_WR_DATA(bc);m++;if(m%sizey==0){m=0;break;}}else//叠加方式{if(tfont16[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizey){x=x0;y++;break;}}}}}				  	continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}
} /******************************************************************************函数说明:显示单个24x24汉字入口数据:x,y显示坐标*s 要显示的汉字fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{u8 i,j,m=0;u16 k;u16 HZnum;//汉字数目u16 TypefaceNum;//一个字符所占字节大小u16 x0=x;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;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_Address_Set(x,y,x+sizey-1,y+sizey-1);for(i=0;i<TypefaceNum;i++){for(j=0;j<8;j++){	if(!mode)//非叠加方式{if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);else LCD_WR_DATA(bc);m++;if(m%sizey==0){m=0;break;}}else//叠加方式{if(tfont24[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizey){x=x0;y++;break;}}}}}				  	continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}
} /******************************************************************************函数说明:显示单个32x32汉字入口数据:x,y显示坐标*s 要显示的汉字fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{u8 i,j,m=0;u16 k;u16 HZnum;//汉字数目u16 TypefaceNum;//一个字符所占字节大小u16 x0=x;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;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_Address_Set(x,y,x+sizey-1,y+sizey-1);for(i=0;i<TypefaceNum;i++){for(j=0;j<8;j++){	if(!mode)//非叠加方式{if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);else LCD_WR_DATA(bc);m++;if(m%sizey==0){m=0;break;}}else//叠加方式{if(tfont32[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizey){x=x0;y++;break;}}}}}				  	continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}
}/******************************************************************************函数说明:显示单个字符入口数据:x,y显示坐标num 要显示的字符fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{u8 temp,sizex,t,m=0;u16 i,TypefaceNum;//一个字符所占字节大小u16 x0=x;sizex=sizey/2;TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;num=num-' ';    //得到偏移后的值LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置 for(i=0;i<TypefaceNum;i++){ if(sizey==12)temp=ascii_1206[num][i];		       //调用6x12字体else if(sizey==16)temp=ascii_1608[num][i];		 //调用8x16字体else if(sizey==24)temp=ascii_2412[num][i];		 //调用12x24字体else if(sizey==32)temp=ascii_3216[num][i];		 //调用16x32字体else return;for(t=0;t<8;t++){if(!mode)//非叠加模式{if(temp&(0x01<<t))LCD_WR_DATA(fc);else LCD_WR_DATA(bc);m++;if(m%sizex==0){m=0;break;}}else//叠加模式{if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点x++;if((x-x0)==sizex){x=x0;y++;break;}}}}   	 	  
}/******************************************************************************函数说明:显示字符串入口数据:x,y显示坐标*p 要显示的字符串fc 字的颜色bc 字的背景色sizey 字号mode:  0非叠加模式  1叠加模式返回值:  无
******************************************************************************/
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{         while(*p!='\0'){       LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);x+=sizey/2;p++;}  
}/******************************************************************************函数说明:显示数字入口数据:m底数,n指数返回值:  无
******************************************************************************/
u32 mypow(u8 m,u8 n)
{u32 result=1;	 while(n--)result*=m;return result;
}/******************************************************************************函数说明:显示整数变量入口数据:x,y显示坐标num 要显示整数变量len 要显示的位数fc 字的颜色bc 字的背景色sizey 字号返回值:  无
******************************************************************************/
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	u8 t,temp;u8 enshow=0;u8 sizex=sizey/2;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+t*sizex,y,' ',fc,bc,sizey,0);continue;}else enshow=1; }LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);}
} /******************************************************************************函数说明:显示两位小数变量入口数据:x,y显示坐标num 要显示小数变量len 要显示的位数fc 字的颜色bc 字的背景色sizey 字号返回值:  无
******************************************************************************/
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	u8 t,temp,sizex;u16 num1;sizex=sizey/2;num1=num*100;for(t=0;t<len;t++){temp=(num1/mypow(10,len-t-1))%10;if(t==(len-2)){LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);t++;len+=1;}LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);}
}/******************************************************************************函数说明:显示图片入口数据:x,y起点坐标length 图片长度width  图片宽度pic[]  图片数组    返回值:  无
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{u16 i,j;u32 k=0;LCD_Address_Set(x,y,x+length-1,y+width-1);for(i=0;i<length;i++){for(j=0;j<width;j++){LCD_WR_DATA8(pic[k*2]);LCD_WR_DATA8(pic[k*2+1]);k++;}}			
}

四、实验效果 

五、资料获取

项目分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430176.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; func longestPalindrome(s string) int {mp : map[byte]int{}for i : 0; i < len(s); i {mp[s[i]]}res : 0for _, v : range mp {if v&1 1 {res v - 1} else {res v}}if res<len(s) {res}return res }

C++笔记21•C++11的新特性•

相比于 C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简…

如何合并pdf文件,四款软件,三步搞定!

在数字化办公的浪潮中&#xff0c;PDF文档因其跨平台兼容性和安全性&#xff0c;成为了我们日常工作中不可或缺的一部分。然而&#xff0c;面对多个PDF文件需要整合成一个文件时&#xff0c;不少小伙伴可能会感到头疼。别担心&#xff0c;今天我们就来揭秘四款高效PDF合并软件&…

演示:基于WPF的DrawingVisual开发的Chart图表和表格绘制

一、目的&#xff1a;基于WPF的DrawingVisual开发的Chart图表和表格绘制 二、预览 钻井井轨迹表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟井轨迹深度的绘制&#xff09; 饼图表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟多个饼状图组合显示&am…

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

又到了金九银十,你的简历写好了吗?

又到了金九银十的招聘季&#xff0c;不过这几年求职环境越来越差&#xff0c;相比于跳槽找新机会&#xff0c;大家可能更倾向于守住自己手头的工作&#xff0c;稳字当头。当然&#xff0c;也有很多工作实在干烦了的朋友&#xff0c;想要换个新赛道试试。今天就给大家带来一个新…

django实现开发、测试、生产环境配置区分

文章目录 一、为什么要区分开发 (dev)、测试 (test) 和生产 (prod) 环境二、django项目如何通过配置实现环境配置的区分1、针对不同的环境创建不同的设置文件settings.py2、在设置文件中根据需要进行配置区分3、根据不同的环境运行使用不同的设置文件 任何实际的软件项目中都要…

【中级通信工程师】终端与业务(二):终端产品

【零基础3天通关中级通信工程师】 终端与业务(二)&#xff1a;终端产品 本文是中级通信工程师考试《终端与业务》科目第二章《终端产品》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目&#xff0c;有效复习通过率可达90%以上&#xff0c;本文结合了高频考点和近几…

医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析

文章目录 项目三 关联规则分析一、实践目的二、实践平台三、实践内容任务一&#xff1a;在线购物车分析&#xff08;一&#xff09;数据读入&#xff08;二&#xff09;数据理解&#xff08;三&#xff09;数据预处理&#xff08;四&#xff09;生成频繁项集&#xff08;五&…

基于微信小程序的美食外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

分享两个虚拟试衣工具,一个在线,一个离线,还有ComfyUI插件

SAM &#xff0c;对不住了&#xff01; 我没记错的话&#xff0c;OpenAI CEO&#xff0c;性别男&#xff0c;取向男&#xff0c;配偶男。 这又让我联想到了苹果CEO库克... 所以OpenAI和Apple可以一啪即合。 钢铁直男老马就和他们都不对付~~ 开个玩笑&#xff0c;聊…

WebGL入门(一)绘制一个点

源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scr…

Web+Mysql——MyBatis

MyBatis 目标 能够完成Mybatis代理方式查询数据能够理解Mybatis核心配置文件的配置 1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由…

高等代数笔记(2)————(弱/强)数学归纳法

数学归纳法的引入情景其实很简单&#xff0c;就是多米诺骨牌。 推倒所有多米诺骨牌的关键就是推倒第一块&#xff0c;以及确保第一块倒下后会带动第二块&#xff0c;第二块带动第三块&#xff0c;以此类推&#xff0c;也就是可以递推。由此我们可以归纳出所有的多米诺骨牌都可…

MySQL学习(索引)

文章目录 基本概念单列索引普通索引&#xff08;index&#xff09;唯一索引&#xff08;unique&#xff09;主键索引 组合索引全文索引&#xff08;fulltext&#xff09;空间索引&#xff08;spatial&#xff09;MySQL存储引擎 基本概念 通过某种算法&#xff0c;构建数据模型&…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。 图…

k8s中pod的创建过程和阶段状态

管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录&#xff0c;也可以用证书登录 k8s只能用证书登录 谁拿到这个证书&#xff0c;谁就可以管理集群 在k8s中&#xff0c;所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…

如何使用 maxwell 同步到 redis?

文章目录 1、MaxwellListener2、MxwObject1. 使用Maxwell捕获MySQL变更2. 将Maxwell的输出连接到消息系统3. 从消息系统读取数据并同步到Redis注意事项 1、MaxwellListener package com.atguigu.tingshu.album.listener;import com.alibaba.fastjson.JSON; import org.apache.…

mysql中的json查询

首先来构造数据 查询department里面name等于研发部的数据 查询语句跟普通的sql语句差不多&#xff0c;也就是字段名要用到path表达式 select * from user u where u.department->$.name 研发部 模糊查询 select * from user u where u.department->$.name like %研发%…

Go-知识recover

Go-知识recover 1. 介绍2. 工作机制2.1 recover 定义2.2 工作流程2.3 总结 3. 原理3.1 recover函数的真正逻辑3.2 恢复逻辑3.3 生效条件 4. 总结4.1 recover的返回值是什么&#xff1f;4.2 执行recover之后程序将从哪里继续运行&#xff1f;4.3 recover为什么一定要在defer中使…