用keil 写“数码管循环显示0到9”
时间: 2024-02-23 18:58:56 浏览: 138
这里提供一个使用Keil编写的STM32单片机程序,实现数码管循环显示0到9的功能。该程序使用了STM32F103C8T6开发板和共阴极数码管,使用了定时器中断和位移寄存器来控制数码管的显示。
```
#include "stm32f10x.h"
// 数码管位移寄存器
uint8_t LED_CODE[10] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
// 定时器2中断服务函数
void TIM2_IRQHandler(void)
{
static uint8_t num = 0;
uint8_t code = LED_CODE[num];
GPIOA->ODR = code << 8;
num++;
if(num >= 10)
{
num = 0;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
int main(void)
{
// 使能外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置定时器2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000; // 定时器周期为1ms
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 分频系数为7200,时钟频率为10kHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 使能定时器2中断
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// 启动定时器2
TIM_Cmd(TIM2, ENABLE);
while(1);
}
```
该程序中,使用了一个`LED_CODE`数组来存储0到9的数字对应的位移寄存器值。在定时器2中断服务函数中,通过位移寄存器将数字显示在数码管上,每次中断结束后`num`的值加1,如果`num`的值等于10,则将其重置为0,以实现循环显示0到9的功能。最后,使用`while`循环让程序保持运行状态。