使用OLED屏显示汉字
使用OLED屏显示汉字
- 一、SPI
- 1.什么是SPI
- 2.SPI协议概括
- 3.SPI接口
- 二、使用OLED屏显示
- 1.OLED屏简介
- 2.所需汉字的点阵
- 3.部分代码
- 4.静态显示汉字
- (1)在gui.c中的oledfont.h中填入汉字的点阵
- (2)在test.c中的void TEST_MainPage(void)函数中编写需要显示的汉字/数字
- (3)main.c
- (4)运行结果
- 5.动态显示
- (1)OLED屏的滚屏命令
- (2)部分代码
- (3)运行结果
- 完整代码
- 参考文章
一、SPI
1.什么是SPI
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。
2.SPI协议概括
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
(1)SDI – SerialData In,串行数据输入;
(2)SDO – SerialDataOut,串行数据输出;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制。
其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS03接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS03,输出用于16个外设的选择。
3.SPI接口
SPI(Serial Peripheral Interface–串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线可直接与各个厂家生产的多种标准外围器件相连,包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线NSS。
SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还和数字信号处理器和数字信号解码器之间。
SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。
特点:信号线少,协议简单,相对数据速率高。
(1)MOSI – 主器件数据输出,从器件数据输入
(2)MISO – 主器件数据输入,从器件数据输出
(3)SCLK –时钟信号,由主器件产生,最大为fPCLK/2,从模式频率最大为fCPU/2
(4)NSS – 从器件使能信号,由主器件控制,有的IC会标注为CS(Chip select)
在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。
SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的上升沿上数据改变,同时一位数据被存入移位寄存器。
二、使用OLED屏显示
1.OLED屏简介
具体简介可看此处
接线说明
2.所需汉字的点阵
使用点阵汉字生成器,得到自己需要汉字的点阵
如下
DB 08H 08H FFH 08H 00H 08H 49H 2AH 28H 08H 1BH 29H 48H 88H 08H 08H;
DB 20H 20H FEH 20H 80H F8H 10H A0H 50H 90H FEH 10H 90H 90H 10H 30H;“蒋”,0
DB 04H 7FH 04H 1FH 10H 1FH 10H 1FH 04H FFH 12H 22H CBH 12H 2AH 04H;
DB 40H FCH 40H F0H 10H F0H 10H F0H 00H FEH 10H 08H 26H 90H 90H 00H;“慕”,1
DB 00H 0FH 08H 08H 08H 0AH 09H 08H 08H 08H 10H 10H 20H 20H 40H 80H;
DB 00H E0H 20H 20H 20H 20H 20H A0H A0H 20H 20H 22H 22H 22H 1EH 00H;“凡”,2
3.部分代码
4.静态显示汉字
(1)在gui.c中的oledfont.h中填入汉字的点阵
(2)在test.c中的void TEST_MainPage(void)函数中编写需要显示的汉字/数字
void TEST_MainPage(void)
{ GUI_ShowCHinese(28,20,16,"蒋慕凡",1);GUI_ShowString(4,48,"631907060208",16,1);delay_ms(1500); delay_ms(1500);
}
(3)main.c
int main(void)
{ delay_init(); //延时函数初始化 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑)while(1) { TEST_MainPage(); //界面显示}
}
(4)运行结果
5.动态显示
(1)OLED屏的滚屏命令
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); //开启滚动
2.垂直方向上
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); //终止页 7
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
(2)部分代码
main.c
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); //开启滚动}
(3)运行结果
完整代码
https://github.com/J-JMF/OLED
参考文章
https://blog.csdn.net/weixin_56102526/article/details/121481216?spm=1001.2014.3001.5501
使用OLED屏显示汉字相关推荐
- 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字
目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...
- 【嵌入式】STM32基于SPI通信协议OLED屏显示
STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...
- 基于STM32的0.96寸OLED显示屏显示汉字+数字
文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...
- esp32使用MicroPython驱动oled屏显示中文和英文
文章目录 esp32使用MicroPython驱动oled屏显示中文和英文 介绍 安装 特点 开源 硬件连接 API 示例 显示英文字符 显示汉字 参考链接 esp32使用MicroPython驱动o ...
- 实验 STM32 基于SPI的OLED屏显示
STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...
- 基于STM32F4 的OLED屏显示噪点、花屏问题
现象 在实现OLED屏显示 内容时,屏幕会出现噪点:多点亮一些点位,使要显示的内容不能辨识. 原因 1.可能是因为当前io配置频率过高 2.延时时间太短 解决方法 方法1.更换io管脚为可高频io 例 ...
- esp32 spi 驱动 oled 屏显示来自 PC 的画面
esp32 spi 驱动 oled 屏显示来自 PC 的画面 实验代码 gayhub 实验源码 设备及运行环境 装有python的电脑 Python 3.8.2 (tags/v3.8.2:7b3ab5 ...
- nokia5110液晶屏显示汉字,图形,…
nokia5110液晶屏显示汉字,图形,字符,字符串 从网上看到的文章,感觉很好,顾转载收藏啦 #include #include #define uchar unsigned char #defin ...
- STM32+OLED巧妙显示汉字英文
STM32+OLED巧妙显示汉字英文 目标:实现OLED_Print函数,可以在OLED屏幕上显示中英文和符号混合的任意字符串 汉字编码原理 ASCII码显示的原理这里不再说明,一般的OLED例程都有 ...
- msp430f5529——OLED屏显示文字与图片
目录 前言 一.效果展示 二.步骤 1.OLED.C文件 2.OLED.h文件 3.OLEDFONT.h文件 4.type.h文件 5.bmp.h文件 6.main.c 7.关于文字和图片的取模 总结 ...
最新文章
- 关于System.Web.Caching的“未将对象引用设置到对象的实例”错误
- 在数据准备区中允许使用的数据结构有哪些, 各有什么优点?
- 机器人学习--电子指南针定位导航
- SpringSecurity实现拦截未登录页面
- python wireshark_用python编写脚本从wireshark导出的数据文件中提取数据
- java怎么快速创建监听类_如何创建监听器
- 计算机网络中seq,计算机网络A卷及参考答案
- JavaScript数据结构——图(Graph)
- 限时删!字节总监总结一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
- vue基础之样式绑定(class,style)
- php有没有能无限遍历,php无限遍历目录代码
- 埃斯顿三轴机器人编程_一文了解Estun Studio机器人仿真与离线编程软件
- C语言找出完数并输出
- win7 64位 安装Infragistics NetAdvantage,报Error 1606 Could Not Access Network Location %SystemDrive%/ine
- C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_INEXACT
- java正则表达式双引号_java正则表达式去掉双引号
- 《每日一题》NO.21:画出CMOS 非门/与非门/或非门的结构
- Target DLL has been cancelled
- 视频无法播放,视频打不开怎么办?可用这款视频修复工具快速修复
- 【翻译论文】An Architecture Combining Convolutional Neural Network (CNN) and Support Vector Machine (SVM)