基于SIP接口的OLED的数据显示
1. 显示自己的学号和姓名。
接线如图所示
修改字符矩阵
使用PCtoLCD转化为点阵
将次部分替换即可
主函数部分
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "stdlib.h"
#include "bsp_i2c.h"
#include "ATH20.h"
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "misc.h"
void GPIO_Configuration(void);
void RCC_Configuration(void);
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{ int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106, i7=126,i8=146,i9=166;
uint8_t ret = 0;
uint8_t LED_Stat = 0;
float P,T,ALT;
uint32_t CT_data[2];
int c1,t1;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
OLED_Clear(0) ;
RCC_Configuration(); //设置系统时钟
GPIO_Configuration(); //IO口设
OLED_WR_Byte(0x2E,OLED_CMD);
OLED_ShowCHinese(6,0,24);
OLED_ShowCHinese(26,0,25);
OLED_ShowCHinese(46,0,21);
OLED_ShowCHinese(66,0,6);
OLED_ShowCHinese(86,0,7);
OLED_ShowCHinese(106,0,8);
OLED_ShowCHinese(6,3,22);
OLED_ShowCHinese(26,3,23);
OLED_ShowCHinese(46,3,21);
OLED_ShowString(0,6,"631807030410",16);
}
显示结果
2. 显示AHT20的温度和湿度。
显示温度部分和和上面部分有很多相识部分,这里我就不一一赘述
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "stdlib.h"
#include "bsp_i2c.h"
#include "ATH20.h"
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "misc.h"
void GPIO_Configuration(void);
void RCC_Configuration(void);
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{ int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106, i7=126,i8=146,i9=166;
uint8_t ret = 0;
uint8_t LED_Stat = 0;
float P,T,ALT;
uint32_t CT_data[2];
int c1,t1;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
OLED_Clear(0) ;
RCC_Configuration(); //设置系统时钟
GPIO_Configuration(); //IO口设
I2C_Bus_Init();
ret = ATH20_Init();
if(ret == 0)
while(1)
{ OLED_Clear(0);
OLED_ShowString(0,11,"631807030616",16);
delay_ms(2500);
printf("ATH20传感器初始化错误\n");
}
while(1)
{ for(hcr=0;hcr<=166;hcr+=20)
{
while(ATH20_Read_Cal_Enable() == 0)
{
ATH20_Init();//如果为0再使能一次
delay_ms(25);
}
ATH20_Read_CTdata(CT_data); //读取温度和湿度
c1 = CT_data[0] * 1000 / 1024 / 1024; //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)
t1 = CT_data[1] * 200 *10 / 1024 / 1024 - 500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)
OLED_Clear(0);
if((i1-hcr)>=0)
OLED_ShowCHinese(6-hcr,0,9);//全
if((i2-hcr)>=0)
OLED_ShowCHinese(26-hcr,0,10);//欢
if((i3-hcr)>=0)
OLED_ShowCHinese(46-hcr,0,11);
if((i4-hcr)>=0)
OLED_ShowCHinese(66-hcr,0,12);//子
if((i5-hcr)>=0)
OLED_ShowCHinese(86-hcr,0,13);//技
if((i6-hcr)>=0)
OLED_ShowCHinese(106-hcr,0,14);//术
if((i7-hcr)>=0&&(i7-hcr)<=106)
OLED_ShowCHinese(126-hcr,0,15);//动
if((i8-hcr)>=0&&(i8-hcr)<=106)
OLED_ShowCHinese(146-hcr,0,16);//电
if((i9-hcr)>=0&&(i9-hcr)<=106)
OLED_ShowCHinese(166-hcr,0,17);//子
OLED_ShowCHinese(6,3,18);//温
OLED_ShowCHinese(26,3,20);//度
OLED_ShowCHinese(46,3,21);//:
OLED_ShowNum(66,3,c1,1,16);
OLED_ShowCHinese(6,6,19);//湿
OLED_ShowCHinese(26,6,20);//度
OLED_ShowCHinese(46,6,21);//:
OLED_ShowNum(66,6,t1,3,16);
delay_ms(2500);
delay_ms(2500);//每隔两秒读一次数
if(LED_Stat == 0)
{
LED_Stat = 1;
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
// GPIO_ResetBits(GPIOC, GPIO_Pin_1);
}
else
{
LED_Stat = 0;
GPIO_SetBits(GPIOC, GPIO_Pin_2);
// GPIO_SetBits(GPIOC, GPIO_Pin_1);
}
}
}
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7; //状态LED1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出模式最大速度50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
效果展示
3. 上下或左右的滑动显示长字。
滑动的基本原理就是通过不断地刷新坐标实现的
实现水平滑动和竖直滑动的代码
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); //开启滚动
主函数部分:
int main(void)
{ int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106, i7=126,i8=146,i9=166;
uint8_t ret = 0;
uint8_t LED_Stat = 0;
float P,T,ALT;
uint32_t CT_data[2];
int c1,t1;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
OLED_Init(); //初始化OLED
OLED_Clear(0) ;
RCC_Configuration(); //设置系统时钟
GPIO_Configuration(); //IO口设
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_ShowCHinese(6,0,9);
OLED_ShowCHinese(26,0,10);
OLED_ShowCHinese(46,0,11);
OLED_ShowCHinese(66,0,12);
OLED_ShowCHinese(86,0,13);
OLED_ShowCHinese(106,0,14);
OLED_ShowCHinese(6,3,15);
OLED_ShowCHinese(26,3,16);
OLED_ShowCHinese(46,3,17);
OLED_WR_Byte(0x2F,OLED_CMD);
}
效果展示:
总结:OLED的显示是一个我们需要掌握的技能,可以有多种显示方法,是实现交互性的重要模块。可以和其它模块一起完成显示功能。