目錄
- 一、LED
- 1、原理圖介紹
- 2、程序代碼
- 二、按鍵
- 1、原理圖介紹
- 2、程序代碼
- 三、LCD
- 1、原理圖介紹
- 2、程序代碼
一、LED
1、原理圖介紹
??如果所示,STM32G431RBT6中有八個LED,由八個GPIO控制,分別為PC8-15,當輸出為低電平時點亮。其中,74HC573(U1)表示為鎖存器,當鎖存器打開的時候,右側GPIO的輸出(即鎖存器的輸入D)可以通過鎖存器到達左側(即鎖存器的輸出Q)。加鎖存器的目的是由于PC8-15引腳有復用功能,當作為其他功能使用時,防止影響LED。
??74HC573芯片內部結構圖如下圖所示,LE引腳高電平有效,OE則低電平有效。在上面圖中,OE已經接地,所以PD2控制的LE輸入為高電平時鎖存器打開,低電平時鎖存器關閉。
2、程序代碼
// led.h
#ifndef __LED_H__
#define __LED_H__extern void LED_Init(void);
extern void LED_Disp(unsigned char uch);
extern void LED_Tog(unsigned char uch);#endif
// led.c
#include "led.h"
#include "main.h"void LED_Init(void)
{//此處省略 CUBEMX自動生成代碼
}
void LED_Disp(unsigned char uch)
{// 先將八個LED置為高電平,熄滅,然后鎖存器打開關閉HAL_GPIO_WritePin(GPIOC, 0xff << 8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);// 將uch8中為1的bit位點亮,然后鎖存器打開關閉HAL_GPIO_WritePin(GPIOC, uch << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}void LED_Tog(unsigned char uch)
{// 將uch8中為1的bit位反轉HAL_GPIO_TogglePin(GPIOC, uch << 8);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
// main.c
#include "main.h"
#include "led.h"void SystemClock_Config(void);// 示例代碼
int main(void)
{HAL_Init();SystemClock_Config();LED_Init();while (1){LED_Disp(0xaa);HAL_Delay(2000);LED_Tog(0x03);HAL_Delay(2000);LED_Tog(0xff);HAL_Delay(2000);}
}
二、按鍵
1、原理圖介紹
??如果所示,STM32G431RBT6中有4個按鍵,由4個GPIO控制,分別為PB0、PB1、PB2和PA0,當按鍵按下時GPOIO為低電平。
2、程序代碼
編寫程序有三步:
- 在key.c中編寫key_scan函數,返回哪個按鍵被按下;
- 定義變量:嘀嗒定時器開始值,四個key變量(unsigned char);
- 在main.c中編寫key_proc函數,經典四行:
key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;
以下是完整程序代碼:
// key.h
#ifndef __KEY_H__
#define __KEY_H__extern void KEY_Init(void);
extern unsigned char KEY_Scan(void);#endif
// key.c
#include "key.h"
#include "main.h"void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pins : PB0 PB1 PB2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}unsigned char KEY_Scan()
{unsigned char key_num = 0;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 1;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){key_num = 2;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET){key_num = 3;}else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 4;}else{key_num = 0;}return key_num;
}
// main.c
#include "main.h"
#include "led.h"
#include "key.h"//定義變量
__IO uint32_t uwTick_start;
unsigned char key_val, key_down, key_up, key_old;//定義函數
void SystemClock_Config(void);
void key_proc(void);int main(void)
{HAL_Init();SystemClock_Config();LED_Init();KEY_Init();while (1){key_proc();}
}void key_proc(void)
{//按鍵消抖if(uwTick - uwTick_start < 100) return;uwTick_start = uwTick;//四行key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;//正式程序if(key_down == 4){LED_Tog(0xff);}if(key_down == 1)LED_Disp(0x00);}
三、LCD
1、原理圖介紹
2、程序代碼
?? 只需要將原有程序進行遷移即可。下面sprintf作用是:將key_num的值寫入lcd-disp,然后將lcd_disp強轉為(u8 *)進行顯示。
char lcd_disp[21];sprintf(lcd_disp, " i num: %03d ", key_num);
LCD_DisplayStringLine(Line4, (u8 *)lcd_disp);