随便写写。
按键
相关定义
#define k1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define k2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define k3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define k4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
#define key k1 | (k2 << 1) | (k3 << 2) | (k4 << 3) | 0xf0
u8 Tag, Cnt, Up;
void key_read()
{
u8 keydate = (key) ^ 0xff;
Tag = keydate & (keydate ^ Cnt);
Up = ~keydate & (keydate ^ Cnt);
Cnt = keydate;
}
长短键
u8 long_flag = 0,keystate = 0;
bool double_flag = 0;
u32 key_tick = 0;
u32 k1_time = 0,last_time = 0;
void key_proc()
{
if (uwTick - key_tick < 20)
return;
key_tick = uwTick;
key_read();
if (Tag & 0x04)
{
k1_time = uwTick;
if (!long_flag)
long_flag = 2;
}
if ((Cnt & 0x04) && long_flag == 2)
{
if (uwTick - k1_time >= 2000)
{
//长按键
long_flag = 1;
}
}
else if (!(Cnt & 0x04) && long_flag)
{
if (long_flag == 2)
{
//短按键
}
long_flag = 0;
}
}
单双键
if(Tag&0x01){
if(keystate == 0){
last_time = uwTick;
keystate = 1;
}
else if(keystate == 1&&uwTick - last_time <=300){
double_flag = 1;
//双击代码
keystate = 0;
}
}
if(keystate == 1&&uwTick - last_time > 300&&!double_flag){
//单击代码
keystate = 0;
}
double_flag = 0;
//在key_proc()添加
LED
相关定义
void led_disp(u8 led)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, 0xff00, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, led << 8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
使用
u32 led_tick = 0;
u8 led_control;
void led_proc()
{
if (uwTick - led_tick < 100)
return;
led_tick = uwTick;
if (frq > 200 && frq < 400)
led_control ^= 0x01; //闪烁
else
led_control &= ~0x01; //熄灭
if (sec5_flag)
led_control |= 0x02; //亮
else
led_control &= ~0x02;
led_disp(led_control);
}
ADC
float adc = 0;
void adc_proc()
{
HAL_ADC_Start(&hadc2);
adc = HAL_ADC_GetValue(&hadc2) * 3.3f / 4095.0f;
}
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);//main函数添加
捕获频率
u32 frq,value;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
value = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //注意除了开启其余都是htim
__HAL_TIM_SetCounter(htim,0);
frq = 1e6/value;
}
}
RTC
RTC_TimeTypeDef T = {0};
RTC_DateTypeDef D = {0};
void rtc_proc()
{
HAL_RTC_GetTime(&hrtc, &T, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &D, RTC_FORMAT_BIN);
}
//T.
LCD
float lcd_val;
u8 text[20];
u32 lcd_tick = 0;
void lcd_proc()
{
if (uwTick - lcd_tick < 100)
return;
lcd_tick = uwTick;
if (!ui)
{
sprintf((char *)text, " ADC:%3.2f ", adc);
LCD_DisplayStringLine(Line1, text);
sprintf((char *)text, " FRQ:%d ", frq);
LCD_DisplayStringLine(Line2, text);
LCD_DisplayChar(Line5, (320 - (16 * 1)), 'a'); // 显示单个字符
}
if (ui)
{
sprintf((char *)text, " World ");
LCD_DisplayStringLine(Line1, text);
sprintf((char *)text, " D:%d-%d-%d ", D.Year, D.Month, D.Date);
LCD_DisplayStringLine(Line2, text);
sprintf((char *)text, " T:%d-%d-%d ", T.Hours, T.Minutes, T.Seconds);
LCD_DisplayStringLine(Line3, text);
if (!rk_flag)
LCD_SetBackColor(Green);
sprintf((char *)text, " r:%d ", r);
LCD_DisplayStringLine(Line4, text);
LCD_SetBackColor(Black);
if (rk_flag)
LCD_SetBackColor(Green);
sprintf((char *)text, " k:%d ", k);
LCD_DisplayStringLine(Line5, text);
LCD_SetBackColor(Black);
}
}
UART
u8 rx_buf[10], RX_BUF[10], rx_pointer = 0;
u32 uart_tick = 0;
_Bool err_flag = 0, rx_flag = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_flag = 1;
uart_tick = uwTick;
RX_BUF[rx_pointer++] = rx_buf[0];
HAL_UART_Receive_IT(&huart1, (u8 *)rx_buf, 1);
}
char str[10];
int num = 0;
void uart_proc()
{
if (uwTick - uart_tick < 50)
return;
uart_tick = uwTick;
if (rx_flag)
{
rx_flag = 0;
sscanf((char *)RX_BUF, "%2s-%2d", str, &num);
if (rx_pointer == 5 && RX_BUF[2] == '-')
{
printf("Received String: %s, Number: %d\r\n", str, num);
if (!strcmp(str, "AB"))
printf("OK\r\n");
else
printf("NULL\r\n");
}
else
err_flag = 1;
}
if (err_flag)
printf("NULL\r\n");
err_flag = 0;
rx_pointer = 0;
memset(RX_BUF, '\0', sizeof(RX_BUF));
}
HAL_UART_Receive_IT(&huart1, (u8 *)rx_buf, 1);//main
PWM
u32 frq = 0;
u32 pwm_tick = 0;
void pwm_proc(){
if(uwTick - pwm_tick <50) return;
pwm_tick = uwTick;
float frq = 1e6/(TIM17->ARR+1);
if(!pwm_mode){
if(frq>200)
frq-=10;
else
frq = 200;
}
else{
if(frq<400)
frq+=10;
else
frq = 400;
}
TIM17->ARR = 1e6/frq-1;
TIM17->CCR1 = (TIM17->ARR+1)*0.1;//10%占空比
}