- 打卡等级:以坛为家I
- 打卡总天数:341
- 最近打卡:2026-05-29 21:10:38
已绑定手机
金牌会员
- 积分
- 1025
|
发表于 2026-5-16 18:01:40
|
显示全部楼层
今天完成了动态数码管显示
#include <STC89C5xRC.H>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
char bled = 0;
// 定时器中断相关变量
unsigned char timer0_count = 0; // 中断计数器
bit timer0_flag = 0; // 100次中断标志位
// 函数原型声明
void led(unsigned char state);
void Timer0_Init(void);
long num = 0;
unsigned char i=0;
// 数码管段码表(共阴极,带小数点)
// 0-F的段码,bit0=DP, bit1=a, bit2=b, bit3=c, bit4=d, bit5=e, bit6=f, bit7=g
unsigned char code SEG_TABLE[] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // A
0x83, // B
0xC6, // C
0xA1, // D
0x86, // E
0x8E // F
};
// 显示缓冲区,存放要显示的数字(0-15对应0-F)
unsigned char disp_buf[6] = {0, 1, 2, 3, 4, 5};
// 延时函数
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
//LED位函数
void led(unsigned char state)
{
ADDR0 = state & 0x01;
ADDR1 = state & 0x02;
ADDR2 = state & 0x04;
}
void main(void)
{
ENLED = 0;
ADDR3 = 1;
Timer0_Init(); // 初始化定时器0
EA = 1; // 开启全局中断
while(1)
{
// 检测标志位并处理
disp_buf[0] = num % 10;
disp_buf[1] = num / 10 % 10;
disp_buf[2] = num / 100 % 10;
disp_buf[3] = num / 1000 % 10;
disp_buf[4] = num / 10000 % 10;
disp_buf[5] = num / 100000 % 10;
}
}
void Timer0_Isr(void) interrupt 1
{
static int t1scnt = 0;
// 重新加载定时器初值
TL0 = 0xAE;
TH0 = 0xFB;
// 中断计数
timer0_count++;
// 每100次中断设置标志位
if(timer0_count >= 10)
{
timer0_count = 0; // 清零计数器
timer0_flag = 1; // 设置标志位
}
if(timer0_flag)
{
t1scnt++;
if(t1scnt >= 100)
{
t1scnt = 0;
num++;
}
timer0_flag = 0; // 清除标志位
P2 = 0xFF;//关闭所有数码管
led(i);
P0 = SEG_TABLE[disp_buf[i]];
i++;
if(i>=6)
{
i=0;
}
}
}
void Timer0_Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
|
|