first commit

This commit is contained in:
2024-09-05 13:29:00 +08:00
commit 53515a5a50
75 changed files with 3863 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -0,0 +1,405 @@
<img src="222.png" alt="cover" style="zoom: 150%;" />
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 负责实验代码的解读,分析了代码的整体思想与运行流程,设计了最后的展示成果。 |
| 李桦炅 | 21281282 | 协助进行实验代码解读分析了LCD屏幕显示图像的代码格式。 |
| 王子励 | 21281292 | 撰写实验报告,与小组成员积极沟通,记录实验进程。 |
| 李志民 | 20281146 | 参与报告撰写,记录实验当中遇到的问题并总结。 |
# 实验一 LCD控制实验
## 1. 实验目的
简易的GUI的相关函数的使用LCD的点阵的原理和应用。通过LCD的控制实验学会利用LCD显示数字、英文和中文并在后续实验中使用LCD显示从传感节点得到的部分数据。
## 2. 工具/原料
- 装有IAR的PC机一台
- 2530仿真器,USB线(A型转B型)
- 无线节点模块,带LCD的智能主板。
## 3. 预备知识
1. 在S012864FPD-14ASBE(3S)点阵图形液晶模块(ST7565P)驱动程序的基础上学习一个简易的GUI(图形用户接口),如画点,线,矩形,矩形填充,显示一幅128*64的图画以及汉字显示等。其中IO分配为
| SCL | SID | A0 | CSn | RESETn |
| ---- | ---- | ---- | ---- | ------ |
| P1.5 | P1.6 | P1.7 | P1.4 | P2.0 |
2. 128\*64点阵型LCD简介
128\*64是一种图形点阵液晶显示器它主要由行驱动器/列驱动器及128\*64全点阵液晶显示器组成。可完成图形显示,也可以显示8\*4个(16\*16点阵)汉字。所谓128\*64全点阵就是有128\*64个点组成当给相应的点通高电平(即1)时点变亮,通低电平(即0)时点不亮。显示汉字也是一样的道理通过对16\*16点阵的设计得到对应汉字。
3. 该实验程序主要分为3部分第一部分为LCM的几个函数主要实现的是对LCD显示的初始化对于硬件编程很重要有兴趣的同学可以了解下这里不作为重点。第二部分为GUI的一系列函数是本次实验的重点主要实现画点、线、矩形、矩形填充显示字等显示功能。前两部分程序都在LCD.c程序中。第三部分是GUIDemo.c主要包含主函数和一些点阵显示内容的定义以及change清屏函数。
## 4. 核心代码
### 4.1. GUI_Init()
在该函数中,首先调用了`LCM_Init()`
1. 设置IO需要的引脚的方向为输出
2. 设置`P2_0`为低电平等待一会儿后再置为高电平这里猜测是在操作LED指示灯
3. 向开发板发送命令开启LCD显示
4. 向开发板发送命令,设置其他参数
然后调用`GUI_ClearScreen()`向缓冲区全写0最后调用`LCM_Refresh()`输出缓冲区内容。
(限于篇幅,这里不贴源代码)
### 4.2. GUI_SetColor()
```c
void GUI_SetColor(UINT8 color1, UINT8 color2)
{
GUI_CopyColor(&disp_color, color1); // 设置显示色
GUI_CopyColor(&back_color, color2); // 设置背景色
}
```
实现了显示色和背景色的设置。
### 4.3. GUI_LoadBitmap()
此函数和`GUI_PutHZ()`的实现是一样的。
```c
void GUI_LoadBitmap(UINT8 x, UINT8 y, UINT8 *dat, UINT8 hno, UINT8 lno)
{
UINT8 i;
for(i=0; i<lno; i++)
{
GUI_LoadLine(x, y, dat, hno); // 输出一行数据
y++; // 显示下一行
dat += (hno>>3); // 计算下一行的数据
if( (hno&0x07)!=0 ) dat++;
}
}
```
这个函数实现了循环调用`GUI_LoadLine()`显示`dat`图像中的每一行。
跟踪`GUI_LoadLine()`
```c
UINT8 GUI_LoadLine(UINT8 x, UINT8 y, UINT8 *dat, UINT8 no)
{
UINT8 bit_dat;
UINT8 i;
UINT8 bakc;
/* 参数过滤 */
/*===========================================================================*/
if(x>=128) return(0); // x坐标越界返回0
if(y>=64) return(0); // y坐标越界返回0
/*===========================================================================*/
for(i=0; i<no; i++)
{
/* 判断是否要读取点阵数据 */
if( (i%8)==0 ) bit_dat = *dat++;
/* 设置相应的点为color或为back_color */
if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 ) GUI_CopyColor(&bakc, back_color);
else GUI_CopyColor(&bakc, disp_color);
GUI_Point(x, y, bakc);
if( (++x)>=128 ) return(0);
}
return(1);
}
```
这个函数执行以下逻辑:
1. 判断要显示的内容坐标有没有越过LCD显示屏的边界
2. 如果`(i%8)==0`读取下一个8位
3. 使用位屏蔽码读取当前8位中的每一位如果为0则用背景色打印在LCD上否则用显示色打印在LCD上
4. 判断要显示的内容坐标有没有越过LCD显示屏的边界
5. 跳转回2继续循环直至打印完毕。
跟踪`GUI_Point()`
```c
UINT8 GUI_Point(UINT8 x, UINT8 y, UINT8 color)
{
UINT8 bak;
if(x>=128) return(0); if(y>=64) return(0); // 参数判断出错返回0
//x=x+4;
/* 设置指定点为1或0 */
/*===========================================================================================*/
bak = ReadByteFromDisplayBuffer(x,y); // 从显示缓冲区读取指定点的1字节数据
if(0==color) // 若让该点灭
{
bak &= (~DEC_HEX_TAB[y&0x07]); // 该点对应的位复位而其他7位不变
}
else // 若让该点亮
{
bak |= DEC_HEX_TAB[y&0x07]; // 该点对应的位置位而其他7位不变
}
WriteByteToDisplayBuffer(x, y, bak); // 向LCM12864指定点对应的显示缓冲区写一字节数据
/*===========================================================================================*/
return(1); // 操作成功返回1
}
```
这个函数执行以下逻辑:
1. 判断要显示的点坐标有没有越过LCD显示屏的边界
2. 读取该点原来的信息;
3. 通过参数color使用与或操作将该点置为亮或灭
4. 将修改后的该点信息写入缓冲区。
### 4.4. GUI_Rectangle()
```c
void GUI_Rectangle(UINT8 x0, UINT8 y0, UINT8 x1, UINT8 y1, UINT8 color)
{
GUI_HLine(x0, y0, x1, color);
GUI_HLine(x0, y1, x1, color);
GUI_RLine(x0, y0, y1, color);
GUI_RLine(x1, y0, y1, color);
}
```
即画出4条边横边用`GUI_HLine()`,竖边用`GUI_RLine()`
跟踪`GUI_HLine()`
```c
void GUI_HLine(UINT8 x0, UINT8 y0, UINT8 x1, UINT8 color)
{
UINT8 bak;
if(x0>x1) {bak = x1;x1 = x0; x0 = bak;} // 对x0、x1大小进行排列以便画图
/* 逐点显示,描出水平线 */
/*==========================*/
do
{
GUI_Point(x0, y0, color);
x0++;
}while(x1>=x0);
/*==========================*/
}
```
实际上就是在循环向缓冲区写入线上的点,`GUI_RLine()`也如此,就不再赘述了。
同理,`GUI_RectangleFill()`就是在画出矩形边框的基础上在中间空白区域用`GUI_HLine()``GUI_RLine()`填充线。
### 4.5. 自主设计的main()函数
```c
void main(void) {
UINT8 i;
GUI_Init(); // GUI初始化
GUI_SetColor(1, 0); // 显示色为亮点,背景色为暗点
while (1) {
GUI_PutHZ(8, 0, (UINT8*)YUANSHEN, 80, 64);
LCM_Refresh(); // 将显示缓冲区中的数据刷新到SO12864FPD-13ASBE(3S)上显示
halWait(200);
GUI_PutHZ(88, 24, (UINT8*)QIDONG, 48, 16);
LCM_Refresh();
change(); // 延时大约2秒后清屏
}
}
```
其中,`YUANSHEN`是一副图像的Bitmap`QIDONG`是三个汉字字符“启动”的Bitmap但实际上这两个变量的实质都是将要显示的内容m*n个像素点中要点亮的设置为1相反则设置为0转换成16进制数存储如下图所示
![p2](p2.png)
<img src="p3.png" alt="p3" style="zoom:40%;" />
代码中使用的两个Bitmap见附录。
## 5. 实验步骤
1. 步骤一给智能主板供电。
2. 步骤二 将一个无线节点模块插入到带LCD智能主板的相应位置。
3. 步骤三 将`CC2350`仿真器的一端通过USB线连接到PC机另一端通过10Pin下载线连接到智能主板的`CC2350`JTAG口。
4. 将智能主板上电源开关拨动开位置,按下仿真器的按钮,仿真器上的指示灯为绿色时,表示连接成功。
5. 仔细分析工程中已有的函数,搞清功能后完成自己的程序,实现显示汉字功能。
6. 通过线上工具将图片或者汉字转换为LCD编码后直接加入代码后在LCD板上完成显示。
## 6. 实验结果
在LCD板上显示自己喜欢的图样并且加入了两幅图像间的显示延迟不再是单一的汉字显示更像是艺术字也属于我们将热爱与实验结合的表现。
<img src="111.jpg" alt="cover" style="zoom:33%;" />
## 7. 实验感想
本次LCD控制实验让我们对LCD的显示原理有了更深入的了解。通过学习GUI相关的函数`GUI_Init()``GUI_SetColor()``GUI_LoadBitmap()`我们理解了LCD的显示是通过逐点控制来实现的。另外需要将要显示的内容先转换为点阵表示的Bitmap然后再逐行扫描输出到LCD上这样的显示流程很有启发意义。
在编写`main()`函数时我们尝试将一副图片和几个汉字字符转换为Bitmap数据并加载显示出来。这个过程让我体会到了将设计转换为代码的乐趣。通过添加必要的延时实现了一个循环显示、切换效果使展示更丰富。
总体来说通过这个实验我们对LCD显示的软硬件原理有了更直观的了解也锻炼了独立设计并实现的能力。这是一次收获颇丰的实验。
## 8. 附录
`YUANSHEN`Bitmap
```c
UINT8 YUANSHEN[] =
{
/*-- 宽x高=80x64 --*/
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, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xf0, 0x00,
0x00, 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xf0, 0x00,
0x00, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0xf8, 0x00,
0x03, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x03, 0xfc, 0x00,
0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0x00,
0x07, 0xf8, 0x00, 0xc0, 0x00, 0x3f, 0x80, 0x07, 0xfe, 0x00,
0x03, 0xf0, 0x01, 0xe0, 0x00, 0x0f, 0x00, 0x01, 0xf8, 0x00,
0x03, 0xf0, 0x01, 0xe0, 0x00, 0x06, 0x40, 0x00, 0xe0, 0x00,
0x01, 0xf3, 0x01, 0xe0, 0xc0, 0x04, 0xe3, 0x80, 0xe0, 0x70,
0x01, 0xf3, 0xe1, 0xc3, 0xf0, 0x05, 0xf3, 0xe0, 0x61, 0xfc,
0x01, 0xf3, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xfe,
0x01, 0xf3, 0xe0, 0x01, 0xf0, 0x0f, 0xfb, 0xf0, 0x60, 0xfc,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0xfb, 0xf0, 0xe0, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x03, 0xf1, 0xf0, 0xf8,
0x01, 0xf3, 0xff, 0xf9, 0xf1, 0xcf, 0x03, 0xf3, 0xf8, 0xf8,
0x01, 0xf3, 0xf7, 0xf1, 0xf1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xf3, 0xf8, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xf1, 0xf0, 0xf8,
0x01, 0xf3, 0xff, 0xff, 0xf1, 0xcf, 0x7b, 0xf0, 0xe0, 0xf8,
0x01, 0xf3, 0xc3, 0xf1, 0xf1, 0xcf, 0x7b, 0xf0, 0x60, 0xf8,
0x03, 0xf3, 0x83, 0xf1, 0xc1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x03, 0xe0, 0x03, 0xf0, 0x01, 0xcf, 0x73, 0xf0, 0x61, 0xf8,
0x03, 0xe0, 0xe3, 0xf1, 0xc1, 0xcf, 0x63, 0xe0, 0x60, 0xf8,
0x03, 0xc7, 0xe3, 0xf3, 0xf9, 0xcf, 0x43, 0xc0, 0xe0, 0x78,
0x07, 0x9f, 0xfb, 0xf7, 0xff, 0xcf, 0x03, 0x81, 0xf0, 0x18,
0x07, 0xbf, 0xfb, 0xf7, 0xff, 0x8f, 0x00, 0x07, 0xfc, 0x00,
0x0f, 0x3f, 0x03, 0xf0, 0x3f, 0x8f, 0x00, 0x1f, 0xff, 0x00,
0x1c, 0x3c, 0x03, 0xf0, 0x0f, 0x0f, 0x00, 0x0f, 0xfe, 0x00,
0x18, 0x0c, 0x03, 0xf0, 0x0e, 0x0f, 0x00, 0x07, 0xfc, 0x00,
0x20, 0x03, 0x83, 0xe0, 0x70, 0x0f, 0x00, 0x03, 0xf8, 0x00,
0x00, 0x00, 0x03, 0xe0, 0x00, 0x0e, 0x00, 0x01, 0xf8, 0x00,
0x00, 0x00, 0x03, 0xc0, 0x00, 0x0c, 0x00, 0x01, 0xf0, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x24, 0x28, 0x11, 0x05, 0x00, 0x08, 0x00, 0x60, 0x00,
0x00, 0x24, 0x20, 0x10, 0x45, 0x00, 0x08, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
```
`QIDONG`Bitmap
```c
UINT8 QIDONG[] =
{
/*-- 宽x高=48x16 --*/
0x01, 0xc0, 0x7f, 0x70, 0x38, 0x00,
0x7f, 0xff, 0x00, 0x70, 0x38, 0x00,
0x70, 0x07, 0x01, 0xff, 0x38, 0x00,
0x70, 0x07, 0x00, 0x77, 0x18, 0x00,
0x7f, 0xff, 0xff, 0xf7, 0x18, 0x00,
0x70, 0x07, 0x38, 0x77, 0x18, 0x00,
0x70, 0x00, 0x38, 0x77, 0x18, 0x00,
0x70, 0x00, 0x3e, 0x67, 0x18, 0x00,
0x7f, 0xfe, 0x77, 0xe7, 0x00, 0x00,
0x7c, 0x06, 0x6f, 0xe7, 0x00, 0x00,
0x6c, 0x06, 0xfb, 0xc7, 0x3c, 0x00,
0xec, 0x06, 0x01, 0xc7, 0x3c, 0x00,
0xef, 0xfe, 0x03, 0xbe, 0x00, 0x00,
0xcc, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
```
图片或文字转Bitmap网站https://www.zhetao.com/fontarray.html

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB