STM32 HAL库实现数码管显示数字

首先呢,假设你们都已经知道怎么计算数码管显示的数字的字符了。

const uint8_t num_code[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

 这是一个简要的文本。

假如说不知道这些怎么求出来的可以去看别人的博客文章。

那么,stm32应该如何实现打印呢?

一行代码:

HAL_GPIO_WritePin(GPIOA,num_code[3],GPIO_PIN_SET);

这行代码用来显示数字,将GPIO_PIN_SET改为GPIO_PIN_RESET来消除数字。

	HAL_GPIO_WritePin(GPIOA,num_code[3],GPIO_PIN_RESET);

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32 HAL库实现四段共阳数码管动态显示的代码: ```c #include "main.h" #include "stm32f1xx_hal.h" // 数码管共阳极接口,定义数字0-9的数码管段码 const uint8_t DIGITS[10] = { 0b01111110, // 0 0b00110000, // 1 0b01101101, // 2 0b01111001, // 3 0b00110011, // 4 0b01011011, // 5 0b01011111, // 6 0b01110000, // 7 0b01111111, // 8 0b01111011 // 9 }; // 数码管的引脚定义 #define DIGIT1_Pin GPIO_PIN_0 #define DIGIT1_GPIO_Port GPIOA #define DIGIT2_Pin GPIO_PIN_1 #define DIGIT2_GPIO_Port GPIOA #define DIGIT3_Pin GPIO_PIN_2 #define DIGIT3_GPIO_Port GPIOA #define DIGIT4_Pin GPIO_PIN_3 #define DIGIT4_GPIO_Port GPIOA #define SEG_A_Pin GPIO_PIN_4 #define SEG_A_GPIO_Port GPIOA #define SEG_B_Pin GPIO_PIN_5 #define SEG_B_GPIO_Port GPIOA #define SEG_C_Pin GPIO_PIN_6 #define SEG_C_GPIO_Port GPIOA #define SEG_D_Pin GPIO_PIN_7 #define SEG_D_GPIO_Port GPIOA #define SEG_E_Pin GPIO_PIN_8 #define SEG_E_GPIO_Port GPIOA #define SEG_F_Pin GPIO_PIN_9 #define SEG_F_GPIO_Port GPIOA #define SEG_G_Pin GPIO_PIN_10 #define SEG_G_GPIO_Port GPIOA #define SEG_DP_Pin GPIO_PIN_11 #define SEG_DP_GPIO_Port GPIOA // 数码管显示缓存数组,用于存储要显示数字 uint8_t display_buffer[4]; // 数码管显示位置,用于控制哪一个数码管显示 uint8_t display_position = 0; // 定时器回调函数,用于驱动数码管动态显示 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 关闭当前数码管 switch (display_position) { case 0: HAL_GPIO_WritePin(DIGIT1_GPIO_Port, DIGIT1_Pin, GPIO_PIN_SET); break; case 1: HAL_GPIO_WritePin(DIGIT2_GPIO_Port, DIGIT2_Pin, GPIO_PIN_SET); break; case 2: HAL_GPIO_WritePin(DIGIT3_GPIO_Port, DIGIT3_Pin, GPIO_PIN_SET); break; case 3: HAL_GPIO_WritePin(DIGIT4_GPIO_Port, DIGIT4_Pin, GPIO_PIN_SET); break; default: break; } // 显示下一个数字 display_position++; if (display_position > 3) { display_position = 0; } switch (display_position) { case 0: HAL_GPIO_WritePin(DIGIT1_GPIO_Port, DIGIT1_Pin, GPIO_PIN_RESET); break; case 1: HAL_GPIO_WritePin(DIGIT2_GPIO_Port, DIGIT2_Pin, GPIO_PIN_RESET); break; case 2: HAL_GPIO_WritePin(DIGIT3_GPIO_Port, DIGIT3_Pin, GPIO_PIN_RESET); break; case 3: HAL_GPIO_WritePin(DIGIT4_GPIO_Port, DIGIT4_Pin, GPIO_PIN_RESET); break; default: break; } // 显示当前数字 uint8_t digit = display_buffer[display_position]; HAL_GPIO_WritePin(SEG_A_GPIO_Port, SEG_A_Pin, (digit & 0x01) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_B_GPIO_Port, SEG_B_Pin, (digit & 0x02) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_C_GPIO_Port, SEG_C_Pin, (digit & 0x04) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_D_GPIO_Port, SEG_D_Pin, (digit & 0x08) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_E_GPIO_Port, SEG_E_Pin, (digit & 0x10) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_F_GPIO_Port, SEG_F_Pin, (digit & 0x20) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_G_GPIO_Port, SEG_G_Pin, (digit & 0x40) ? GPIO_PIN_RESET : GPIO_PIN_SET); HAL_GPIO_WritePin(SEG_DP_GPIO_Port, SEG_DP_Pin, GPIO_PIN_SET); } int main(void) { HAL_Init(); // 初始化GPIO口 GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStructure.Pin = DIGIT1_Pin | DIGIT2_Pin | DIGIT3_Pin | DIGIT4_Pin; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pin = SEG_A_Pin | SEG_B_Pin | SEG_C_Pin | SEG_D_Pin | SEG_E_Pin | SEG_F_Pin | SEG_G_Pin | SEG_DP_Pin; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化定时器 TIM_HandleTypeDef htim; __HAL_RCC_TIM2_CLK_ENABLE(); htim.Instance = TIM2; htim.Init.Period = 1000; // 定时器周期为1ms htim.Init.Prescaler = 72 - 1; // 定时器预分频系数为72 htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim); HAL_TIM_Base_Start_IT(&htim); while (1) { // 更新显示缓存数组 for (uint8_t i = 0; i < 10; i++) { display_buffer[0] = DIGITS[i]; display_buffer[1] = DIGITS[(i + 1) % 10]; display_buffer[2] = DIGITS[(i + 2) % 10]; display_buffer[3] = DIGITS[(i + 3) % 10]; // 延时,调整显示速度 HAL_Delay(500); } } } ``` 以上代码中,首先定义了数码管共阳极接口和数字0-9的数码管段码。然后定义了数码管引脚的宏定义,以及显示缓存数组和当前显示位置的全局变量。在定时器回调函数`HAL_TIM_PeriodElapsedCallback`中,每隔一定时间切换要显示数码管,并将对应的数字显示数码管上。在主循环中,通过循环更新显示缓存数组,实现数码管动态显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值