帮我用keil写一个stm32f103用数码管显示当前时间的程序,时间间隔两秒一显示
时间: 2023-11-27 19:03:44 浏览: 52
好的,下面是一个简单的使用Keil编写的stm32f103用数码管显示当前时间的程序,时间间隔两秒一显示:
```c
#include "stm32f10x.h"
/* 定义数码管显示的值 */
uint8_t digit[10] = {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 定义变量 */
uint8_t hour = 0;
uint8_t min = 0;
uint8_t sec = 0;
/* 延时函数 */
void delay(uint32_t t)
{
uint32_t i,j;
for (i=0; i<t; i++) {
for (j=0; j<1000; j++);
}
}
/* 数码管显示函数 */
void display(uint8_t d1, uint8_t d2, uint8_t d3)
{
GPIOA->ODR = 0xFFFF;
GPIOB->ODR = digit[d1];
GPIOA->ODR = ~(1<<0);
delay(1);
GPIOA->ODR = 0xFFFF;
GPIOB->ODR = digit[d2];
GPIOA->ODR = ~(1<<1);
delay(1);
GPIOA->ODR = 0xFFFF;
GPIOB->ODR = digit[d3];
GPIOA->ODR = ~(1<<2);
delay(1);
}
/* 主函数 */
int main(void)
{
/* 使能 GPIOA 和 GPIOB 时钟 */
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;
/* 配置 GPIOA 的 PA0、PA1、PA2 为推挽输出 */
GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_MODE1 | GPIO_CRL_MODE2);
GPIOA->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE1_0 | GPIO_CRL_MODE2_0;
GPIOA->CRL &= ~(GPIO_CRL_CNF0 | GPIO_CRL_CNF1 | GPIO_CRL_CNF2);
/* 配置 GPIOB 的 PB0~PB7 为推挽输出 */
GPIOB->CRL &= 0x00000000;
GPIOB->CRL |= 0x33333333;
while(1) {
display(hour/10, hour%10, 10); // 显示小时
display(min/10, min%10, 11); // 显示分钟
display(sec/10, sec%10, 11); // 显示秒钟
delay(2000); // 延时2秒
sec++; // 秒钟加1
if (sec == 60) { // 如果秒钟等于60
sec = 0; // 秒钟清零
min++; // 分钟加1
if (min == 60) { // 如果分钟等于60
min = 0; // 分钟清零
hour++; // 小时加1
if (hour == 24) { // 如果小时等于24
hour = 0; // 小时清零
}
}
}
}
}
```
在这段代码中,我们使用了GPIOA和GPIOB来控制数码管的显示。在 `main` 函数中,我们使用一个无限循环来不断更新时间,并将时间显示在数码管上。在 `display` 函数中,我们使用端口 GPIOA 和 GPIOB 控制数码管的显示。
这段代码仅供参考,具体的实现可能需要根据您的硬件和需求进行调整。