HAL库开发#08——完結篇(练习)

感谢B站up主,小蜜蜂老师!!讲的真的很清楚~~~~

#08——完結篇(练习)

1.题目

【1】 上电开机后,首选在OLED上显示“小蜜蜂的LOGO”图片,然后让LED1与LED2依次点亮,然后熄灭,进行灯光检测。灯光检测结束后,OLED切换至数据显示界面,分3行:
第1行显示:“ www.xmf393.com ”
第2行显示:“采样值:”
第3行显示:“电压值:”
【2】在主程序中,采用查询的方式,每隔0.3秒对ADC_IN0通道的光敏传感器进行一次电压数据采集,并将采样到的12位数据换算成对应的实际电压值。LED1作为A/D采样指示灯,每采样一次闪烁一下。
【3】每进行完一次光敏传感器的数据采样和电压换算后,将其结果更新到OLED显示屏中相应的位置。如果光敏传感器的电压值小于1.3V,则将LED2灯点亮,反之,将LED2灯关闭。
在这里插入图片描述

2.解
首先需要进行OLED的底层驱动函数移植

/* USER CODE BEGIN Includes */
//====引入OLED底层驱动的头文件========
#include "XMF_OLED_STM32Cube.h"
#include "stdio.h"
/* USER CODE END Includes */

宏定义

extern unsigned char BMP1[];

#define LED1_ON() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET)
#define LED2_ON() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET)
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET)

uint16_t ADC0_Value = 0;
uint16_t ADC_Volt = 0;
uint8_t str_buff[64];
//LED灯流水点亮检测
void LED_Check()
{
    LED1_ON();
    HAL_Delay(500);
    LED2_ON();
    HAL_Delay(500);
	
    LED1_OFF();
    HAL_Delay(500);
    LED2_OFF();
    HAL_Delay(500);
}
//显示开机LOGO图片
void OLED_display_pic()
{
    OLED_Clear();
    OLED_DrawBMP(0,0,128,8,BMP1);
}
//显示数据显示界面
void OLED_display_info()
{
    OLED_Clear();
    OLED_ShowString(6,0,(uint8_t *)"www.xmf393.com");
    HAL_Delay(200);
    OLED_ShowCHinese(0,3,24); 
    OLED_ShowCHinese(18,3,25); 
    OLED_ShowCHinese(36,3,26); 
    OLED_ShowString(54,3,(uint8_t *)":");
    HAL_Delay(200);
    OLED_ShowCHinese(0,6,16); 
    OLED_ShowCHinese(18,6,17); 
    OLED_ShowCHinese(36,6,26); 
    OLED_ShowString(54,6,(uint8_t *)":");
    HAL_Delay(200);
}
//更新ADC采样数据与换算结果
void OLED_display_dat()
{
    sprintf((char*)str_buff, "%4d", ADC0_Value);
    OLED_ShowString(64,3,(uint8_t *)str_buff);
    sprintf((char*)str_buff, "%d.%d%dV", ADC_Volt/100, (ADC_Volt%100/10), ADC_Volt%10);
    OLED_ShowString(64,6,(uint8_t *)str_buff);
}
//ADC采样过程与灯光自动控制
void Get_ADC0_Value()
{
    HAL_ADC_Start(&hadc1);
    if(HAL_OK == HAL_ADC_PollForConversion(&hadc1, 30))
    {
        ADC0_Value = HAL_ADC_GetValue(&hadc1);
        ADC_Volt = ADC0_Value * 330 / 4096; 
		
        if(ADC_Volt < 130)
        {
	    LED2_ON();
        }
        else
        {
	    LED2_OFF();
        }
    }
    HAL_ADC_Stop(&hadc1);
}

主函数

/* USER CODE BEGIN 2 */
OLED_Init();			//初始化OLED
OLED_display_pic();		//显示开机LOGO图片
LED_Check();			//灯光检测
OLED_display_info();		//显示数据界面
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    LED1_ON();			//ADC采样指示灯点亮
    Get_ADC0_Value();		//进行一次ADC采样及逻辑处理
    OLED_display_dat();		//更新OLED中的采样数据
    HAL_Delay(200);		//延时0.2秒
    LED1_OFF();			//ADC采样指示灯关闭
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

注:
这是我的学习笔记。
来自B站视频(av号:av87017878)
这个UP的原博客为:https://www.xmf393.com/2020/02/10/20200210/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值