好久没有学习了,自己独立写了可以独立移植的数码管程序
#include<stc12c5a60s2.h>
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
unsigned char T0RH = 0; //T0重载值的高字节
unsigned char T0RL = 0; //T0重载值的低字节
unsigned char code LedChar[] = { //共阳极数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned int cnt = 0; //记录 T0 中断次数
unsigned char flag1s = 0; //1 秒定时标志
unsigned int c = 0; //定义循环变量 C,用于软件延时
unsigned char cnt1 = 0; //定义计数变量 cnt1,用于移位控制
void LedScan();
void ConTimer0(unsigned int ms);
void main()
{
unsigned long sec = 0; //记录经过的秒数
EA = 1; //使能总中断,启动。
ENLED = 0; //74CH245数码管导通
ConTimer0(1);
while (1)
{
if (flag1s == 1) //判断 1 秒定时标志
{
flag1s = 0; //1 秒定时标志清零
sec++; //计数值自加 1
//以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量
tmp = 32000000/12; //定时器计数频率 ,,,设为1T可以不除12
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 18; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
AUXR=0x00;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
cnt++; //中断次数计数值加 1
if (cnt >= 1000) //中断 1000 次即 1 秒
{
cnt = 0; //清零计数值以重新开始下 1 秒计时
flag1s = 1; //设置 1 秒定时标志为 1
}
LedScan();//以数码管动态扫描刷新
}
//数码管动态扫描
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF; //用于消隐
P2 = (P2 & 0xF8) | i;
P0 = LedBuff[i];
if (i < 5)
i++;
else
i = 0;
}
但是数码管是靠左显示的,想了好久还是不可以靠右显示,,,求大佬帮忙
|