注:题目可以在网上找
一。CubeMX配置
1.1引脚配置
注:引脚定义功能可以在题目中找出,这里就不多做介绍了。
1.2时钟配置
二。代码实现
2.1 gpio.c
在 /* USER CODE BEGIN 2 */ 下加上以下代码
/* USER CODE BEGIN 2 */
//亮灯
void led_on(uint8_t led )
{
ledtemp |= led;
GPIOC->ODR = ~ledtemp<<8;
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//led,LE=1
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
//灭灯
void led_off(uint8_t led )
{
ledtemp &= ~led;
GPIOC ->ODR= ~ledtemp<<8;
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//led,LE=1
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
//按键读取
uint8_t key_read(void )
{
uint8_t key_val=0;
if (HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_0) ==0)
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_0) ==0)
{
key_val =1;
}
}
if (HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_1) ==0)
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_1) ==0)
{
key_val =2;
}
}
if (HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_2) ==0)
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_2) ==0)
{
key_val =3;
}
}
if (HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0) ==0)
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_3) ==0)
{
key_val =4;
}
}
return key_val ;
}
/* USER CODE END 2 */
2.2 adc.c
在 /* USER CODE BEGIN 1 */ 下加入以下代码
/* USER CODE BEGIN 1 */
//adc2读取
uint16_t adc2_read(void)
{
HAL_ADC_Start(&hadc2 );
if(HAL_ADC_PollForConversion(&hadc2 ,10)==HAL_OK )
{
return HAL_ADC_GetValue(&hadc2 );
}
else
return 0;
}
/* USER CODE END 1 */
2.3 stm32g4xx_it.c
在 stm32g4xx_it.c 里加入以下代码
/* USER CODE BEGIN PV */
uint16_t ustime;
extern uint8_t stime,adctime,cnttime;
extern uint8_t startflag;
extern uint16_t lcdtime;
/* USER CODE END PV */
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
ustime++;
lcdtime ++;
adctime ++;
if(ustime==1000)
{
stime ++;
ustime=0;
if(startflag==1)
{
cnttime++;
}
}
/* USER CODE END SysTick_IRQn 1 */
}
2.4 main.c 加入头文件
#include "main.h"
#include "adc.h"
#include "gpio.h"
#include "lcd.h"
#include "stdio.h"
2.5在 main.c 的/* USER CODE BEGIN PV */下加入以下代码
/* USER CODE BEGIN PV */
uint8_t stime,adctime,cnttime;//时间参数
uint16_t lcdtime;
uint8_t key,Vmax=30,Vmin=10;
uint8_t lcdflag=0,Paraviewflag=0,Dataviewflag,startflag=0;//标志参数
uint8_t lcdtext[20];
uint16_t adc_val;
uint8_t Vmaxold,Vminold;
/* USER CODE END PV */
2.6在 /* USER CODE BEGIN PFP */下加入以下代码
/* USER CODE BEGIN PFP */
void KEY_Proc(void );
void LED_Proc(void );
void LCD_Proc(void );
void ADC_Proc(void );
/* USER CODE END PFP */
2.7在 main.c的/* USER CODE BEGIN 4 */里加入以下代码
/* USER CODE BEGIN 4 */
//按键处理函数
void KEY_Proc(void )
{
uint8_t keyval=0;
keyval=key_read();
if(keyval != key )
{
key =keyval;
}
else
keyval=0;
switch (keyval)
{
case 1:
if(lcdflag ==1)//在参数界面
{
if(Vmax >= (Vmin +1))
{
lcdflag =0;//进入数据界面
Paraviewflag=0;//熄灭led2
}
else
{
lcdflag =1;//留在参数界面
Paraviewflag=1;//参数错误,led2点亮
Vmax=Vmaxold;
Vmin=Vminold;
}
}
if(lcdflag ==0)在数据界面
{
lcdflag =1;//进入参数界面
Vmaxold=Vmax;
Vminold=Vmin;
}
break ;
case 2:
if(lcdflag ==1)
{
Vmax +=1;
if(Vmax == 34)
{
Vmax =0;
}
}
break ;
case 3:
if(lcdflag ==1)
{
Vmin +=1;
if(Vmin == 34)
{
Vmin =0;
}
}
break ;
}
}
//LED处理函数
void LED_Proc(void )
{
if(lcdflag ==0)
{
if(startflag==1)
led_on(1);
else
led_off(1);
}
else
led_off(1);
if(Paraviewflag==1)
led_on(2);
else
led_off(2);
}
//LCD显示函数
void LCD_Proc(void )
{
if(lcdtime<500)
return ;
lcdtime=0;
if(lcdflag ==0)//数据界面
{
sprintf((char*)lcdtext," Data " );
LCD_DisplayStringLine(Line1 ,lcdtext);
sprintf((char*)lcdtext," V:%.2fV ",(float)(adc_val*3.3/4096));
LCD_DisplayStringLine(Line2 ,lcdtext);
sprintf((char*)lcdtext," " );
sprintf((char*)lcdtext," T:%02us ",cnttime );
LCD_DisplayStringLine(Line3 ,lcdtext);
}
if(lcdflag ==1)//参数界面
{
cnttime=0;
sprintf((char*)lcdtext," Para " );
LCD_DisplayStringLine(Line1 ,lcdtext);
sprintf((char*)lcdtext," Vmax:%1u.%1uV ",Vmax/10,Vmax%10 );
LCD_DisplayStringLine(Line2 ,lcdtext);
sprintf((char*)lcdtext," Vmin:%1u.%1uV ",Vmin/10,Vmin%10 );
LCD_DisplayStringLine(Line3 ,lcdtext);
}
}
//ADC采样函数
void ADC_Proc(void )
{
if(adctime <100)
return ;
adctime=0;
uint8_t val;
adc_val =adc2_read();
val=(adc_val*33/4096);
if( Vmax > val && val> Vmin)
startflag =1;
else
startflag =0;
}
/* USER CODE END 4 */
2.8在main函数里的 /* USER CODE BEGIN 2 */下加入以下代码
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_Clear(Black );
LCD_SetTextColor(White );
LCD_SetBackColor(Black );
/* USER CODE END 2 */
2.9在main函数里的 while里加入以下代码
while (1)
{
/* USER CODE BEGIN 3 */
KEY_Proc( );
LED_Proc( );
LCD_Proc( );
ADC_Proc( );
}
/* USER CODE END 3 */
总结:
每天进步一点点......