#include "STC12C54.H"
#define uchar unsigned char
#define uint unsigned int
#define dataport P1//P1直接驅動數碼管的8個陽極
sbit wei1=P3^3;//再有三個管腳接3個三極管驅動數碼管的陰極
sbit wei2=P3^4;
sbit wei3=P3^5;
sbit key1=P2^0;//根據單片機型號自行定義,有的51單片機無此管腳
sbit key2=P2^1;
uint a=0;//中斷次數計數,壹次10ms,100次為1 秒
//***陰數碼管七段碼
uchar TABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延時子程序
void delay1ms(uint t)
{
uint i,j,k;
for(i=t;i>0;i--)
for(j=15;j>0;j--)
for(k=27;k>0;k--);
}
//顯示子程序
void display(uint n)
{
uchar a1,a2,a3;
a1=n/100%10;
a2=n/10%10;
a3=n%10;
wei1=1;
dataport=0x80|TABLE[a1];//這裏有個小數點
delay1ms(1);
wei1=0;
wei2=1;
dataport=TABLE[a2];
delay1ms(1);
wei2=0;
wei3=1;
dataport=TABLE[a3];
delay1ms(1);
wei3=0;
}
void init(void)
{
TMOD=0X01;
TH0=(655536-10000)/256;//定時10ms
TL0=(655536-10000)%256;
EA=1;
ET0=1;
TR0=1;
P1M0=0;
P1M1=0xff;//P1口設為推挽輸出,驅動能力強
//普通51單片機沒有這類寄存器,去掉這些語句,為保證數碼管亮度
P1要加驅動放大電路,P3口所接三極管放大倍數要大壹些
P3M0=0;
P3M1=0x38;//P3.3P3.4 P3.5口設為推挽輸出
}
void main(void)//主程序
{
init();//初始狀態設定
while(1)
{
if(key1==0)
{
dela1ms(20);
if(key1==0) TR0=0;
.}
if(key2==0)
{
dela1ms(20);
if(key2==0) TR0=0;
.}
display(a);//顯示計數值,以百分之壹秒為單位
}
}
void timer0(void)interrupt 1//中斷子程序
{
TH0=(655536-10000)/256;
TL0=(655536-10000)%256;
a++;
if(a==1000)a=0;//1000次是10秒
}