一、模块来源
采购链接: 1.3寸ips 240X240TFT显示屏液晶st7789 ips显示屏带字库高清ips
资料下载链接: https://pan.baidu.com/s/18tt2PzcnTvqTRubdRy2yoQ
资料提取码:8888
二、规格参数
工作电压:2.4V-3.3V
工作电流:40MA
模块尺寸:27.78(H) x 39.22(V) MM
像素大小:240(H) x 240(V)RGB
驱动芯片:ST7789V2
通信协议:SPI
以上信息见厂家资料文件
三、移植过程
我们的目标是将例程移植至开发板上。按照以下步骤,即可完成移植。
- 将源码导入工程;
- 根据编译报错处进行粗改;
- 修改引脚配置;
- 修改时序配置;
- 移植验证。
1、查看资料
打开厂家资料例程(例程下载见百度网盘链接下载)。具体路径见例程路径
2、移植至工程
将厂家资料路径下的【LCD】文件夹,复制到自己的工程中。(工程可以参考工程模板)
我们导入工程,将我们刚刚复制到文件夹中的文件,导入C文件和路径。
将lcd_init.h文件下的 sys.h 改为 tjx_init.h。还要将lcd.h文件下的 sys.h 改为 tjx_init.h
将 lcd_init.c 和 lcd.c 中的 delay.h 注释掉
3、引脚选择
该屏幕需要设置10个接口。
模块为SPI通信协议的从机,SCL为SPI信号线(SCK),SDA为SPI输出线(MOSI),CS为SPI片选线(NSS)。 如果MCU的GPIO引脚不足,可以将屏幕的两个引脚接口不接入MCU的GPIO。
- 将RES接入MCU的复位引脚,当MCU复位时,屏幕也跟着复位;
- 可以将BLK接入3.3V或悬空,代价是无法控制背光亮度。
硬件SPI移植
GND | GND |
VCC | 3.3V |
SCL | GPIO52 |
SDA | GPIO50 |
RES | GPIO48 |
DC | GPIO30 |
CS1 | GPIO53 |
BLK | GPIO14 |
FSO | GPIO51 |
CS2 | GPIO55 |
接下来我们配置 SYSCONFIG
- 双击 c2000.syscfg 文件,打开它。
- 点击 ADD 添加GPIO配置
- 添加配置【根据下方图片进行添加】
5根引脚一样的配置,除了名字不一样
- 点击ADD添加SPI配置
- 配置SPI
Ctrl + S
保存配置文件Ctrl + B
构建工一次工程(可能会报错,我们不用管!)然后我们所有设定的引脚和功能就会在 board.h 中定义。因为这个文件我们包含进了 tjx_init.h 所以我们只需要引用 tjx_init.h 即可。【这里的 tjx_init.h 就充当了芯片头文件的作用】
选择好引脚后,进入工程开始编写屏幕引脚初始化代码。
我们更改lcd_init.h
中的LCD端口定义
//-----------------LCD端口定义----------------
#define LCD_RES_Clr() GPIO_writePin(LCD_RES,0)//RES
#define LCD_RES_Set() GPIO_writePin(LCD_RES,1)
#define LCD_DC_Clr() GPIO_writePin(LCD_DC,0)//DC
#define LCD_DC_Set() GPIO_writePin(LCD_DC,1)
#define LCD_CS_Clr() GPIO_writePin(LCD_CS1,0)//CS1
#define LCD_CS_Set() GPIO_writePin(LCD_CS1,1)
#define LCD_BLK_Clr() GPIO_writePin(LCD_BLK,0)//BLK
#define LCD_BLK_Set() GPIO_writePin(LCD_BLK,1)
#define ZK_CS_Clr() GPIO_writePin(LCD_CS2,0)//CS2
#define ZK_CS_Set() GPIO_writePin(LCD_CS2,1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
引脚初始化函数见如下代码。因为引脚已经在 SYSCONFIG 中自动配置了,不需要进行初始化了。
void LCD_GPIO_Init(void)
{
}
2
3
4
将 lcd_init.c
中的 LCD_Writ_Bus
函数替换成下面的代码:
/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
LCD_CS_Clr();
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, dat<<8);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
LCD_CS_Set();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
打开 lcd.c
文件将 LCD_ShowChinese
函数中的 s+=2
改为 s+=3
:
打开 lcdfont.c
文件将 typFNT_GB12
、typFNT_GB16
、typFNT_GB24
、typFNT_GB32
、 结构体中的 Index[2]
改为 Index[3]
例如:
打开 zk.c文件
将 ZK_command函数
和 get_data_from_ROM函数
修改为下面代码:
/******************************************************************************
函数说明:向字库写入命令
入口数据:dat 要写入的命令
返回值: 无
******************************************************************************/
void ZK_command(u8 dat)
{
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, dat<<8);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
}
/******************************************************************************
函数说明:从字库读取数据
入口数据:无
返回值: ret_data 读取的数据
******************************************************************************/
u8 get_data_from_ROM(void)
{
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, 0xFF);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
return data;
}
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
到这里就移植完成了,可移步进行移植验证。
四、关键代码
lcd_init.c
#include "lcd_init.h"
// #include "delay.h"
void LCD_GPIO_Init(void)
{
}
/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
LCD_CS_Clr();
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, dat<<8);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
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);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+80);
LCD_WR_DATA(y2+80);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+80);
LCD_WR_DATA(x2+80);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
}
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_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
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
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);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x37);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x12);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0x4C);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x44);
LCD_WR_DATA8(0x51);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0x21);
LCD_WR_REG(0x29);
}
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
lcd_init.h
#ifndef __LCD_INIT_H
#define __LCD_INIT_H
#include "tjx_init.h"
#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#define LCD_W 240
#define LCD_H 240
//-----------------LCD端口定义----------------
#define LCD_RES_Clr() GPIO_writePin(LCD_RES,0)//RES
#define LCD_RES_Set() GPIO_writePin(LCD_RES,1)
#define LCD_DC_Clr() GPIO_writePin(LCD_DC,0)//DC
#define LCD_DC_Set() GPIO_writePin(LCD_DC,1)
#define LCD_CS_Clr() GPIO_writePin(LCD_CS1,0)//CS1
#define LCD_CS_Set() GPIO_writePin(LCD_CS1,1)
#define LCD_BLK_Clr() GPIO_writePin(LCD_BLK,0)//BLK
#define LCD_BLK_Set() GPIO_writePin(LCD_BLK,1)
#define ZK_CS_Clr() GPIO_writePin(LCD_CS2,0)//CS2
#define ZK_CS_Set() GPIO_writePin(LCD_CS2,1)
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初始化
#endif
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
lcd.h
#ifndef __LCD_H
#define __LCD_H
#include "tjx_init.h"
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[]);//显示图片
//字库函数
void ZK_command(u8 dat);
u8 get_data_from_ROM(void);
void get_n_bytes_data_from_ROM(u8 AddrHigh,u8 AddrMid,u8 AddrLow,u8 *pBuff,u8 DataLen);
void Display_GB2312(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc);
void Display_GB2312_String(u16 x,u16 y,u8 zk_num,u8 text[],u16 fc,u16 bc);
void Display_Asc(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc);
void Display_Asc_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc);
void Display_Arial_TimesNewRoman(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc);
void Display_Arial_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc);
void Display_TimesNewRoman_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc);
//画笔颜色
#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
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
zk.c
#include "lcd_init.h"
#include "lcd.h"
u8 FontBuf[130];//字库缓存
/******************************************************************************
函数说明:向字库写入命令
入口数据:dat 要写入的命令
返回值: 无
******************************************************************************/
void ZK_command(u8 dat)
{
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, dat<<8);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
}
/******************************************************************************
函数说明:从字库读取数据
入口数据:无
返回值: ret_data 读取的数据
******************************************************************************/
u8 get_data_from_ROM(void)
{
uint8_t data = 0;
// Transmit data
SPI_writeDataNonBlocking(SCREEN_SPI_BASE, 0xFF);
// Block until data is received and then return it
data = SPI_readDataBlockingNonFIFO(SCREEN_SPI_BASE);
return data;
}
/******************************************************************************
函数说明:读取N个数据
入口数据:AddrHigh 写地址高字节
AddrMid 写地址中字节
AddrLow 写地址低字节
*pBuff 读取的数据
DataLen 读取数据的长度
返回值: 无
******************************************************************************/
void get_n_bytes_data_from_ROM(u8 AddrHigh,u8 AddrMid,u8 AddrLow,u8 *pBuff,u8 DataLen)
{
u8 i;
ZK_CS_Clr(); //字库片选
ZK_command(0x03);//写指令
ZK_command(AddrHigh);//写地址高字节
ZK_command(AddrMid);//写地址中字节
ZK_command(AddrLow);//写地址低字节
for(i=0;i<DataLen;i++)
{
*(pBuff+i) =get_data_from_ROM();//读一个字节数据
}
ZK_CS_Set();//取消字库片选
}
/******************************************************************************
函数说明:显示汉字
入口数据:x,y 写入的坐标
zk_num 1:12*12, 2:15*16, 3:24*24, 4:32*32
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_GB2312(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc)
{
u8 i,k,n,d,m=0;
switch(zk_num)
{
// n:字符所占字节数 d:字间距
case 12 : n=24; d=12; break; // 12*12
case 16 : n=32; d=16; break; // 15*16
case 24 : n=72; d=24; break; // 24*24
case 32 : n=128; d=32; break; // 32*32
}
LCD_Address_Set(x,y,x+d-1,y+d-1);
for(i=0;i<n;i++)
{
for(k=0;k<8;k++)
{
if((FontBuf[i]&(0x80>>k)))
{
LCD_WR_DATA(fc);
}
else
{
LCD_WR_DATA(bc);
}
m++;
if(m%zk_num==0)
{
m=0;
break;
}
}
}
}
/******************************************************************************
函数说明:显示汉字
入口数据:zk_num 1:12*12, 2:15*16, 3:24*24, 4:32*32
x,y 坐标
text[] 要显示的汉字
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_GB2312_String(u16 x,u16 y,u8 zk_num,u8 text[],u16 fc,u16 bc)
{
u8 i= 0;
u8 AddrHigh,AddrMid,AddrLow ; //字高、中、低地址
u32 FontAddr=0; //字地址
u32 BaseAdd=0; //字库基地址
u8 n,d;// 不同点阵字库的计算变量
switch(zk_num)
{
// n:字符所占字节数 d:字间距
case 12 : BaseAdd=0x00; n=24; d=12; break; // 12*12
case 16 : BaseAdd=0x2C9D0; n=32; d=16; break; // 15*16
case 24 : BaseAdd=0x68190; n=72; d=24; break; // 24*24
case 32 : BaseAdd=0xEDF00; n=128; d=32; break; // 32*32
}
while((text[i]>0x00))
{
if(((text[i]>=0xA1)&&(text[i]<=0xA9))&&(text[i+1]>=0xA1))
{
//国标简体(GB2312)汉字在 字库IC中的地址由以下公式来计算://
//Address = ((MSB - 0xA1) * 94 + (LSB - 0xA1))*n+ BaseAdd; 分三部取地址///
FontAddr = (text[i]- 0xA1)*94;
FontAddr += (text[i+1]-0xA1);
FontAddr = (unsigned long)((FontAddr*n)+BaseAdd);
AddrHigh = (FontAddr&0xff0000)>>16; //地址的高8位,共24位//
AddrMid = (FontAddr&0xff00)>>8; //地址的中8位,共24位//
AddrLow = FontAddr&0xff; //地址的低8位,共24位//
get_n_bytes_data_from_ROM(AddrHigh,AddrMid,AddrLow,FontBuf,n );//取一个汉字的数据,存到"FontBuf[]"
Display_GB2312(x,y,zk_num,fc,bc);//显示一个汉字到LCD上/
}
else if(((text[i]>=0xB0) &&(text[i]<=0xF7))&&(text[i+1]>=0xA1))
{
//国标简体(GB2312) 字库IC中的地址由以下公式来计算://
//Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+846)*n+ BaseAdd; 分三部取地址//
FontAddr = (text[i]- 0xB0)*94;
FontAddr += (text[i+1]-0xA1)+846;
FontAddr = (unsigned long)((FontAddr*n)+BaseAdd);
AddrHigh = (FontAddr&0xff0000)>>16; //地址的高8位,共24位//
AddrMid = (FontAddr&0xff00)>>8; //地址的中8位,共24位//
AddrLow = FontAddr&0xff; //地址的低8位,共24位//
get_n_bytes_data_from_ROM(AddrHigh,AddrMid,AddrLow,FontBuf,n );//取一个汉字的数据,存到"FontBuf[ ]"
Display_GB2312(x,y,zk_num,fc,bc);//显示一个汉字到LCD上/
}
x+=d; //下一个字坐标
i+=2; //下个字符
}
}
/******************************************************************************
函数说明:显示ASCII码
入口数据:x,y 写入的坐标
zk_num 1:5*7 2:7*8 3:6*12, 4:8*16, 5:12*24, 6:16*32
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_Asc(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc)
{
u8 i,k,n,x0,y0,m=0;
switch(zk_num)
{
// n:字符所占字节数 d:字间距
case 7: n=7; x0=5; y0=7; break; // 5x7 ASCII
case 8: n=8; x0=7; y0=8; break; // 7x8 ASCII
case 12: n=12; x0=6; y0=12; break; // 6x12 ASCII
case 16: n=16; x0=8; y0=16; break; // 8x16 ASCII
case 24: n=48; x0=12; y0=24; break; // 12x24 ASCII
case 32: n=64; x0=16; y0=32; break; // 16x32 ASCII
}
LCD_Address_Set(x,y,x+x0-1,y+y0-1);
for(i=0;i<n;i++)
{
for(k=0;k<8;k++)
{
if((FontBuf[i]&(0x80>>k)))
{
LCD_WR_DATA(fc);
}
else
{
LCD_WR_DATA(bc);
}
m++;
if(m%x0==0)
{
m=0;
break;
}
}
}
}
/******************************************************************************
函数说明:显示ASCII码
入口数据:x,y 写入的坐标
zk_num 1:5*7 2:7*8 3:6*12, 4:8*16, 5:12*24, 6:16*32
text[] 要显示的字符串
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_Asc_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc)
{
u8 i= 0;
u8 AddrHigh,AddrMid,AddrLow ; //字高、中、低地址
u32 FontAddr=0; //字地址
u32 BaseAdd=0; //字库基地址
u8 n,d;// 不同点阵字库的计算变量
switch(zk_num)
{
//n个数,d:字间距
case 7: BaseAdd=0x1DDF80; n=8; d=6; break; // 5x7 ASCII
case 8: BaseAdd=0x1DE280; n=8; d=7; break; // 7x8 ASCII
case 12: BaseAdd=0x1DBE00; n=12; d=6; break; // 6x12 ASCII
case 16: BaseAdd=0x1DD780; n=16; d=8; break; // 8x16 ASCII
case 24: BaseAdd=0x1DFF00; n=48; d=12; break; // 12x24 ASCII
case 32: BaseAdd=0x1E5A50; n=64; d=16; break; // 16x32 ASCII
}
while((text[i]>0x00))
{
if((text[i] >= 0x20) &&(text[i] <= 0x7E))
{
FontAddr = text[i]-0x20;
FontAddr = (unsigned long)((FontAddr*n)+BaseAdd);
AddrHigh = (FontAddr&0xff0000)>>16; /*地址的高8位,共24位*/
AddrMid = (FontAddr&0xff00)>>8; /*地址的中8位,共24位*/
AddrLow = FontAddr&0xff; /*地址的低8位,共24位*/
get_n_bytes_data_from_ROM(AddrHigh,AddrMid,AddrLow,FontBuf,n );/*取一个汉字的数据,存到"FontBuf[]"*/
Display_Asc(x,y,zk_num,fc,bc);/*显示一个ascii到LCD上 */
}
i++; //下个数据
x+=d;//下一个字坐标
}
}
/******************************************************************************
函数说明:显示ASCII码(Arial&Times New Roman)
入口数据:x,y 写入的坐标
zk_num 1:8*12, 2:12*16, 3:16*24, 4:24*32
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_Arial_TimesNewRoman(u16 x,u16 y,u8 zk_num,u16 fc,u16 bc)
{
u8 i,k,n,x0,y0,m=0;
switch(zk_num)
{
// n:字符所占字节数 d:字间距
case 12: n=26; x0=10; y0=12; break; // 8x12 ASCII
case 16: n=34; x0=12; y0=16; break; // 12x16 ASCII
case 24: n=74; x0=20; y0=24; break; // 16x24 ASCII
case 32: n=130; x0=25; y0=32; break; // 24x32 ASCII
}
LCD_Address_Set(x,y,x+x0-1,y+y0-1);
for(i=2;i<n;i++)
{
for(k=0;k<8;k++)
{
if((FontBuf[i]&(0x80>>k)))
{
LCD_WR_DATA(fc);
}
else
{
LCD_WR_DATA(bc);
}
m++;
if(m%x0==0)
{
m=0;
break;
}
}
}
}
/******************************************************************************
函数说明:显示ASCII(Arial类型)
入口数据:x,y 写入的坐标
zk_num 1:8*12, 2:12*16, 3:16*24, 4:24*32
text[] 要显示的字符串
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_Arial_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc)
{
u8 i= 0;
u8 AddrHigh,AddrMid,AddrLow ; //字高、中、低地址
u32 FontAddr=0; //字地址
u32 BaseAdd=0; //字库基地址
u8 n,d;// 不同点阵字库的计算变量
switch(zk_num)
{
//n:个数,d:字间距
case 12: BaseAdd=0x1DC400; n=26; d=10; break; // 8x12 ASCII(Arial类型)
case 16: BaseAdd=0x1DE580; n=34; d=12; break; // 12x16 ASCII(Arial类型)
case 24: BaseAdd=0x1E22D0; n=74; d=20; break; // 16x24 ASCII(Arial类型)
case 32: BaseAdd=0x1E99D0; n=130; d=25; break; // 24x32 ASCII(Arial类型)
}
while((text[i]>0x00))
{
if((text[i] >= 0x20) &&(text[i] <= 0x7E))
{
FontAddr = text[i]-0x20;
FontAddr = (unsigned long)((FontAddr*n)+BaseAdd);
AddrHigh = (FontAddr&0xff0000)>>16; /*地址的高8位,共24位*/
AddrMid = (FontAddr&0xff00)>>8; /*地址的中8位,共24位*/
AddrLow = FontAddr&0xff; /*地址的低8位,共24位*/
get_n_bytes_data_from_ROM(AddrHigh,AddrMid,AddrLow,FontBuf,n );/*取一个汉字的数据,存到"FontBuf[]"*/
Display_Arial_TimesNewRoman(x,y,zk_num,fc,bc);/*显示一个ascii到LCD上 */
}
i++; //下个数据
x+=d;//下一个字坐标
}
}
/******************************************************************************
函数说明:显示ASCII(Arial类型)
入口数据:x,y 写入的坐标
zk_num 1:8*12, 2:12*16, 3:16*24, 4:24*32
text[] 要显示的字符串
fc 字体颜色
bc 背景颜色
返回值: 无
******************************************************************************/
void Display_TimesNewRoman_String(u16 x,u16 y,u16 zk_num,u8 text[],u16 fc,u16 bc)
{
u8 i= 0;
u8 AddrHigh,AddrMid,AddrLow ; //字高、中、低地址
u32 FontAddr=0; //字地址
u32 BaseAdd=0; //字库基地址
u8 n,d;// 不同点阵字库的计算变量
switch(zk_num)
{
//n:个数,d:字间距
case 12: BaseAdd=0x1DCDC0; n=26; d=10; break; // 8x12 ASCII(TimesNewRoman类型)
case 16: BaseAdd=0x1DF240; n=34; d=12; break; // 12x16 ASCII(TimesNewRoman类型)
case 24: BaseAdd=0x1E3E90; n=74; d=20; break; // 16x24 ASCII(TimesNewRoman类型)
case 32: BaseAdd=0x1ECA90; n=130; d=25; break; // 24x32 ASCII(TimesNewRoman类型)
}
while((text[i]>0x00))
{
if((text[i] >= 0x20) &&(text[i] <= 0x7E))
{
FontAddr = text[i]-0x20;
FontAddr = (unsigned long)((FontAddr*n)+BaseAdd);
AddrHigh = (FontAddr&0xff0000)>>16; /*地址的高8位,共24位*/
AddrMid = (FontAddr&0xff00)>>8; /*地址的中8位,共24位*/
AddrLow = FontAddr&0xff; /*地址的低8位,共24位*/
get_n_bytes_data_from_ROM(AddrHigh,AddrMid,AddrLow,FontBuf,n );/*取一个汉字的数据,存到"FontBuf[]"*/
Display_Arial_TimesNewRoman(x,y,zk_num,fc,bc);/*显示一个ascii到LCD上 */
}
i++; //下个数据
x+=d;//下一个字坐标
}
}
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
五、移植验证
在 empty_driverlib_main.c
中输入代码如下:
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "c2000ware_libraries.h"
#include "tjx_init.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
void main(void)
{
/* The initialization code automatically generated by CCS [Start] */
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
Board_init();
C2000Ware_libraries_init();
EINT;
ERTM;
/* The initialization code automatically generated by CCS [End] */
lc_printf("\r\n= = = = = = = = = = = = = = = = = = = = = = = = =\r\n");
lc_printf("\r\n=== Welcome to use the LC-TJX-TMS320F28P550 ====\r\n");
lc_printf("\r\n============== www.lckfb.com ===================\r\n");
lc_printf("\r\n============== wiki.lckfb.com ==================\r\n");
lc_printf("\r\n= = = = = = = = = = = = = = = = = = = = = = = = =\r\n");
u8 i,j;
float t = 0;
LCD_Init();//LCD初始化
LCD_Fill(0, 0, LCD_W, LCD_H, WHITE);
while(1)
{
LCD_ShowChinese(0,0,"中景园电子",RED,WHITE,32,0);
LCD_ShowString(0,40,"LCD_W:",RED,WHITE,16,0);
LCD_ShowIntNum(48,40,LCD_W,3,RED,WHITE,16);
LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
LCD_ShowIntNum(128,40,LCD_H,3,RED,WHITE,16);
LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
LCD_ShowString(0,70,"Increaseing Nun:",RED,WHITE,16,0);
LCD_ShowFloatNum1(128,70,t,4,RED,WHITE,16);
t += 0.11;
for(j = 0; j < 3; j++)
{
for(i=0;i<6;i++)
{
LCD_ShowPicture(40*i,120+j*40,40,40,gImage_1);
}
}
delay_ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
Display_Asc_String(0,15,7, "ASCII_5x7",RED,WHITE); //ASC 5X7点阵
Display_Asc_String(0,25,8, "ASCII_7x8",RED,WHITE); //ASC 7X8点阵
Display_Asc_String(0,35,12, "ASCII_6x12",RED,WHITE); //ASC 6X12点阵
Display_Asc_String(0,50,16, "ASCII_8x16",RED,WHITE); //ASC 8X16点阵
Display_Asc_String(0,70,24, "ASCII_12x24",RED,WHITE); //ASC 12X24点阵
Display_Asc_String(0,100,32, "ASCII_16x32",RED,WHITE); //ASC 16X32点阵
Display_GB2312_String(0,145,12, "中景园12x12",RED,WHITE); //12x12汉字
Display_GB2312_String(0,160,16, "中景园16x16",RED,WHITE); //15x16汉字
Display_GB2312_String(0,179,24, "中景园24x24",RED,WHITE); //24x24汉字
Display_GB2312_String(0,204,32, "中景园32x3",RED,WHITE); //32x32汉字
delay_ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
Display_TimesNewRoman_String(0,15,12, "ASCII_8x12",RED,WHITE); //ASC 8x12点阵(TimesNewRoman类型)
Display_TimesNewRoman_String(0,30,16, "ASCII_12x16",RED,WHITE); //ASC 12x16点阵(TimesNewRoman类型)
Display_TimesNewRoman_String(0,50,24, "ASCII_16x24",RED,WHITE); //ASC 16x24点阵(TimesNewRoman类型)
Display_TimesNewRoman_String(0,80,32, "ASCII_24x",RED,WHITE); //ASC 24x32点阵(TimesNewRoman类型)
Display_Arial_String(0,120,12, "ASCII_8x12",RED,WHITE); //ASC 8x12点阵(Arial类型)
Display_Arial_String(0,140,16, "ASCII_12x16",RED,WHITE); //ASC 12x16点阵(Arial类型)
Display_Arial_String(0,160,24, "ASCII_16x24",RED,WHITE); //ASC 16x24点阵(Arial类型)
Display_Arial_String(0,190,32, "ASCII_24x",RED,WHITE); //ASC 24x32点阵(Arial类型)
delay_ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
}
}
__interrupt void INT_Debug_Serial_RX_ISR(void)
{
//清除接收中断标志位
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);
//清除中断标志位
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}
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
然后编译,调试烧录。
不知道如何操作的可以去看CCS的入门手册
上电效果:
【代码下载】
- 跳转到
下载中心
去下载CCS模块移植代码:【点击跳转🚀】