用Stm32103F4R6C8T6的gpioc端口实现,GPIO_SetBits和GPIO_ResetBitS实现0~9的数码管循环点亮
时间: 2024-10-25 21:11:11 浏览: 22
要在STM32F103C8T6上使用GPIOC端口通过GPIO_SetBits和GPIO_ResetBits操作实现0到9的数码管循环点亮,你需要首先配置GPIOC的各个GPIO功能为输出,并将每个数码管的LED连接到相应的GPIO线。以下是一个简单的示例,假设我们使用的是共阳极七段数码管,需要配置10根GPIO线(A-G、小数点):
```c
#include "stm32f10x.h"
// 数码管各段对应GPIO Pin定义
#define LED_PIN_A GPIO_Pin_0
#define LED_PIN_B GPIO_Pin_1
#define LED_PIN_C GPIO_Pin_2
#define LED_PIN_D GPIO_Pin_3
#define LED_PIN_E GPIO_Pin_4
#define LED_PIN_F GPIO_Pin_5
#define LED_PIN_G GPIO_Pin_6
#define LED_PIN_DP GPIO_Pin_7
// 数码管代码对应的二进制位
const uint8_t digit_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void Delay(__IO uint32_t nCount)
{
while(nCount-- > 0);
}
void SetDigit(uint8_t digit)
{
// 确保只更新改变的部分
GPIO_ResetBits(GPIOC, 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线高
for (uint8_t i = 0; i < 8; ++i)
{
if (digit_code[digit] >> i & 1)
{
GPIO_SetBits(GPIOC, LED_PIN_A << i);
}
}
// 如果有小数点,则显示
if (digit >= 10 && digit <= 15)
{
GPIO_SetBits(GPIOC, digit_code[digit - 10]);
}
else
{
GPIO_ResetBits(GPIOC, LED_PIN_DP);
}
}
int main(void)
{
// 初始化GPIOC为推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN_A | LED_PIN_B | LED_PIN_C | LED_PIN_D | LED_PIN_E | LED_PIN_F | LED_PIN_G | LED_PIN_DP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
for (uint8_t digit = 0; digit < 10; ++digit)
{
SetDigit(digit);
Delay(100); // 点亮每个数字100ms
}
}
}
```
阅读全文