完成显示部分

master
高宏宇 10 months ago
parent 41c1089d4b
commit 568fb609a4

@ -309,7 +309,7 @@ main函数的 USER CODE BEGIN 2 区域添加内容
HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive 的地址都使用0x70HAL_I2C_Master_Transmit会自动设置最后一位是0仍然是0x70HAL_I2C_Master_Receive会自动设置最后一位是1就是0x71
### 温湿度数据的重组
### 2.3.2. 温湿度数据的重组
按照AHT20的说明p8返回六个字节的顺序
@ -317,4 +317,88 @@ HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive 的地址都使用0x70HAL_I2
![image-20241015162613515](./img/image-20241015162613515.png)
![alt text](img/aht20_data.drawio.png)
![alt text](img/aht20_data.drawio.png)
## 2.4. I2C的中断和DMA
[中断模式和DMA](https://www.bilibili.com/video/BV1AN41127VL?spm_id_from=333.788.videopod.sections&vd_source=3c8e333d6657680a469ddf0238f01d6a)
# 3. OLED显示
[视频演示](https://www.bilibili.com/video/BV19u4y197df?spm_id_from=333.788.videopod.sections&vd_source=3c8e333d6657680a469ddf0238f01d6a)
开发板上的OLED显示器是单色的显示分辨率为 128 * 64。
![image-20241021082624862](./img/image-20241021082624862.png)
相当于有128 * 64个小灯只需要点亮相应的小灯就可以组成图案。如果使用IO进行操作需要 128 * 64 个IO口8192个显然是不合适的。如何解决
![alt text](img/显示驱动.drawio.png)
其实显示器的矩阵可以看作是一段连续的内存每一个灯就是一个bit单色模式如果是彩色显示器每个灯可能是一个byte或者是多个byte。和内存一样显示器内部也有一个存储区域寄存器和点阵是对应的我们只需要对显示器的控制芯片寄存器的相应位置写入相应的数据显示器对应点就会点亮或者熄灭。这种方式就如同写寄存器一样。
因此显示驱动芯片其实有很多IO与显示器进行连接然后驱动芯片与外部有个通信接口这里是I2C通过接口MCU告诉显示器需要如何显示就好了。这样避免了MCU使用很多IO直接控制显示器。另外这里的通信是I2C但是还有其他的方式例如串口、SPI、VGA、HDMI等。
## 3.1. 显示原理
开发板使用SSD1306作为驱动[显示器资料](../../配套模块资料/OLED显示屏/1.3-ZJY130-2864KSWLG01.pdf)[CH1116芯片资料](<../..//OLED/CH1116 V0.2.pdf>)
![image-20241021083759719](./img/image-20241021083759719.png)
分成了8个Page大行,每个Page中有8个小行一共就是64行刚好是纵向的分辨率然后每行有128个寄存器表示列这样就得到128*64的一组寄存器。这个和内存中的分页技术是一致的。
### 3.1.1. 通信方式
通信分为两种,指令和数据,指令包含两个字节,数据没有限制。指令表示要从哪个位置开始写数据;数据代表写入什么数据。指令包含页的设置和列的设置两个部分。
每个指令都包含两个字节第一个字节0x00第二个字节表示页/列的设置。指令选择页和选择列但后续只有一个字节了这个后续的一个字节需要携带页还是列具体是哪个页和列因此第二字节可以拆分成为高4位和低4位进行表示其中高4位表示是什么页、列低4位表示具体的参数哪个页、哪个列
#### 3.1.1.1. 指令
![image-20241021090542877](./img/image-20241021090542877.png)
1. 页地址B0~B7其实这里的B就代表设置页地4位的07表示哪个页一共只有8页
2. 列地址把列分为两个字节发送分为高4位和低四位。低位先发高位后发有点像小端模式高4为分别为0和1表示表示列的低4位和高4位因为一共128列因此设置列需要发送两次指令
例如选择页使用Bx的方式高4位B表示设置页的命令低四位X可以是07表示具体是哪一页。这样一个完整的设置页的命令就是0x00,0xb0选择第0页0x00,0xb1选择第1页因为一共只有8页4位的取值范围是015完全覆盖8页的取值范围这样是没有问题的。但是如果选择列列的取值是0127这样使用一条命令是不够的。
在设置列的时候参数字节的高4位是0表示设置列的低四位参数字节的高四位是1表示设置列的高四位00-00设置低四位00-10设置高四位这样列就是00列。注意驱动的第0页其实是从02开始的因此需要发送0x0002,0x0010来选择第0列。
#### 3.1.1.2. 数据
![image-20241021090849503](./img/image-20241021090849503.png)
数据是 0x40 后携带N个字节表示从指令设置的页和列开始连续的设置相应的列。
## 3.2. 显示驱动
在内存中建立一个数组(存储空间)与显存的空间进行对应。当要画图的时候,先在内存中写数据,然后把内存中的数据全部写入到显示器(显存)。这样做有很多好处方便,操作内存比操作显存更方便。但是这样做也有缺陷:
问题:什么缺陷?
OLED_NewFrame 函数用于把内存中一个虚拟屏幕清空这样很快。OLED_ShowFram用于将内存中的一个虚拟屏幕的内容发送到显示器的显存当中这样就可以显示了。
视频演示有个地方错了,关于画点的函数(仔细看看)。
### 3.2.1. 如何显示文字和图片
![image-20241021091927109](./img/image-20241021091927109.png)
显示器和图片都是以点来存放图片或者文字的。如果把上面的文字转换成点阵就可以在点阵的显示器上显示了。如何做到?
任何文字或者图片都可以使用点阵进行描述:
![image-20241021091942446](./img/image-20241021091942446.png)
### 3.2.2. 如何快速的进行显示
1. 抽象基本的功能:画点,划线、画圆。。。
2. 字库通过ASCII码其实是一个整数对应到一个数组点阵然后使用画点的方式画出文字。英文处理相对简单中文处理需要更大的存储空间。
[取模工具](https://led.baud-dance.com/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Loading…
Cancel
Save