由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序。
#include<reg51.h>
#define uchar unsigned char
sbit SEDB = P1^0;
sbit SEDA = P1^1;
sbit SEDF = P1^2;
sbit SEDG = P1^3;
sbit SEDD = P1^4;
sbit SEDE = P1^5;
sbit SEDC = P1^6;//控制数码管显示数字
sbit COM0 = P1^7;
sbit COM1 = P2^4;//控制数码管位
uchar LEDCode[]={
0x77, // 0
0x41, // 1
0x3b, // 2
0x5b, // 3
0x4d, // 4
0x5e, // 5
0x7e, // 6
0x43, // 7
0x7f, // 8
0x5f, // 9
0x6f, // A
0x7c, // B
0x36, // C
0x79, // D
0x3e, // E
0x2e, // F};//数码管真值表
};
/***********定时器初始化程序****************/
void Timer0Init(void) //10毫秒@11.0592MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void main()
{
Timer0Init(); //定时器初始化
while(1);
}
void zhuangduan()interrupt 1//中断函数
{
static uchar i,j,num;
TL0 = 0x00;
TH0 = 0xDC; //10ms
j++;
if(j>=100)
{
j=0;
num++;
if(num>99)
num=0;
}
i++;
if(i>=2) i=0;//看数码管个数决定i的值
P1&=0x80;//消隐,保留P1.7状态不变
switch (i)
{
case 0: COM0=0;COM1=1;P1|=LEDCode[num/10];break;//十位
case 1: COM0=1;COM1=0;P1|=LEDCode[num%10];break;//个位
default:break;//动态扫描数码管显示
}
}
|