STM32学习笔记——OLED屏
STM32学习笔记——OLED屏
OLED屏的特点:
1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色);
2. 显示尺寸为0.96寸
3. 分辨率为128*64
4. 多种接口方式,该模块提供了总共 5 种接口包括: 6800、 8080 两种并行接口方式、 3线或4线的SPI接口,IIC接口方式
5. 不需要高压,直接接3.3V就可以工作;(可以与stm32的引脚直接相接)
OLED图片:
OLED引脚介绍:
CS:OLED片选信号
RST:OLED复位端口
DC: 命令/数据选择端口(0:读写命令, 1: 读写数据)
SCLK(D0):串口时钟线
SDIN(D1): 串口数据线
4线SPI写操作时序图:
OLED的常用命令:
设置OLED显示内存的寻址方式:
设置的命令:
0x00: 表示水平寻址方式
0x01: 表示垂直寻址方式
0x10: 表示页寻址方式(默认方式)
stm32与OLED屏接口的引脚介绍:
CS————GPIOD3;
RST————GPIOD4;
DC—————GPIOD5;
D0——————GPIOD6;
D1——————GPIOD7;
程序代码:
1. 相关宏定义
#define OLED_CS(X) X?GPIO_SetBits(GPIOD, GPIO_Pin_3):GPIO_ResetBits(GPIOD, GPIO_Pin_3) //X为1时对应GPIO端口输出高电平,X为0时对应GPIO端口输出低电平 #define OLED_RST(X) X?GPIO_SetBits(GPIOD, GPIO_Pin_4):GPIO_ResetBits(GPIOD, GPIO_Pin_4) #define OLED_DC(X) X?GPIO_SetBits(GPIOD, GPIO_Pin_5):GPIO_ResetBits(GPIOD, GPIO_Pin_5) #define OLED_D0(X) X?GPIO_SetBits(GPIOD, GPIO_Pin_6):GPIO_ResetBits(GPIOD, GPIO_Pin_6) #define OLED_D1(X) X?GPIO_SetBits(GPIOD, GPIO_Pin_7):GPIO_ResetBits(GPIOD, GPIO_Pin_7) #define OLED_Order 0 //定义写命令
#define OLED_Data 1 //定义写数据
2. GPIO初始化代码:
void OLED_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //开启GPIOD的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//设置GPIO的基本参数
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHz GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_SetBits(GPIOD, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
}
3. SPI 写数据/命令
/* SPI写数据/命令
* Mode :O:写命令 1:写数据
* data :数据/命令
*
*/
void SPI_Write(char data, int Mode)
{
int i = ;
if(Mode)
{
OLED_DC(); //DC引脚输入高,表示写数据
}
else
{
OLED_DC(); //DC引脚输入低,表示写命令
}
OLED_CS(); //CS引脚输入低,片选使能
for(i = ; i < ; i++)
{
OLED_D0(); //D0引脚输入低
if(data & 0x80) //判断传输的数据最高位为1还是0
{
OLED_D1(); //D1引脚输入高
}
else
{
OLED_D1(); //D1引脚输入低
}
OLED_D0(); //D1引脚输入高
data <<= ; //将数据左移一位
}
OLED_DC(); //DC引脚输入低
OLED_CS(); //CS引脚输入高,片选失能
}
4. 设置OLED屏的显示坐标:
例如:设置页地址为0xB2; 列地址的低4位为0x03,列地址的高4位为0x00;则显示的位置如下图:
代码:
/* 设置OLED屏的显示坐标
* X : 表示OLED的水平坐标(0—127)
* Y : 表示OLED的页(0—7)
*
*/
void OLED_Coord(unsigned char x, unsigned char y)
{
SPI_Write((0xb0+(y & 0x0f)), OLED_Order); //设置OLED显示的页
SPI_Write((((x & 0xf0)>>) | 0x10), OLED_Order);//设置OLED水平坐标的高4位
SPI_Write((x & 0x0f)|0x01, OLED_Order); //设置OLED水平坐标的低4位
}
清除OLED的显示代码:
/*
* 清除OLED的显示
*
*
*/
void OLED_Clear(void)
{
int i = , j = ;
for(i = ; i < ; i++)
{
OLED_Coord(, i);
for(j = ; j < ; j++)
{
SPI_Write(0x00, OLED_Data);
}
}
}
关闭OLED显示代码:
/* 关闭OLED显示
*
*
*/
void OLED_Display_Off(void)
{
//电荷泵设置(初始化时必须打开,否则看不到显示)
SPI_Write(0x8D, OLED_Order);
SPI_Write(0x10, OLED_Order);//bit2 0:关闭 1:打开
SPI_Write(0xAE, OLED_Order);//0xAE:关闭显示
}
开启OLED显示代码:
/*
* 开启OLED显示
*
*/
void OLED_Display_On(void)
{
//电荷泵设置(初始化时必须打开,否则看不到显示)
SPI_Write(0x8D, OLED_Order);
SPI_Write(0x14, OLED_Order);//bit2 0:关闭 1:打开
SPI_Write(0xAF, OLED_Order);//0xAF:开显示
}
OLED显示的参数的初始化:
1. 在设置OLED的参数时,并不需要把所有的参数都设置一次;有些参数是默认的(可以不进行设置),只是需要设置一写必要的参数;
(如:0xAF: 开显示, 0x8D:电荷泵设置(初始化是必须打开,否则看不到显示))
2.代码(初始化代码中,介绍了大部分命令):
/* OLED显示参数的初始化
*
*
*
*/
void OLED_Init(void)
{
OLED_GPIO_Init(); OLED_RST();
delay_ms();
OLED_RST();
delay_ms();
OLED_RST(); SPI_Write(0xAE, OLED_Order);//0xAE:关显示 SPI_Write(0x00, OLED_Order);//设置低列地址
SPI_Write(0x10, OLED_Order);//设置高列地址 //设置行显示的开始地址(0-63)
//40-47: (01xxxxx)
SPI_Write(0x40, OLED_Order); //设置对比度
SPI_Write(0x81, OLED_Order);
SPI_Write(0xff, OLED_Order);//这个值越大,屏幕越亮(和上条指令一起使用)(0x00-0xff) SPI_Write(0xA1, OLED_Order);//0xA1: 左右反置, 0xA0: 正常显示(默认0xA0)
SPI_Write(0xC8, OLED_Order);//0xC8: 上下反置, 0xC0: 正常显示(默认0xC0) //0xA6: 表示正常显示(在面板上1表示点亮,0表示不亮)
//0xA7: 表示逆显示(在面板上0表示点亮,1表示不亮)
SPI_Write(0xA6, OLED_Order); SPI_Write(0xA8, OLED_Order);//设置多路复用率(1-64)
SPI_Write(0x3F, OLED_Order);//(0x01-0x3f)(默认为3f) //设置显示抵消移位映射内存计数器
SPI_Write(0xD3, OLED_Order);
SPI_Write(0x00, OLED_Order);//(0x00-0x3f)(默认为0x00) //设置显示时钟分频因子/振荡器频率
SPI_Write(0xD5, OLED_Order);
//低4位定义显示时钟(屏幕的刷新时间)(默认:0000)分频因子= [3:0]+1
//高4位定义振荡器频率(默认:1000)
SPI_Write(0x80, OLED_Order);// //时钟预充电周期
SPI_Write(0xD9, OLED_Order);
SPI_Write(0xF1, OLED_Order);//[3:0],PHASE 1; [7:4] PHASE 2 //设置COM硬件应脚配置
SPI_Write(0xDA, OLED_Order);
SPI_Write(0x12, OLED_Order);//[5:4] 默认:01 SPI_Write(0xDB, OLED_Order);//
SPI_Write(0x40, OLED_Order);// //设置内存寻址方式
SPI_Write(0x20, OLED_Order);
//00: 表示水平寻址方式
//01: 表示垂直寻址方式
//10: 表示页寻址方式(默认方式)
SPI_Write(0x02, OLED_Order);// //电荷泵设置(初始化时必须打开,否则看不到显示)
SPI_Write(0x8D, OLED_Order);
SPI_Write(0x14, OLED_Order);//bit2 0:关闭 1:打开 //设置是否全部显示 0xA4: 禁止全部显示
SPI_Write(0xA4, OLED_Order); //0xA6: 表示正常显示(在面板上1表示点亮,0表示不亮)
//0xA7: 表示逆显示(在面板上0表示点亮,1表示不亮)
SPI_Write(0xA6, OLED_Order);// SPI_Write(0xAF, OLED_Order);//0xAF:开显示 SPI_Write(0xAF, OLED_Order);//0xAF:开显示 OLED_Clear();
}
显示16*16的汉字函数代码:
/* 显示汉字
* x:表示显示的水平坐标
* y: 表示显示的垂直坐标
* *p: 表示要显示汉字模组的首地址
*/
void OLED_ShowChinese(int x, int y, const unsigned char *p)
{
int i = ;
OLED_Coord(x, y);
for(i = ; i < ; i+=)
{
SPI_Write(p[i], OLED_Data);
}
OLED_Coord(x, y+);
for(i = ; i < ; i+=)
{
SPI_Write(p[i], OLED_Data);
}
}
显示ASCII码的函数代码:
/* 显示ASCII
* x:表示显示的水平坐标
* y: 表示显示的垂直坐标
* *p: 表示要显示汉字模组的首地址
*/
void OLED_ShowChar(int x, int y, const unsigned char *p)
{
int i = ;
OLED_Coord(x, y);
for(i = ; i < ; i+=)
{
SPI_Write(p[i], OLED_Data);
}
OLED_Coord(x, y+);
for(i = ; i < ; i+=)
{
SPI_Write(p[i], OLED_Data);
}
}
注意1:在使用PCtoLCD2002完美版进行取模时,如果取模的字高大于8时一定要注意;
如果字高16;取模的顺序是:从第一列开始,前8个点为第一个字节,后8个点为第二个字节
然后第二列取模,前8个点为第三个字节,后8个点为第四个字节,以此类推,而OLED屏的内存
寻址方式为0x10: 表示页寻址方式(默认方式)时,那么显示时将会乱码;因为是按页来显示的,
那么第一个字节显示在第一列,而第二个字节本应该显示在第二页的第一列,而被错误的显示在第一页的第二列,以此类推,导致显示乱码;
(这就是为什么OLED_ShowChar()函数和OLED_ShowChinese()函数中, 前面先显示数组下标为偶数的数组, 后面显示数组下标为奇数的数组)
OLED显示的main函数代码:
int main(void)
{
SysTick_Init();
OLED_Init(); OLED_ShowChinese(, , xing);//‘姓’
OLED_ShowChinese(, , ming);//‘名’
OLED_ShowChar(, , ASCII_Colon);//‘:’
OLED_ShowChinese(, , xue);//‘学’
OLED_ShowChinese(, , hao);//‘号’
OLED_ShowChar(, , ASCII_Colon);//‘:’
// SPI_Write(0x2F, OLED_Order); //0x2F:激活滚动 0x2E:关闭滚动
// //设置滚动方式:
// // 0x26/0x27 :水平滚动(右向/左向)
// // 0x29/0x2A :水平和垂直滚动(右向/左向)
// // 0xA3 :垂直滚动
// SPI_Write(0x27, OLED_Order);
// SPI_Write(0x00, OLED_Order);
// SPI_Write(0x00, OLED_Order);
// SPI_Write(0x00, OLED_Order);
// SPI_Write(0x03, OLED_Order);
// SPI_Write(0x30, OLED_Order);
while();
注意:在使用滚动命令时,一定要先写入0x2F, 激活滚动
取模数组:
const unsigned char xing[]=
{ 0x10,0x40,0x10,0x22,0xF0,0x15,0x1F,0x08,
0x10,0x16,0xF0,0x21,0x40,0x40,0x3C,0x42,
0x10,0x42,0x10,0x42,0xFF,0x7F,0x10,0x42,
0x10,0x42,0x10,0x42,0x00,0x40,0x00,0x00};/*"姓",0*/
const unsigned char A[]=
{ 0x00,0x20,0x00,0x3C,0xC0,0x23,0x38,0x02,
0xE0,0x02,0x00,0x27,0x00,0x38,0x00,0x20};/*"A",0*/
const unsigned char ming[]=
{ 0x00,0x04,0x20,0x04,0x20,0x04,0x10,0x02,
0x08,0xFE,0x14,0x43,0x67,0x43,0x84,0x42,
0x44,0x42,0x24,0x42,0x14,0x42,0x0C,0x42,
0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00};/*"名",0*/
const unsigned char ASCII_Colon[]=
{ 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,
0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00};/*":",0*/
const unsigned char xue[]=
{ 0x40,0x04,0x30,0x04,0x11,0x04,0x96,0x04,
0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7E,
0x90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,
0x13,0x04,0x50,0x04,0x30,0x04,0x00,0x00};/*"学",0*/
const unsigned char hao[]=
{ 0x80,0x00,0x80,0x00,0x80,0x00,0xBE,0x06,
0xA2,0x05,0xA2,0x04,0xA2,0x04,0xA2,0x04,
0xA2,0x44,0xA2,0x84,0xA2,0x44,0xBE,0x3C,
0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00};/*"号",0*/
OLED的命令基本上已经在上面介绍,还有一些屏幕显示滚动的命令;本人没有进行一一实验;
实验现象:
STM32学习笔记——OLED屏的更多相关文章
- STM32学习笔记——点亮LED
STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- stm32学习笔记——外部中断的使用
stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- STM32学习笔记-NVIC中断知识点
STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...
- STM32学习笔记之一(初窥STM32)
怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
- STM32学习笔记——序言
写AVR已经两年了.如果初中时候玩Arduino也算的话,就是6年. 两年以来,我用AVR单片机完成了两个大项目: AVR单片机教程,一时兴起写的,效果不好: MEDS,参赛用的课题,半完成,比赛都结 ...
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...
随机推荐
- 扩展django的User的部分方法
这做项目时发现django自带的User中的字段不够用,默认的auth_user表总共只有11个字段,如果需要更多的字段该怎么办,在网上搜了一下,有这么几种方法. 1. 直接修改django 源码,修 ...
- Win Form程序线程点点
消息循环 Win32窗体程序基于消息驱动的,程序的模型就是一个用户触发事件消息->系统分发事件消息->程序处理事件的循环过程. .NET Win Form程序对消息循环进行了封装,可以看到 ...
- yum源的搭建
1.光盘的挂载 2.先创建一个文件 /aaa 然后挂载mount /dev/cdrom /aaa 进入 /aaa ls 查看是否挂载OK 3.进入yum文件夹.将除Media以外的所有文件名改为X ...
- CSS3的透明度使用
大家在敲代码的时候总会遇见一个问题.就是透明度opacity 会导致整个元素内全部都会改变,通常的方法是在同级元素后面再加上一个元素标签,但是现在有CSS3 ,我们完全不用这么做了.看代码 <! ...
- jbox用法
详见 http://www.jjsp.gov.cn:8888/js/jbox-v2.3/jbox-demo2.html
- RecyclerView因版本问题无法加载
前几天在学习RecyclerView时候,一直失败,各种加载不上.下面是错误信息 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL ...
- 2016 - 3 - 12 SQLite的学习之SQL语言入门
1.SQL语句的特点: 1.1 不区分大小写 1.2 每条语句以;结尾 2.SQL语句中常用关键字: select,insert,update,from,create,where,desc,order ...
- macbook air 128g 磁盘清理
使用 du 命令发现 ~/Library/Developer/Xcode/DerivedData 占用了大量空间,这些都是xcode对以前建过的project源码文件建立的索引等,如果不需要可以都删 ...
- TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具
在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多. 除了netperf以外. 还有很多其它的网络性能测试工具. 如db, ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...