一、任务要求
1、第一次双击key3使得OLED屏幕显示工位号
2、第二次双击key3使得OLED屏幕显示某个图标
3、第三次双击key3使得OLED屏幕环境监测
4、能实现以上三步循环操作
二、代码main.c文件编写
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "hal_oled.h"
#include "adc_reader.h"
#include "math.h" //获取pow计算x的y次幂函数
#include "sht3x.h" //温湿度
void Init() {
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
OLED_Init(); //OLED初始化
OLED_Clear();
ADCS_Init(); //ADC初始化
}
void number() //显示工位号
{
OLED_ShowString(56,3,(uint8_t *)"01");
}
uint8_t tubiao[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,0xF0,0xF8,0xF8,0x7C,0x7C,0x3E,
0x3E,0x3E,0x1F,0x1F,0x1F,0x1F,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFE,0xBE,
0x3E,0x7C,0xFC,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xE0,0xF8,0xFC,0xFF,0x7F,0x1F,0x8F,0x87,0xC3,0xC1,0xE0,0xE0,0xE0,0xE0,
0xE0,0xE0,0xC0,0xC0,0xC0,0x80,0xFF,0xFF,0xFF,0xFF,0x01,0x03,0x07,0x0F,0xFF,0xFF,
0xFE,0xFC,0xF0,0x00,0x01,0x03,0x07,0x0F,0x3F,0x7F,0xFE,0xFC,0xF8,0xE0,0x80,0x00,
0xFC,0xFF,0xFF,0xFF,0xFF,0xF9,0xFE,0xFF,0xFF,0xDF,0xCF,0xC7,0xC3,0xC3,0xC3,0xC3,
0xC3,0xE3,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF8,0xFF,0xFF,
0xFF,0xDF,0xC7,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC3,0xBF,0xFF,0xFF,0xFF,0xF8,
0x3F,0xFF,0xFF,0xFF,0xFD,0x83,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xE3,0xFB,0xFF,
0xFF,0xFF,0x1F,0x3F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xC7,0xC3,
0x87,0x87,0xC7,0xC7,0xC7,0xE7,0xFB,0xFF,0xFF,0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0x3F,
0x00,0x01,0x07,0x1F,0x3F,0xFF,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x1F,0x3F,0xFF,
0xFF,0xFF,0xE0,0xC0,0xC0,0x80,0xFF,0xFF,0xFF,0xFF,0x01,0x03,0x03,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x87,0xC3,0xE3,0xF1,0xFC,0xFE,0x7F,0x3F,0x1F,0x07,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x1F,0x1F,0x3E,0x3E,0x7C,
0x7D,0x7B,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF8,0xF8,0xF8,0xF8,0x7C,0x7C,
0x7C,0x3E,0x3F,0x1F,0x1F,0x0F,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
};
void picture() //显示图标
{
OLED_DrawBMP(40,1,48,48,tubiao);
}
//float temp;
//float humi;
//char str_temp[64];
//char str_humi[64];
float value;
unsigned char databuffer[64];
void get_sensor()
{
AdcScanChannel();
value = pow(10, ((1.395 - log10((50 / AdcReadCh0() - 20) / 10)) / 0.465));
HAL_Delay(200);
sprintf((char *)databuffer,"value:%2.0f",value);
OLED_ShowString(32,3,databuffer);
// call_sht11(&temp,&humi);
// sprintf(str_temp,"%.0f",temp); //温度
// OLED_ShowString(50,2,(uint8_t*)str_temp);
// sprintf(str_humi,"%.0f Rh",humi); //湿度
// OLED_ShowString(50,4,(uint8_t*)str_humi);
}
int fun,n,clickkey3,key3time;
void KeyDownHandler()
{
scan_keys();
if(isKey3Pressed())
{
resetKey3(); //重置key3状态
clickkey3++; //统计双击次数
if(clickkey3>=2&&key3time<50)
{
fun++; //统计功能
clickkey3=0;
key3time=0; //
if(fun%3==1){n=1;OLED_Clear();}
if(fun%3==2){n=2;OLED_Clear();}
if(fun%3==0){n=3;OLED_Clear();}
}else if(clickkey3>=2&&key3time>=50)
{
key3time=0; //两次单击超出时间则归零
}
}
}
int main( void )
{
Init();
while( 1 )
{
KeyDownHandler();
if(clickkey3)
{
++key3time;
HAL_Delay(5);
}else{
key3time=0;
}
switch(n)
{
case 1: number(); break;
case 2: picture(); break;
case 3: get_sensor(); break;
}
}
}
三、LoRa模块烧写代码
编译无错误,直接用STlink下载,"模组串口连接拨码开关"无要求
四、实验效果