文章目录

  • 一、SPI介绍
    • 1.SPI的定义
    • 2.SPI的连接方式
    • 3.SPI的通讯过程
  • 二、OLED介绍
  • 三、显示自己的学号和姓名
    • 3.1 文字取模
    • 3.2 编写代码
    • 3.3 实验结果
  • 四、显示AHT20的温度和湿度
    • 4.1 编写代码
    • 4.2 实验结果
    • 五、上下或左右的滑动显示长字符
    • 5.1 滚屏设置
    • 5.2 编写代码
    • 5.3 实验结果
  • 六、总结
  • 七、参考资料

一、SPI介绍

1.SPI的定义

SPI(Serial Peripheral Interface)就是串行外围设备接口。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。

2.SPI的连接方式


SS( Slave Select):从设备选择信号线,常称为片选信号线。
SCK (Serial Clock):时钟信号线,用于通讯数据同步。
MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。

3.SPI的通讯过程


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

二、OLED介绍

OLED即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
我使用的是 ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mmx26mm 大小。
3)高分辨率,该模块的分辨率为128x64。
4)多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了)。
5)不需要高压,直接接 3.3V 就可以工作了。
注意该模块不和 5.0V 接口兼容,所以在使用的时候一定要小心,勿直接接到 5V 的系统上去,否则可能烧坏模块。

三、显示自己的学号和姓名

理论介绍:
点阵汉字的字模读取与显示

3.1 文字取模

软件初始设置:

在文字输入区输入目标文字,并ctrl+enter,得到显示图:

点击C51格式,即可生成点阵:

3.2 编写代码

内容显示 TEST_MainPage函数->test.c文件:

void TEST_MainPage(void)
{
//  GUI_ShowString(28,0,"abc",16,1);//英文姓名GUI_ShowCHinese(28,20,16,"郭新宇",1);//中文姓名GUI_ShowString(4,48,"632007030611",16,1);//数字详细delay_ms(1500);        delay_ms(1500);
}

文字存储(举例)->oledfont.h文件:

const typFNT_GB16 cfont16[] =
{"系",0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00,/*"系",0*/"统",0x10,0x40,0x10,0x20,0x20,0x20,0x23,0xFE,0x48,0x40,0xF8,0x88,0x11,0x04,0x23,0xFE,0x40,0x92,0xF8,0x90,0x40,0x90,0x00,0x90,0x19,0x12,0xE1,0x12,0x42,0x0E,0x04,0x00,/*"统",1*/"设",0x00,0x00,0x21,0xF0,0x11,0x10,0x11,0x10,0x01,0x10,0x02,0x0E,0xF4,0x00,0x13,0xF8,0x11,0x08,0x11,0x10,0x10,0x90,0x14,0xA0,0x18,0x40,0x10,0xA0,0x03,0x18,0x0C,0x06,/*"设",2*/"置",0x7F,0xFC,0x44,0x44,0x7F,0xFC,0x01,0x00,0x7F,0xFC,0x01,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0xFF,0xFE,0x00,0x00,/*"置",3*/
};

主函数->main.c文件:

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

3.3 实验结果

四、显示AHT20的温度和湿度

4.1 编写代码

温湿度显示read_AHT20函数->bsp_i2c.c文件

