【代码】
#include <stm32f10x.h>
#define _BV(n) (1 << (n))
uint32_t n = 12345678;
uint8_t segdisp[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 共阳数码管段码表,取反后就是共阴的段码
void delay()
{
int i;
for (i = 0; i < 2500; i++);
}
void init()
{
int i;
RCC->APB2ENR |= _BV(2) | _BV(3); // 打开GPIOA和GPIOB的时钟
// 把PA0~7都设置为输出模式(速率50MHz)
for (i = 0; i < 8; i++)
{
GPIOA->CRL |= _BV(4 * i + 1);
GPIOA->CRL |= _BV(4 * i);
}
// 把PB8~15都设置为输出模式
for (i = 0; i < 8; i++)
{
GPIOB->CRH |= _BV(4 * i + 1);
GPIOB->CRH |= _BV(4 * i);
}
}
int main()
{
init();
while (1)
{
GPIOB->ODR = ~segdisp[n % 10] << 8;
GPIOA->ODR = ~_BV(7);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 100 / 10] << 8;
GPIOA->ODR = ~_BV(6);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 1000 / 100] << 8;
GPIOA->ODR = ~_BV(5);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 10000 / 1000] << 8;
GPIOA->ODR = ~_BV(4);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 100000 / 10000] << 8;
GPIOA->ODR = ~_BV(3);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 1000000 / 100000] << 8;
GPIOA->ODR = ~_BV(2);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n % 10000000 / 1000000] << 8;
GPIOA->ODR = ~_BV(1);
delay();
GPIOA->ODR = 0;
GPIOB->ODR = ~segdisp[n / 10000000] << 8;
GPIOA->ODR = ~_BV(0);
delay();
GPIOA->ODR = 0;
}
}
void SystemInit()
{
}