数码管显示分-秒-毫秒
S5清零 S4暂停/启动
#include "reg52.h"
void delay(int n)
{
while(n--)
{}
}
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0xbf,0x7f};//01234567 89ABCDEF -.
void Init_Hc138(int n) //译码器选择
{
switch (n)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break; //让Y4输出低电平
case 5:
P2=(P2 & 0x1f) | 0xa0;
break; //让Y5输出低电平
case 6:
P2=(P2 & 0x1f) | 0xc0;
break; //让Y6输出低电平
case 7:
P2=(P2 & 0x1f) | 0xe0;
break; //让Y7输出低电平
}
}
void Output_P0(unsigned char channel,unsigned char dat)
{
Init_Hc138(channel);
P0=dat; //P0口输出数据
}
void show_smg(unsigned char pos,unsigned char val)
{
Output_P0(6,0x01<<pos);
Output_P0(7,SMG_duanma[val]);
delay(500);
}
unsigned char flag,sec=0,min=0,count=0;
//定时器0
void init_timer0()
{
TMOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256; // 50ms
ET0 = 1;//定时器0开关
TR0 = 1;//定时器0启动位
EA = 1; //总开关
}
void service_timer0() interrupt 1
{
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
count++;
if (count==20)
{
count=0;
sec++;
if (sec==60)
{
min++;
sec=0;
}
}
}
//中断0 S5
void init_INT0()
{
IT0 = 0; //下降沿触发
EX0 = 1; //打开中断0
EA = 1; //打开总开关
}
void service_INT0() interrupt 0
{
count=sec=min=0;
}
//中断1 S4
void init_INT1()
{
IT1 = 1; //下降沿触发
EX1 = 1; //打开中断0
EA = 1; //打开总开关
}
void service_INT1() interrupt 2
{
TR0=~TR0;
}
void main()
{
Output_P0(5,0x00);//关闭蜂鸣器
init_timer0();
init_INT0();
init_INT1();
while(1)
{
show_smg(0,min/10);
show_smg(1,min%10);
show_smg(2,16);
show_smg(3,sec/10);
show_smg(4,sec%10);
show_smg(5,16);
show_smg(6,count/10);
show_smg(7,count%10);
}
}