STM32入门——七段数码管显示篇_按键控制数字加减(优化)

开发平台:STM32codeMX、keil5

仿真平台:proteus 8.15

芯片型号:STM32F103C8T6

第一个项目:共阳极七段数码管按键K1控制数字加一,K2控制数字减一

原理图:电阻为1K

1、新建工程:打开STM32codeMX——新建工程(File-New project)——选择STM32F103C8T6芯片。

2、配置端口:配置RCC(HSE与LSE(按照原理图配置如果没有两个都选第三个))——配置System Core(sys--Debug(serial Wire))——选择Pinout view(PA0—PA7与PB0、PB1设置位为GPIO-output)(PB2、PB10设置为GPIO-input)——点击左边GPIO依次命名A、B、C、D、E、F、G、DP、K1、K2,PB2与PB10选择GPIO Pull up/Pull down的Pull up(上拉模式)

3、工程保存:project manager—project Name(LED)—project Location(选择自己存放放的文件夹)—Tolchan/IDE(MDK—ARM)—min version(V5)—勾选Code generator(Cody only the necessary library files)——勾选Generate peripheral initalization as a pair of .c/.h....—点击GENERATE CODE。

4、打开刚刚新建的工程。

5、编写程序:

创建.C与,H文件

主函数while里面用这个

因为写的有点bug,参照了b站Black 黑先森的

首先,需要初始化GPIO口作为数字输出,以及作为按键输入。可以使用STM32CubeMX进行配置,或者手动编写代码。 接着,需要编写一个函数来检测按键输入,并根据按键输入的值,切换数码显示的位数。例如,可以使用一个变量来存储当前显示数码管位数,每次按下切换按键后,将该变量加1或减1,并根据新的值更新数码管的显示。 以下是一个示例代码: ``` #include "stm32f1xx.h" #include "stm32f1xx_hal.h" #define DIGIT_GPIO GPIOA #define DIGIT_PIN1 GPIO_PIN_0 #define DIGIT_PIN2 GPIO_PIN_1 #define DIGIT_PIN3 GPIO_PIN_2 #define DIGIT_PIN4 GPIO_PIN_3 #define KEY_GPIO GPIOB #define KEY_PIN GPIO_PIN_0 int digit = 1; // 当前显示数码管位数 void init_gpio(void) { // 数码管GPIO初始化 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DIGIT_PIN1 | DIGIT_PIN2 | DIGIT_PIN3 | DIGIT_PIN4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DIGIT_GPIO, &GPIO_InitStruct); // 按键GPIO初始化 GPIO_InitStruct.Pin = KEY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; // 使用上拉电阻 HAL_GPIO_Init(KEY_GPIO, &GPIO_InitStruct); } void update_display(void) { // 根据当前显示数码管位数,更新数码管的显示 switch (digit) { case 1: HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN1, GPIO_PIN_RESET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN2, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN3, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN4, GPIO_PIN_SET); // TODO: 更新数码管1的显示 break; case 2: HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN2, GPIO_PIN_RESET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN3, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN4, GPIO_PIN_SET); // TODO: 更新数码管2的显示 break; case 3: HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN2, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN3, GPIO_PIN_RESET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN4, GPIO_PIN_SET); // TODO: 更新数码管3的显示 break; case 4: HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN2, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN3, GPIO_PIN_SET); HAL_GPIO_WritePin(DIGIT_GPIO, DIGIT_PIN4, GPIO_PIN_RESET); // TODO: 更新数码管4的显示 break; } } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == KEY_PIN) { // 按键被按下,切换数码管位数 digit++; if (digit > 4) { digit = 1; } update_display(); } } int main(void) { HAL_Init(); init_gpio(); update_display(); while (1); } ``` 在上面的示例代码中,我们使用了一个外部中断回调函数(HAL_GPIO_EXTI_Callback)来检测按键输入。当按键被按下时,回调函数会被调用,并且切换数码显示的位数。update_display函数根据当前显示数码管位数,更新数码管的显示。在实际应用中,需要根据具体的数码型号显示模式,编写相应的代码来更新数码管的显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值