用C语言给stm8s103k3写一个数码管一位5秒倒计时
时间: 2024-04-30 16:20:37 浏览: 158
以下是使用C语言编写的stm8s103k3单片机的数码管一位5秒倒计时的代码:
```c
#include <stm8s.h>
#define LED_PORT GPIOD
#define LED_PIN GPIO_PIN_0
void delay_ms(uint16_t ms) {
uint16_t i;
while (ms--) {
for (i = 0; i < 1000; i++);
}
}
void display_digit(uint8_t digit) {
GPIO_WriteHigh(LED_PORT, LED_PIN); // 使LED亮起
switch (digit) {
case 0:
GPIO_WriteHigh(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 1:
GPIO_WriteLow(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 2:
GPIO_WriteHigh(GPIOD, GPIO_PIN_4);
GPIO_WriteLow(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 3:
GPIO_WriteLow(GPIOD, GPIO_PIN_4);
GPIO_WriteLow(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 4:
GPIO_WriteHigh(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteLow(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 5:
GPIO_WriteLow(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteLow(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 6:
GPIO_WriteHigh(GPIOD, GPIO_PIN_4);
GPIO_WriteLow(GPIOD, GPIO_PIN_5);
GPIO_WriteLow(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 7:
GPIO_WriteLow(GPIOD, GPIO_PIN_4);
GPIO_WriteLow(GPIOD, GPIO_PIN_5);
GPIO_WriteLow(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 8:
GPIO_WriteHigh(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
case 9:
GPIO_WriteLow(GPIOD, GPIO_PIN_4);
GPIO_WriteHigh(GPIOD, GPIO_PIN_5);
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
GPIO_WriteHigh(GPIOD, GPIO_PIN_7);
break;
}
delay_ms(1000); // 延时1秒
GPIO_WriteLow(LED_PORT, LED_PIN); // 使LED灭掉
}
int main() {
CLK_DeInit();
CLK_HSECmd(DISABLE);
CLK_LSICmd(ENABLE);
while(CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == FALSE);
CLK_ClockSwitchCmd(ENABLE);
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
GPIO_DeInit(LED_PORT);
GPIO_Init(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);
uint8_t i = 5;
while (i > 0) {
display_digit(i);
i--;
}
while (1);
return 0;
}
```
说明:
1. `delay_ms()` 函数用于延时指定的毫秒数,这里使用了一个简单的循环来实现。
2. `display_digit()` 函数用于在数码管上显示指定的数字,其中根据数字的不同,设置不同的端口状态,从而实现数码管的显示。
3. `main()` 函数中,首先初始化了系统时钟和端口,然后使用 `display_digit()` 函数从5到1倒计时,最后进入一个死循环。
阅读全文