|

- 威望
- 25
- 金钱
- 52
- 在线时间
- 5 小时
- 最后登录
- 2009-6-30
|
#include "reg52.h"
#define THCO 0xee
#define TLCO 0x0
unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Data_Buffer[4]={0,0,0,0,};
sbit P10=P1^0; //数码管位码口定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit LED1=P2^3; //LED灯的定义
sbit LED2=P2^4;
sbit LED3=P2^5;
sbit LED4=P2^6;
sbit P20=P2^0; //按键的定义
sbit P21=P2^1;
sbit P22=P2^2;
sbit P32=P3^2;
sbit louder=P1^4; //蜂鸣器的定义
bit flag=0; //标志的定义
bit start=1;
int f=0;
unsigned char Msec=0;//静态变量的定义
unsigned char Sec=0;
unsigned char Min=0;
unsigned char Hour=0;
unsigned char Count=0;
unsigned char Count1=0;
unsigned char Bit=0;
unsigned char mode=0;
unsigned char record=0;
unsigned char show=0;
unsigned char show1=0;
unsigned char mask[3][4]; //子函数声明
void rember();
void display();
void stop();
void delay();
void main() //主函数
{
louder=1;
TMOD=0x11; //定时器初始化,5ms定时
TH0=THCO;
TL0=TLCO;
TR0=1; //外部中断0,边沿触发方式
ET0=1;
EA=1;
while(1)
{
if(f==1)
{
louder=!louder;LED1=!LED1; delay(); LED1=1;
}
if(f==2)
{
louder=!louder; delay();LED2=!LED2; delay();LED2=1;
}
if(f==3)
{
louder=!louder; LED3=!LED3;delay(); LED3=1;
}
if (start==1)
if (show==0)
{
if(mode==0)
{
Data_Buffer[0]=Sec/10;
Data_Buffer[1]=Sec%10;
Data_Buffer[2]=Msec/10;
Data_Buffer[3]=Msec%10;
}
if(mode==1)
{
Data_Buffer[0]=Min/10;
Data_Buffer[1]=Min%10;
Data_Buffer[2]=Sec/10;
Data_Buffer[3]=Sec%10;
}
if(mode==2)
{
Data_Buffer[0]=Hour/10;
Data_Buffer[1]=Hour%10;
Data_Buffer[2]=Min/10;
Data_Buffer[3]=Min%10;
}
}
}
}
void timer0() interrupt 1
{
TH0=THCO;
TL0=TLCO;
P1=0X1F;
Count++;
Bit++;
if(Bit>=4)Bit=0;
switch(Bit)
{
case 0: P10=0;break;
case 1: P11=0;break;
case 2: P12=0;break;
case 3: P13=0;break;
}
if(Bit==1&&flag==1)
P0=0x80|Duan[Data_Buffer[Bit]]; //小数点的输出
else P0=Duan[Data_Buffer[Bit]];
if(Count%100==0)flag=!flag;
if(Count%2==0)Msec++; //跑秒计算
if(Count==200) //秒计算
{
Count=0;
Msec=0;
Sec++;
}
if(Sec==60) //分的计算
{
Sec=0;
Min++;
}
if(Min==60) //小时的计算
{
Min=0;
Hour++;
}
if(Hour==24)Hour=0;
if (P20==0||P21==0||P22==0||P32==0) //判断是否有键按下
{
Count1++;
if(Count1>=60)
{
Count1=0;
if(P20==0)
{
mode++; if(mode==3) mode=0;
}
else if (P21==0) rember();
else if (P22==0) display();
else if (P32==0) stop();
}
}
}
void rember() //记录子函数
{ record++;
if(record==4)record=0;
else if( record==1)
{ LED1=!LED1;LED1=1;
mask[0][0]=Sec/10;
mask[0][1]=Sec%10;
mask[0][2]=Msec/10;
mask[0][3]=Msec%10;
}
else if(record==2)
{ LED2=!LED2;LED2=1;
mask[1][0]=Sec/10;
mask[1][1]=Sec%10;
mask[1][2]=Msec/10;
mask[1][3]=Msec%10;
}
else if(record==3)
{ LED3=!LED3;LED3=1;
mask[2][0]=Sec/10;
mask[2][1]=Sec%10;
mask[2][2]=Msec/10;
mask[2][3]=Msec%10;
}
}
void display() //显示子函数
{
show++;
switch(show)
{
case 1: Data_Buffer[0]=mask[0][0];
Data_Buffer[1]=mask[0][1];
Data_Buffer[2]=mask[0][2];
Data_Buffer[3]=mask[0][3];
f=1;break;
case 2: Data_Buffer[0]=mask[1][0];
Data_Buffer[1]=mask[1][1];
Data_Buffer[2]=mask[1][2];
Data_Buffer[3]=mask[1][3];
f=2;break;
case 3: Data_Buffer[0]=mask[2][0];
Data_Buffer[1]=mask[2][1];
Data_Buffer[2]=mask[2][2];
Data_Buffer[3]=mask[2][3];
f=3;break;
case 4: Msec=0;Sec=0;
Data_Buffer[0]=Sec/10;
Data_Buffer[1]=Sec%10;
Data_Buffer[2]=Msec/10;
Data_Buffer[3]=Msec%10;
f=0;louder=0;break;
}
if(show==5)show=0;
}
void stop()
{
start=!start;
}
void delay()
{
int i=0;
for(;i<=25;i++);
} |
|