外观
屏幕显示实验
电路分析
简易万用表项目使用1.8寸TFT屏幕模块作为显示,1.8寸屏幕模块具有128*160个像素点,屏幕模块驱动芯片为ST7735,采用SPI通讯协议进行驱动。
在对TFT屏幕模块引脚进行连接时,需要注意该引脚是否是单片机的SPI引脚,想要使用单片机的硬件SPI功能,就必须配置为对应的引脚,否则只能使用软件模拟,SPI片选引脚可不考虑,软件片选没有太大差别。
功能实现
创建工程
- 点击左上方文件、选择新建,选择新建MounRiver工程;
- 对工程进行修改,修改完成后点击“完成”按键,系统会自动生成好工程;
- 创建自己的工程库文件夹,分别创建头文件与源文件,其中"tftinit.c"文件用于存放TFT屏幕初始化函数,"tftshow.c"文件用于存放TFT屏幕显示函数。
- 对工程库路径进行包含;
代码实现
- 自行编写TFT屏幕模块驱动与显示函数较为困难,大多情况下,屏幕厂商都有提供好相关的驱动代码进行参考,我们仅需要找到相关的驱动代码进行移植即可,这里以STM32F103C8T6相关参考例程进行移植。
- 移植相关TFT屏幕初始化函数
- 包含头文件,在头文件中包含ch32相关的头文件,方便对相关库函数进行调用;
- 按照例程,在源文件中将对应的函数先创建好,后续再依据CH32芯片的具体函数内容进行编写;
- 修改引脚初始化函数
在原案例初始化中,此处并没有使用硬件SPI,我们需要使用相关的硬件SPI,需要参考相关的硬件SPI+DMA例程,对CH32引脚进行初始化即可。
- 参考CH32官方SPI案例进行修改
初始化SPI引脚
C
/*
* 函数内容:SPI2初始化
* 函数参数:无
* 返回值:无
*/
void SPI2_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
SPI_InitTypeDef SPI_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //SPI_SCK
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //SPI_MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//此处相关配置与参考案例保持一致
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- 将对应SPI发送数据函数也拷贝过来,后续使用此函数向屏幕发送数据。
spi发送函数
C
/*
* 函数内容:SPI发送数据函数
* 函数参数:uint8_t data--待发送的数据
* 返回值:无
*/
void SPI2_Write(uint8_t data)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
;
SPI_I2S_SendData(SPI2, data);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET)
;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 其余引脚初始化按照屏幕厂商案例正常初始化即可,注意在初始化中包含SPI函数初始化;
其余引脚初始化函数
C
/*
* 函数内容:初始化LCD引脚
* 函数参数:无
* 返回值:无
*/
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_14; //BLK/CS/RES/DC
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_14);
SPI2_init();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 修改LCD串行数据写入函数,屏幕厂商案例中是没有使用硬件SPI的,是通过GPIO引脚模拟高低电平来实现发送的时序,这里我们使用SPI发送函数即可,注意设置片选引脚的高低电平。
串行发送数据
C
/*
* 函数内容:LCD串行数据写入函数
* 函数参数:dat 要写入的串行数据
* 返回值:无
*/
void LCD_Writ_Bus(uint8_t dat)
{
SPI2_Write(dat);
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 修改其余函数,其余函数都是调用串行数据写入函数,这里全部按照案例进行修改,注意对应片选引脚以及命令引脚的高低电平。
其余发送数据/命令函数
C
/*
* 函数内容:LCD写入数据-单字节
* 函数参数:dat 写入的数据
* 返回值:无
*/
void LCD_WR_DATA8(uint8_t dat)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_RESET); //拉低片选信号,开始发送数据
LCD_Writ_Bus(dat);
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); //拉高片选信号,停止发送数据
}
/*
* 函数内容:LCD写入数据-2字节
* 函数参数:dat 写入的数据
* 返回值:无
*/
void LCD_WR_DATA(uint16_t dat)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_RESET); //拉低片选信号,开始发送数据
LCD_Writ_Bus(dat>>8);
LCD_Writ_Bus(dat);
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); //拉高片选信号,停止发送数据
}
/*
* 函数内容:LCD写入命令
* 函数参数:dat 写入的命令
* 返回值:无
*/
void LCD_WR_REG(uint8_t dat)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_RESET); //拉低片选信号,开始发送数据
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET); //拉低命令信号,开始发送命令
LCD_Writ_Bus(dat);
GPIO_WriteBit(GPIOB, GPIO_Pin_11, Bit_SET); //拉高片选信号,停止发送数据
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET); //拉高命令信号,停止发送命令
}
/*
* 函数内容:设置起始和结束地址
* 函数参数:x1,x2 设置列的起始和结束地址
* y1,y2 设置行的起始和结束地址
* 返回值:无
*/
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t 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);//储存器写
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
- 修改LCD初始化函数,基本上也是调用LCD串行数据发送函数,这里需要修改复位、背光信号的高低电平函数以及延时函数,注意调用延时函数需要包含“debug.h”
lcd初始化函数
C
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET); //拉低复位信号,开始复位
Delay_Ms(100);
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET); //拉高复位信号,复位完成
Delay_Ms(100);
GPIO_WriteBit(GPIOB, GPIO_Pin_10, Bit_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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
- 在头文件中进行声明,注意将厂商案例中相关的宏定义也包含进来。
lcd头文件
C
#ifndef MYLIB_INC_TFTINIT_H_
#define MYLIB_INC_TFTINIT_H_
#include "ch32v20x.h"
#include "stdio.h"
#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
void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(uint8_t dat);//模拟SPI时序
void LCD_WR_DATA8(uint8_t dat);//写入一个字节
void LCD_WR_DATA(uint16_t dat);//写入两个字节
void LCD_WR_REG(uint8_t dat);//写入一个指令
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);//设置坐标函数
void LCD_Init(void);//LCD初始化
#endif /* MYLIB_INC_TFTINIT_H_ */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 移植相关TFT屏幕显示函数
- 在头文件中添加相关的驱动
- TFT屏幕显示函数都是调用相关的LCD发送函数从而实现功能,这里我们将厂商案例代码全部移植过来即可,仅修改延时函数与变量定义。函数过多,这里我就不一一列举出来了,这里以一个填充颜色函数进行举例,剩余函数大家仔细移植。
填充颜色函数
C
/******************************************************************************
函数说明:在指定区域填充颜色
入口数据: xsta,ysta 起始坐标
xend,yend 终止坐标
color 要填充的颜色
返回值: 无
******************************************************************************/
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{
uint16_t i = 0,j = 0;
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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 移植过程中会遇到相关字体库缺失而产生报错,这里直接将厂商案例中的font文件与pic文件复制包含进来,后续依据实际显示内容进行修改即可。
- 移植完成后,将对应的文件进行声明,方便其余文件进行调用,注意加入颜色宏定义,这些在厂商参考代码中都有定义;
tftshow.h
C
#ifndef MYLIB_INC_TFTSHOW_H_
#define MYLIB_INC_TFTSHOW_H_
#include "ch32v20x.h"
#include "stdio.h"
#include "tftinit.h"
//指定区域填充颜色
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color);
//在指定位置画一个点
void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color);
//在指定位置画一条线
void LCD_DrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color);
//在指定位置画一个矩形
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color);
//在指定位置画一个圆
void Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r,uint16_t color);
//显示汉字串
void LCD_ShowChinese(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//显示单个12x12汉字
void LCD_ShowChinese12x12(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//显示单个16x16汉字
void LCD_ShowChinese16x16(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//显示单个24x24汉字
void LCD_ShowChinese24x24(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//显示单个32x32汉字
void LCD_ShowChinese32x32(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//显示一个字符
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,u16 bc,uint8_t sizey,uint8_t mode);
//显示字符串
void LCD_ShowString(uint16_t x,uint16_t y,const uint8_t *p,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);
//求幂
uint32_t mypow(uint8_t m,uint8_t n);
//显示整数变量
void LCD_ShowIntNum(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey);
//显示两位小数变量
void LCD_ShowFloatNum1(uint16_t x,uint16_t y,float num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey);
//显示图片
void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t length,uint16_t width,const uint8_t pic[]);
//画笔颜色
#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 //浅棕蓝色(选择条目的反色)
#endif /* MYLIB_INC_TFTSHOW_H_ */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- 在主函数中进行调用显示,依据厂商代码中的主函数声明进行调用,查看显示效果,注意将长按开关机函数加入进来,否则松手就断电了。
主函数
C
#include "debug.h"
#include "tftinit.h"
#include "tftshow.h"
#include "powerswitch.h"
#include "pic.h"
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
float t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
Init_Power_Con_GPIO();
LCD_Init();//LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
while(1)
{
key_task();
LCD_ShowChinese(0,0,"中景园电子",RED,WHITE,24,0);
LCD_ShowString(24,30,"LCD_W:",RED,WHITE,16,0);
LCD_ShowIntNum(72,30,LCD_W,3,RED,WHITE,16);
LCD_ShowString(24,50,"LCD_H:",RED,WHITE,16,0);
LCD_ShowIntNum(72,50,LCD_H,3,RED,WHITE,16);
LCD_ShowFloatNum1(20,80,t,4,RED,WHITE,16);
t+=0.11;
LCD_ShowPicture(65,80,40,40,gImage_1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
TIP
屏幕正常显示
源码&USB下载工具等软件,均在[gitee资料中](https://gitee.com/chen11232/simple-digital-multimeter)