一、LED
1.原理图
2.CubeMx配置
将时钟频率配置成80kHz。
配置Led1-Led8的引脚为推挽输出模式(PC8-PC15),将初始电平配置成高电平。
3.代码
led.c
/*
函数名:LED_Disp
入口参数:ucLed
返回值:void
函数功能:Led8-Led0对应的8个数
*/
void LED_Disp(unsigned char ucLed)
{
//熄灭所有的LED
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
// 8个Led占据GPIOC的高八位
HAL_GPIO_WritePin(GPIOC,ucLed<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
二、KEY
1.原理图
2.CubeMx配置
配置引脚PB0、PB1、PB2、PA0为输入模式。
3.代码
/*
函数名:Key_Scan
入口参数:void
返回值:unsigned char 被按下的键值
函数功能:扫描按键返回被按下的键值
*/
unsigned char Key_Scan(void)
{
unsigned char unKey_Val = 0;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
unKey_Val = 1;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
unKey_Val = 2;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
unKey_Val = 3;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
unKey_Val = 4;
return unKey_Val;
}
三、LCD
此模块用的是官方给的示范代码,只需会用即可。
1.原理图
2.代码
void Lcd_Proc(void)
{
if(uwTick-uwTick_Lcd_Set_Point<100) //减速
return;
uwTick_Lcd_Set_Point = uwTick;
// LCD_Clear(White); //
count++;
sprintf((char *)buf," %d",count);
LCD_DisplayStringLine(Line1,buf); //显示一行字符 Linel0-Line9
}
四、ADC
1.原理图
2.CubeMx配置
3.代码
在adc.c中加入下面的函数:
uint16_t getADC1(void)
{
uint16_t adc = 0;
HAL_ADC_Start(&hadc1);
adc = HAL_ADC_GetValue(&hadc1);
return adc;
}
uint16_t getADC2(void)
{
uint16_t adc = 0;
HAL_ADC_Start(&hadc2);
adc = HAL_ADC_GetValue(&hadc2);
return adc;
}
main.c
void Lcd_Proc(void)
{
if(uwTick-uwTick_Lcd_Set_Point<100) //减速
return;
uwTick_Lcd_Set_Point = uwTick;
// 12位采样,将3.3V电压分成4096份
sprintf((char *)buf," ADC1:%0.3f",(((float)getADC1())/4096)*3.3);
LCD_DisplayStringLine(Line2,buf);
sprintf((char *)buf," ADC2:%0.3f",(((float)getADC2())/4096)*3.3);
}
五、IIC
1.原理图
2. 代码
#include "iic.h"