void read_AHT20(void)
{uint8_t   i;for(i=0; i<6; i++){readByte[i]=0;}//-------------I2C_Start();I2C_WriteByte(0x71);ack_status = Receive_ACK();readByte[0]= I2C_ReadByte();Send_ACK();readByte[1]= I2C_ReadByte();Send_ACK();readByte[2]= I2C_ReadByte();Send_ACK();readByte[3]= I2C_ReadByte();Send_ACK();readByte[4]= I2C_ReadByte();Send_ACK();readByte[5]= I2C_ReadByte();SendNot_Ack();//Send_ACK();I2C_Stop();//--------------if( (readByte[0] & 0x68) == 0x08 ){H1 = readByte[1];H1 = (H1<<8) | readByte[2];H1 = (H1<<8) | readByte[3];H1 = H1>>4;H1 = (H1*1000)/1024/1024;T1 = readByte[3];T1 = T1 & 0x0000000F;T1 = (T1<<8) | readByte[4];T1 = (T1<<8) | readByte[5];T1 = (T1*2000)/1024/1024 - 500;AHT20_OutData[0] = (H1>>8) & 0x000000FF;AHT20_OutData[1] = H1 & 0x000000FF;AHT20_OutData[2] = (T1>>8) & 0x000000FF;AHT20_OutData[3] = T1 & 0x000000FF;}else{AHT20_OutData[0] = 0xFF;AHT20_OutData[1] = 0xFF;AHT20_OutData[2] = 0xFF;AHT20_OutData[3] = 0xFF;printf("lyy");}/*通过串口显示采集得到的温湿度printf("\r\n");printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);printf("\r\n");*/t=T1/10;t1=T1%10;a=(float)(t+t1*0.1);h=H1/10;h1=H1%10;b=(float)(h+h1*0.1);sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  sprintf(strHumi,"%.1f",b);    //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  GUI_ShowCHinese(16,00,16,"温湿度显示",1);GUI_ShowCHinese(16,20,16,"温度",1);GUI_ShowString(53,20,strTemp,16,1);GUI_ShowCHinese(16,38,16,"湿度",1);GUI_ShowString(53,38,strHumi,16,1);delay_ms(1500);     delay_ms(1500);
}

点阵显示文字

"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/

主函数main.c文件

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"#include "oled.h"
#include "gui.h"
#include "test.h"int main(void)
{   delay_init();                  //延时函数初始化          uart_init(115200);     IIC_Init();NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级     OLED_Init();                     //初始化OLED  OLED_Clear(0); while(1){//printf("温度湿度显示");read_AHT20_once();OLED_Clear(0); delay_ms(1500);}
}

4.2 实验结果

显示AHT20的温度和湿度

五、上下或左右的滑动显示长字符

5.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);        //开启滚动

垂直和水平滚动

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);        //开启滚动

在发送开始滚屏前要先传输好显示数据,如果在滚屏的时候传输显示数据RAM中的内容可能被损坏,无法正常显示。

5.2 编写代码

在添加文字字模代码->oledfont.h文件
OLED显示函数test.c

void TEST_MainPage(void)
{   GUI_ShowCHinese(10,20,16,"夜空中最亮的星",1);delay_ms(1500);       delay_ms(1500);
}

主函数main.c文件

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{   delay_init();                  //延时函数初始化      NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级     OLED_Init();                     //初始化OLED  OLED_Clear(0);             //清屏(全黑)OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节TEST_MainPage();OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
}

5.3 实验结果

滑动显示长字符

六、总结

通过本次实验完成了基于OLED显示文字的实验。OLED是一个很有意思的外设,在之后完成更多硬件项目时,可以利用OLED进行调试显示,帮助会很大。

七、参考资料

【嵌入式16】STM32+OLED屏显应用实例
【问题解决】Keil报错:error: #8: missing closing quote

