目录
本次教程以G431新板子为例,我们基于HAL库进行编写程序,这样能大大提高效率
题目:电压测量监控设备(2015年省赛真题)
大家可以去官网寻找题目的具体要求,保证可观性,我只截取部分截图
首先我们分为五部分进行讲解,led和key,lcd,iic,uart(串口),ADC,RTC
话不多说,先附上主函数(main.c)整体代码
整体代码
#include "main.h"
#include "lcd\lcd.h"
#include "adc\bsp_adc.h"
#include "uart\bsp_uart.h"
#include "iic\bsp_iic.h"
#include "rtc\bsp_rtc.h"
#include "led_key\bsp_led_key.h"
#include "stdio.h"
#include "string.h"
__IO uint32_t uwTick_led_key,uwTick_lcd,uwTick_led,uwTick_uart;
uint8_t key_down,key_up,key_old;
float elctrct_V;
uint8_t led_open=1;
/*变量定义区*/
uint8_t meauc[30];//字符显示存放区
uint8_t lenth,led_land,ucled_vuale=0,lcd_land=0,key_Stat=0;//标志位
uint8_t k_vule[1]={1},time[3];//读取和写入EEPROM暂时缓冲区
uint8_t hour,mulits,musec;//时-分-秒
uint8_t hour_work=0,mulits_work=0,musec_work=0;//原始判断值
RTC_TimeTypeDef get_time;
RTC_DateTypeDef get_data;
//串口相关
uint8_t rxbuffer;//缓存
uint8_t cout=0;//计数
char buffer_uart[16]; //存数据的地方
/*子函数声明区*/
void lcd_project(void);
void led_key_project(void);
void SystemClock_Config(void);
uint16_t Get_adc_vuele(void);
void uart_project(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
ADC2_Init();
I2CInit();
led_key_Init();
RTC_Init();
UART_Init();
led_play(0x00);
LCD_Init();
HAL_UART_Init(&huart1);//可不加
HAL_RTC_Init(&hrtc);//可不加
HAL_ADC_Init(&hadc2);//可不加
Read_EEprom(k_vule,0 , 1);
HAL_Delay(10);
/***保证EEPROM里面的值合理
(当把代码烧进一个陌生的板子(EEPROM区域的值不确定为多少),我们将EEPROM里面值初始化)***/
if(k_vule[0] >9&&k_vule[0] <1) {
k_vule[0]=1;
write_EEprom(k_vule,0 , 1);
HAL_Delay(10);
Read_EEprom(k_vule,0 , 1);
}
//设置lcd屏幕
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD_Clear(Black);
//开始进行中断接收
UART_Start_Receive_IT(&huart1, (uint8_t*)&rxbuffer,1);
while (1)
{
led_key_project();
lcd_project();
uart_project();
}
}
//获取ADC的值
uint16_t Get_adc_vuele(){
uint16_t vual;
HAL_ADC_Start(&hadc2);
vual= HAL_ADC_GetValue(&hadc2);
return vual;
}
void led_work(){
if(uwTick-uwTick_led<200)return;
uwTick_led =uwTick;
ucled_vuale ^=0x01;
led_play(ucled_vuale);
}
void led_key_project(){
if(uwTick-uwTick_led_key<50)return;
uwTick_led_key =uwTick;
uint8_t vuele;
vuele = key_play();
key_down=vuele&(vuele^key_old);
key_up=~vuele&(vuele^key_old);
key_old =vuele;
switch (key_down){
case 1:
led_open^=0x01;
break;
case 2:
lcd_land^=0x01;
LCD_Clear(Black);
hour_work =t