|
#include <reg51.h>
#include <intrins.h>
unsigned char ledcode []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//数码管码
unsigned int sec,ms10;
unsigned int mode=0;
unsigned char i;
unsigned char tab[4];
unsigned char wei[4]={0xfe,0xfd,0xfb,0xf7,};
sbit dula=P2^6;
sbit weila=P2^7;
sbit P23=P2^3;//
sbit P37=P3^7;//按键
void delay(unsigned int z)//延时
{
unsigned int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
void TIM0_INT(void) interrupt 1//定时器0中断 10MS
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ms10=ms10+1;
if(ms10>100)//1s
{
sec=sec+1;
ms10=0;
if((sec%10)==0)// 每10MS
{
P23=0;
delay(50);
P23=1;
}
}
}
void keyscan()
{
if(P37==0)
{
delay(10);
if(P37==0)
{
if(mode==0)
{
TR0=1;//启动
}
if(mode==1)
{
TR1=0;//停止
}
if(mode==2)//清零
{
sec=0;
ms10=0;
}
mode++;
if(mode>=3)//第4次按回0
mode=0;
while(P37==0);
}
}
}
void zhuanhuan()//先转换好对应的段码
{
tab[0]=ledcode[sec/10%10];
tab[1]=ledcode[sec%10]|0X80;
tab[2]=ledcode[ms10/10%10];
tab[3]=ledcode[ms10%10];
}
void showseg()
{
for(i=0;i<4;i++)//4位数码管动态显示程序
{
P0=tab[i];
dula=1;
dula=0;
P0=wei[i];
weila=1;
weila=0;
delay(5);
}
}
void main()// 主程序
{
TMOD=0x01;//工作模式设置
TH0=(65536-10000)/256;//10MS定时
TL0=(65536-10000)%256;
ET0=1;
EA=1;
while(1) //循环
{
keyscan();//按键检测
zhuanhuan();//转换好对应的段码
showseg();//扫描数码管
}
}
|
|