STM32+OLED屏显应用实例相关推荐

  1. 【STM32+OLED屏显应用实例】

    一,相关技术 .1.1关于SPI协议 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface) ,即串行外围设 备接口,是一种高速全双工的通信总线.它被广 ...

  2. 使用STM32实现OLED屏显

    目录 一.SPI协议的介绍 1.概述 2.特点 3.通信原理 4.通讯过程 二.OLED的介绍 1.概述 2.优点及实物图 (1)功耗低 (2)响应速度快 (3)较宽的视角 (4)能实现高分辨率显示 ...

  3. 基于STM32的OLED屏显实例

    文章标题 一.SPI协议 1.什么是SPI 2.SPI物理层 3.SPI协议层 4.SPI特点 5.通讯引脚 二.OLED屏显原理 1.简介 2.OLED屏显原理 三.OLED屏显实例 1.显示自己的 ...

  4. 基于SPI协议OLED屏显实例

    目录 一.SPI协议 1.1 SPI简介 1.2 SPI四线 1.3 SPI四种工作模式 1.4 SPI时序图 二.项目实现 2.1 实验准备 2.2 字模提取 2.3 程序代码 2.4 硬件连接 2 ...

  5. 【嵌入式系统开发16】基于OLED屏显和汉字点阵编码原理显示姓名学号,湿度温度,滚动长字符

    要求 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名: 显示AHT20的温度和湿度: 上下或左右的滑动显示长字符,比如"H ...

  6. OLED屏显+汉字点阵

    stm32采用SPI实现OLED屏显 简介 OLED屏显例子 一.准备工作 二.显示学号和姓名 三.滑动显示 四.显示温湿度 总结+参考 简介 SPI SPI是串行外设接口(Serial Periph ...

  7. OLED屏显+实践操作

    目录 一.题目要求 二.SPI介绍 2.1 SPI简介 2.2 SPI特点 三.OLED介绍 3.1 OLED概述 3.2 OLED模块描述 3.2 OLED模块原理图 四.STM32+OLED显示个 ...

  8. OLED屏显传感器数据显示到OLED上

    前言 目录 一.SPI介绍 Ⅰ.什么是SPI Ⅱ.SPI接口介绍 Ⅲ.数据传输 Ⅳ.工作模式 Ⅴ.优缺点 二.OLED屏显字模提取 Ⅰ.OLED定义 Ⅱ.OLED模块介绍 Ⅲ .获取资料途径 三.字模 ...

  9. OLED屏显实现字体显示

    目录 1.什么是SPI ①.SPI协议概括 2.任务 3.从官网获取参考资料 4.获取字模 5.显示自己的学号和姓名 ①.找到项目 ②.修改代码 修改 test.c 下的 TEST_MainPage ...

最新文章

  1. 006 Spark中的wordcount以及TopK的程序编写
  2. 使用Pygame制作微信打飞机游戏PC版
  3. python编程有哪些-Python编程编译器有哪些比较好用
  4. php7下安装event扩展
  5. 2019年python就业前景_2019年Python数据挖掘就业前景前瞻
  6. CSS实现自适应不同大小屏幕的背景大图
  7. 徐阿衡 | 知识抽取-实体及关系抽取(一)
  8. java中random方法取值范围_Java中的Random()函数
  9. 遥远的救世主:电视剧《天道》
  10. HDU-一个人的旅行(最短路)
  11. spring5源码-ioc容器
  12. 如何在Windows即服务上安装Memcached Server
  13. 计算机excel中钱的符号,在excel中输入钱的符号 excel货币符号
  14. 格式化的硬盘能恢复吗 硬盘格式化以后能恢复吗
  15. 【2021-07-23】JS逆向之雷速体育canvas渲染数据解密
  16. 浅学 --------- CSS
  17. 从小米人事变动谈引入人才与自主培养人才哪个更重要
  18. 【装Linux系统时卡在logo处】禁用独显驱动
  19. python装饰器带参数函数二阶导数公式_SICP Python 描述 1.6 高阶函数
  20. C语言:零幺串(N0为最大连续零串的个数,N1为最大一串的个数)

热门文章

  1. Java桌面程序开发——如何开发美观漂亮好看的桌面程序
  2. 淘宝购物车图标的制作使用
  3. 父母该如何协助孩子安全上网?
  4. android系统之apn相关
  5. 【烙铁使用规范】—— 烙铁头使用及保养
  6. java安装及运行环境配置
  7. 推荐一款网络收音机,学英文很棒哟
  8. 透析Spring2---第三章试读
  9. 增量式PID到底是什么?
  10. Zxing_使用说明