由于你把P1.7用作位選,P1.0~1.6作段選,送段碼時操作P1必須保持P1.7狀態不變。給你改成0~99秒計數示例程序。
無標題.jpg (117.65 KB, 下載次數: 73)
下載附件
2019-1-7 14:40 上傳
#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;//動態掃描數碼管顯示
}
}
|