一、OLED屏字模显示 1.关于OLED 有机发光二极管(OrganicLight-Emitting Diode,OLED),又称为有机电激光显示、有机发光半导体(OrganicElectroluminescence Display,OLED),是指有机半导体材料和发光材料在电场驱动下,通过载流子注入和复合导致发光的现象。
2.关于SPI SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
二、OLED屏字模显示 1.字模获取 下载PCtoLCD
下载解压之后打开,先进行设置,设置过后才能使用,设置图:
?
输入想要获取的文字,点击生成字模,下面会出现字码,复制下面出现的数码
把数码保存起来,后面要用
?
三,代码
1.去下面网站下载代码
https://github.com/Sunlight-Dazzling/LEDORoll
下载完成后,在下图路径找到oledfont 文件,用记事本打开
在里面添加第二部获得的字模,记得做一些修改
然后保存
2.打开project中的keil工程
?修改main函数的代码:
?
最后编译生成hex文件
3.电路连接
按照下面方式连接电路
// OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? VCC ? ? ? ? 接 ? ? ? DC 5V/3.3V ? ? ?//OLED屏电源正 // ? GND ? ? ? ? 接 ? ? ? ? ?GND ? ? ? ? ?//OLED屏电源地 //=======================================液晶屏数据线接线==========================================// //本模块默认数据总线类型为4线制SPI // OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? D1 ? ? ? ? ?接 ? ? ? ? ?PB15 ? ? ? ?//OLED屏SPI写信号 //=======================================液晶屏控制线接线==========================================// // OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? CS ? ? ? ? ?接 ? ? ? ? ?PB11 ? ? ? ?//OLED屏片选控制信号 // ? RES ? ? ? ? 接 ? ? ? ? ?PB12 ? ? ? ?//OLED屏复位控制信号 // ? DC ? ? ? ? ?接 ? ? ? ? ?PB10 ? ? ? ?//OLED屏数据/命令选择控制信号 // ? D0 ? ? ? ? ?接 ? ? ? ? ?PB13 ? ? ? ?//OLED屏SPI时钟信号
4.烧录
?最后效果如下图所示:
?成功。
三,oled实现屏温湿度读取显示
本次算是上一次写的博客
?使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集_qq_51127539的博客-CSDN博客
基本相似,算是一个提升,用oled显示传感器采集到的温度湿度。
1.代码
在这里下载代码
https://github.com/Sunlight-Dazzling/stm32_AHT20_OLED
修改代码里面重要部分的延时时间 主函数:
#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)
{
read_AHT20_once();
OLED_Clear(0);
delay_ms(200);
}
}
?在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中
//printf(strTemp);
//printf("/r/n");
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(2000);
}
2. 连线
连线如下: 为了烧录程序进入芯片所必须的连接:
TTL?? ?芯片 3v3?? ?3v3 TXD?? ?A10 RXD?? ?A9 GND?? ?GND 为了温湿度采集所必须的连接:
AHT20?? ?芯片 VCC?? ?3v3 GND?? ?GND SCL?? ?PB6 SCA?? ?PB7 OLED模块连线:
// OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? VCC ? ? ? ? 接 ? ? ? DC 5V/3.3V ? ? ?//OLED屏电源正 // ? GND ? ? ? ? 接 ? ? ? ? ?GND ? ? ? ? ?//OLED屏电源地 //=======================================液晶屏数据线接线==========================================// //本模块默认数据总线类型为4线制SPI // OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? D1 ? ? ? ? ?接 ? ? ? ? ?PB15 ? ? ? ?//OLED屏SPI写信号 //=======================================液晶屏控制线接线==========================================// // OLED模块 ? ? ? ? ? ? ? STM32单片机 // ? CS ? ? ? ? ?接 ? ? ? ? ?PB11 ? ? ? ?//OLED屏片选控制信号 // ? RES ? ? ? ? 接 ? ? ? ? ?PB12 ? ? ? ?//OLED屏复位控制信号 // ? DC ? ? ? ? ?接 ? ? ? ? ?PB10 ? ? ? ?//OLED屏数据/命令选择控制信号 // ? D0 ? ? ? ? ?接 ? ? ? ? ?PB13 ? ? ? ?//OLED屏SPI时钟信号
3.烧录
?成功
参考博客
0.96寸OLED在STM32f103上实现滚动显示长字符_Harriet的博客-CSDN博客_oled滚动显示
STM32F103的SPI口进行OLED屏的使用_LaiYiFei25的博客-CSDN博客
|