用keil5stm32f407zgt6用两个单位数码管显示00到99,99之后重新显示00
时间: 2023-05-11 07:07:32 浏览: 146
数码管的0到999的显示
以下是代码示例:
```c
#include "stm32f4xx.h"
// 数码管显示的数字
uint8_t digit[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// 数码管的引脚
uint16_t seg_pin[8] = {
GPIO_Pin_0, // A
GPIO_Pin_1, // B
GPIO_Pin_2, // C
GPIO_Pin_3, // D
GPIO_Pin_4, // E
GPIO_Pin_5, // F
GPIO_Pin_6, // G
GPIO_Pin_7 // DP
};
// 数码管的位选引脚
uint16_t digit_pin[2] = {
GPIO_Pin_8, // 第一位
GPIO_Pin_9 // 第二位
};
// 数码管的位选状态
uint8_t digit_state[2] = {
0, // 第一位
0 // 第二位
};
// 当前显示的数字
uint8_t current_num = 0;
// 数码管显示函数
void display_num(uint8_t num) {
// 分离出十位和个位
uint8_t ten = num / 10;
uint8_t unit = num % 10;
// 设置位选状态
digit_state[0] = 1;
digit_state[1] = 0;
// 显示十位
GPIO_ResetBits(GPIOB, digit_pin[0]);
GPIO_SetBits(GPIOB, digit_pin[1]);
GPIO_Write(GPIOA, digit[ten]);
delay_ms(5);
// 设置位选状态
digit_state[0] = 0;
digit_state[1] = 1;
// 显示个位
GPIO_SetBits(GPIOB, digit_pin[0]);
GPIO_ResetBits(GPIOB, digit_pin[1]);
GPIO_Write(GPIOA, digit[unit]);
delay_ms(5);
}
int main(void) {
// 初始化时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);
// 初始化数码管引脚
GPIO_InitTypeDef GPIO_InitStructure;
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;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化位选引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1) {
// 显示当前数字
display_num(current_num);
// 延时
delay_ms(1000);
// 更新数字
current_num++;
if (current_num >= 100) {
current_num = 0;
}
}
}
// 延时函数
void delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 2000; j++);
}
}
```
这个代码可以让两个单位数码管显示00到99,当显示到99之后,会重新显示00。
阅读全文