iostm8s103k3.h数码管倒计时
时间: 2023-11-03 08:07:30 浏览: 87
以下是基于STM8S103K3芯片的4位共阴数码管倒计时程序:
```c
#include "iostm8s103k3.h"
#include <intrinsics.h>
#define SEG_A (1<<1)
#define SEG_B (1<<2)
#define SEG_C (1<<3)
#define SEG_D (1<<4)
#define SEG_E (1<<5)
#define SEG_F (1<<6)
#define SEG_G (1<<7)
#define SEG_DP (1<<0)
#define DIG_1 (1<<4)
#define DIG_2 (1<<5)
#define DIG_3 (1<<6)
#define DIG_4 (1<<7)
unsigned char disp_data[4] = {0, 0, 0, 0}; // 数码管显示数据
unsigned char disp_index = 0; // 当前显位
unsigned char time_count = 0; // 时间计数器
unsigned char sec_count = 0; // 秒计数器
unsigned char min_count = 0; // 分计数器
// 数码管段码表
const unsigned char seg_table[10] = {
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // 0
SEG_B | SEG_C, // 1
SEG_A | SEG_B | SEG_D | SEG_E | SEG_G, // 2
SEG_A | SEG_B | SEG_C | SEG_D | SEG_G, // 3
SEG_B | SEG_C | SEG_F | SEG_G, // 4
SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // 5
SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 6
SEG_A | SEG_B | SEG_C, // 7
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 8
SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G // 9
};
// 延时函数
void delay(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1000;j++);
}
}
// 数码管显示函数
void display()
{
unsigned char seg_data = 0;
unsigned char dig_data = 0;
// 扫描位选择
switch (disp_index) {
case 0: dig_data = DIG_1; break;
case 1: dig_data = DIG_2; break;
case 2: dig_data = DIG_3; break;
case 3: dig_data = DIG_4; break;
}
// 段码选择
seg_data = seg_table[disp_data[disp_index]];
// 数码管显示
PD_ODR = seg_data;
PB_ODR = dig_data;
// 显示位索引递增
disp_index++;
// 显示完毕,重新从第一位开始
if (disp_index > 3) {
disp_index = 0;
}
}
// 定时器中断处理函数
#pragma vector=TIM2_OVR_UIF_vector
__interrupt void TIM2_ISR(void)
{
TIM2_SR &= ~TIM2_SR_UIF; // 清除中断标志位
time_count++;
// 每100ms更新一次数码管显示
if (time_count >= 10) {
time_count = 0;
// 秒计数器递增
sec_count++;
// 60秒一轮
if (sec_count >= 60) {
sec_count = 0;
// 分计数器递增
min_count++;
}
// 60分钟一轮
if (min_count >= 60) {
min_count = 0;
}
// 更新数码管显示数据
disp_data[0] = min_count / 10;
disp_data[1] = min_count % 10;
disp_data[2] = sec_count / 10;
disp_data[3] = sec_count % 10;
// 数码管显示
display();
}
}
void main()
{
CLK_CKDIVR = 0x00; // 系统时钟分频比为1
// 数码管控制引脚初始化
PB_DDR |= 0xF0;
PB_CR1 |= 0xF0;
PB_CR2 |= 0xF0;
PD_DDR |= 0xFF;
PD_CR1 |= 0xFF;
PD_CR2 |= 0xFF;
// 定时器2初始化,定时周期为1ms
TIM2_CR1 = 0x01;
TIM2_PSCR = 0x07;
TIM2_ARRH = 0x00;
TIM2_ARRL = 0x9F;
TIM2_IER = 0x01;
__enable_interrupt();
while(1);
}
```
该程序使用了定时器中断来实现数码管的显示和倒计时功能,每隔100ms更新一次数码管显示数据。程序中使用了4个变量来分别记录时间计数器、秒计数器、分计数器和数码管显示数据,其中数码管显示数据用一个长度为4的数组来保存,每位对应一个数码管。在每次定时器中断处理函数中,时间计数器递增,同时更新数码管显示数据,然后调用数码管显示函数进行显示。在数码管显示函数中,首先根据当前显示位选择扫描位,然后根据数码管显示数据选择对应的段码,最后在对应的控制引脚上输出高电平来点亮数码管。
阅读全文