一、前言
获取到数据后我们常需要在OLED显示屏上显示,本文中我们需要使用上一篇文章(光照与温湿度数据获取)的代码,在其基础上继续完成本文内容。
基础代码:
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "led_light.h"
#include "adc_reader.h"
#include <math.h> //library
#include <stdio.h>
#include "stm32l1xx_hal.h" // controller register definitions
#include "sht1x.h" // controller register definitions
#include "sht3x.h"
void Init() {
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
float temp=0,hum=0,light=0;
int main( void )
{
Init();
ADCS_Init();//初始化ADC
hal_temHumInit();//初始化温湿度模块
while( 1 )
{
HAL_Delay(1000);//延时1000ms
AdcScanChannel();//更新通道值
light=((5.0/2.0)*AdcReadCh0())*100.0;//获取光照并通过公式计算
call_sht11(&temp,&hum);//获取温湿度
}
}
二、代码实现
例程中,为我们提供了hal_oled.c文件,其中为我们常使用下列方法:
void OLED_Display_On(void);//开启展示
void OLED_Display_Off(void);//关闭展示
void OLED_Init(void);//初始化OLED
void OLED_Clear(void);//清空显示内容
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);//OLED屏幕画点
void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p);//OLED显示字符串
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);//显示汉字
void OLED_DrawBMP(unsigned char x, unsigned char y,unsigned char width, unsigned char hight,unsigned char BMP[]);//显示图片
OLED的屏幕是128*64,内部将其分为了8行4页,即0、2、4、6,因此uint8_t y的参数为0~7,且一个高16的字符需要两行,即一页。
其中,OLED_ShowCHinese()的第三个参数是来源于oledfont.h中的HZK数组,大家也可以通过取模软件自行取模覆盖掉该数组的内容。
下面,我们会用到温度与湿度的字模,从数组中找到他们对应的下标。
代码示例:
下列代码实现了汉字、字符串、数据、图片的功能,以供大家学习参考。
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "led_light.h"
#include "adc_reader.h"
#include <math.h> //library
#include <stdio.h>
#include "stm32l1xx_hal.h" // controller register definitions
#include "sht1x.h" // controller register definitions
#include "sht3x.h"
void Init() {
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
unsigned char bmp[]={//图像取模后的数组
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFE,0xFC,0xF8,0xF0,
0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x7F,0xBF,0xDF,0x6F,0xBF,
0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0x1C,0x08,0x10,0x18,
0x6C,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0xB7,0xDB,0x6F,0xB7,0xDB,0x6D,
0xB6,0xDA,0x6C,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x06,0x1B,0x2D,0x36,
0xDB,0x6D,0x36,0x1B,0x0D,0x06,0x03,0x01,0x00,0x00,0x00,0x00
};
float temp=0,hum=0,light=0;
uint8_t data[20];
int main( void )
{
Init();
ADCS_Init();//初始化ADC
hal_temHumInit();//初始化温湿度模块
OLED_Init();//初始化OLED屏幕
OLED_Display_On();//开启展示
while( 1 )
{
HAL_Delay(1000);//延时1000ms
AdcScanChannel();//更新通道值
light=((5.0/2.0)*AdcReadCh0())*100.0;//获取光照并通过公式计算
call_sht11(&temp,&hum);//获取温湿度
OLED_Clear();
OLED_ShowCHinese(0,0,24);//湿 第二个参数代表从0行开始 将字写在0-1行
OLED_ShowCHinese(16,0,23);//度 第一个参数代表左边的像素距离
//要把第一个字16*16的距离空出来 否则会覆盖第一个字 一个汉字的大小是16*16
memset(data,'\0',20);//清空数组
sprintf((char *)data,"%.2f %%RH",hum);//将内容写到数组中
OLED_ShowString(16*2,0,data);//显示数组内的内容
//16*2代表左边空出两个字的距离
OLED_ShowString(0,2,(uint8_t *)"xixi_cainiao");//直接显示字符串 xixi_cainiao
//第二个参数为2代表显示在2-3行
OLED_DrawBMP(0,4,32,32,bmp);//在距离左边为0 第4行开始 画一个32*32的图像
//bmp为上述定义好的图像数组
}
}
其中有值得注意的几点:
1.必须导入头文件,头文件是使我们的主程序知道所使用的方法存在的基础。
2.初始化后需要开始展示,OLED显示屏才能够正确显示图像
3.在每次更新数据前,务必需要清空OLED显示屏,否则,如果新的数据对某个位置的显示数据没有改变,该区域就会保留,影响显示效果。
4.数组与OLED显示屏原理相同,使用前务必清空,否则会对后面造成干扰。
三、总结
OLED显示屏是一个十分重要的输出设备,它是我们不借助其他软件让我们直观看到单片机状态的设备,因此它的掌握尤为重要,也是我们交互的基础。