打印
[其他ST产品]

STM32结合OLED进行屏显应用实例

[复制链接]
236|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、题目要求

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
1、显示自己的学号和姓名;
2、显示AHT20的温度和湿度;
3、上下或左右的滑动显示长字符或者一段歌词或诗词。


使用特权

评论回复
评论
过期的塔头 2023-3-29 11:26 回复TA
———————————————— 版权声明:本文为CSDN博主「Kamisato_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_65868855/article/details/127678549 
沙发
过期的塔头|  楼主 | 2023-3-29 11:26 | 只看该作者
二、了解SPI(串行外设接口)
1、SPI的定义
SPI(Serial Peripheral interface)是串行外围设备接口,SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。

SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2023-3-29 11:27 | 只看该作者
2、SPI的连接方式

使用特权

评论回复
地板
过期的塔头|  楼主 | 2023-3-29 11:27 | 只看该作者
SPI 接口一般使用 4 条线通信:

MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK 时钟信号,由主设备产生。
CS 从设备片选信号,由主设备控制。

使用特权

评论回复
5
过期的塔头|  楼主 | 2023-3-29 11:28 | 只看该作者
3、SPI通信过程


MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。

使用特权

评论回复
6
过期的塔头|  楼主 | 2023-3-29 11:37 | 只看该作者
三、OLED简介
OLED即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

使用特权

评论回复
7
过期的塔头|  楼主 | 2023-3-29 11:38 | 只看该作者
我们使用的是 ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mmx26mm 大小。
3)高分辨率,该模块的分辨率为128x64。
4)多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了)。
5)不需要高压,直接接 3.3V 就可以工作了。

使用特权

评论回复
8
过期的塔头|  楼主 | 2023-3-29 11:39 | 只看该作者

使用特权

评论回复
9
过期的塔头|  楼主 | 2023-3-29 11:40 | 只看该作者
四、汉字点阵编码原理
区位码

点阵字库其实就是按照汉字内码的顺序,把汉字的字模信息存起来。16×16的点阵字库有94区,每个区有94个汉字的字模。这样总的有94×94个汉字。

在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号为01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。
区位码的前两位是它的区号,后两位是它的位号。用区位码就可以唯一地确定一个汉字或符号。

使用特权

评论回复
10
过期的塔头|  楼主 | 2023-3-29 11:41 | 只看该作者
机内码
汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。

汉字区位码的区码和位码的取值均在 1-94 之间,如直接用区位码作为机内码,就会与基本 ASCII 码混淆。为了避免机内码与基本 ASCII 码的冲突,需要避开基本 ASCII 码中的控制码(00H~1FH),还需与基本 ASCII 码中的字符相区别。

使用特权

评论回复
11
过期的塔头|  楼主 | 2023-3-29 12:03 | 只看该作者
因此:先在区码和位码分别加上 20H,在此基础上再加 80H。
(此处“H”表示前两位数字为十六进制数)

经过这些处理,用机内码表示一个汉字需要占两个字节,分别称为高位字节和低位字节,这两位字节的机内码按如下规则表示:
高位字节 = 区码 + 20H + 80H(或区码 + A0H)
低位字节 = 位码 + 20H + 80H(或位码 + AOH)

由于汉字的区码与位码的取值范围的十六进制数均为 01H-5EH(即十进制的 01-94),所以汉字的高位字节与低位字节的取值范围则为 A1H-FEH(即十进制的 161-254)。

使用特权

评论回复
12
过期的塔头|  楼主 | 2023-3-29 12:03 | 只看该作者
例如,汉字“啊”的区位码为 1601,区码和位码分别用十六进制表示即为 1001H,它的机内码的高位字节为 B0H,低位字节为 A1H,机内码就是 B0A1H。

使用特权

评论回复
13
过期的塔头|  楼主 | 2023-3-29 12:03 | 只看该作者
五、应用实例
1、显示学号及姓名
1)文字取模

使用特权

评论回复
14
过期的塔头|  楼主 | 2023-3-29 12:04 | 只看该作者
在文字输入区输入目标文字,并ctrl+enter,得到显示图

使用特权

评论回复
15
过期的塔头|  楼主 | 2023-3-29 12:05 | 只看该作者
点击C51格式,即可生成点阵

使用特权

评论回复
16
过期的塔头|  楼主 | 2023-3-29 12:12 | 只看该作者
2)代码
void TEST_MainPage(void)
{
// GUI_ShowString(28,0,“god”,16,1);//英文姓名
GUI_ShowCHinese(28,20,16,“小羊羊”,1);//中文姓名
GUI_ShowString(4,48,“63333555555”,16,1);//数字详细
delay_ms(1500);
delay_ms(1500);
}

使用特权

评论回复
17
过期的塔头|  楼主 | 2023-3-29 12:12 | 只看该作者
main.c

int main(void)
{       
        delay_init();                           //延时函数初始化          
        OLED_Init();                                 //初始化OLED  
        OLED_Clear(0);             //清屏(全黑)
        while(1)
        {       
                TEST_MainPage();         //界面显示
        }
}

使用特权

评论回复
18
过期的塔头|  楼主 | 2023-3-29 12:19 | 只看该作者
3)效果演示

使用特权

评论回复
19
过期的塔头|  楼主 | 2023-3-29 12:19 | 只看该作者
2、OLED显示AHT20的温度和湿度
1)滚屏设置
水平左右移动

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

使用特权

评论回复
20
过期的塔头|  楼主 | 2023-3-29 12:20 | 只看该作者
垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

846

帖子

0

粉丝