stm32f103c8t6与4位数码管
时间: 2024-12-31 08:41:59 浏览: 13
### 使用STM32F103C8T6单片机驱动4位数码管
#### GPIO端口配置
为了使STM32F103C8T6能够成功驱动4位数码管,首先需要正确配置GPIO端口。这涉及到设置用于连接数码管各个段和公共端的引脚为输出模式。
```c
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置PA0~PA7作为数码管段选信号输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO📐⚗⚗
.Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PB0-PB3 作为位选信号输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
```
#### 初始化定时器与中断服务程序
为了让数码管稳定显示而不闪烁,通常采用动态扫描的方式更新每一位上的数值。为此,可以利用硬件定时器来触发定期刷新事件:
```c
// 定义全局变量保存当前要显示的数据缓冲区
uint8_t displayBuffer[4];
void SysTick_Init(u8 ticks) {
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SysTick->LOAD = SystemCoreClock / ticks - 1; // 设置重装载值
SysTick->VAL = 0x00; // 清空计数寄存器
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 外部时钟源
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; // 启用systick
}
void TIM4_IRQHandler(void){
if (TIM_GetITStatus(TIM4,TIM_IT_Update)!= RESET){
static u8 pos=0;
// 关闭TIM4中断标志位
TIM_ClearITPendingBit(TIM4,TIM_FLAG_Update);
// 动态扫描每位数码管
GPIO_WriteByte(GPIOB,(u8)(pos==0?0xEF:(pos==1?0xDF:(pos==2?0xBF:0x7F))));
GPIO_WriteByte(GPIOA,displayBuffer[pos]);
// 更新位置指针
++pos %= 4;
}
}
```
#### 编写段码函数
根据具体使用的数码管型号(共阴极或共阳极),编写相应的转换表将十进制数字映射成对应的七段编码形式:
对于共阳极型数码管而言:
```c
const uint8_t codeTable[]={
0xC0, // '0'
0xF9, // '1'
0xA4, // '2'
0xB0, // '3'
0x99, // '4'
0x92, // '5'
0x82, // '6'
0xF8, // '7'
0x80, // '8'
0x90 // '9'
};
```
#### 主循环逻辑
最后,在主函数中调用上述定义的功能模块,并填充`displayBuffer`数组以指定想要显示的内容即可完成整个过程[^2]。
阅读全文