#include

#include

//****************************宏定义********************************

typedef unsigned char uchar;

typedef unsigned int  uint;

//****************************位声明********************************

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

sbit key4=P1^3;

sbit beep=P3^0;

//************************数码管显示的数值**************************

uchar code table[]=        {

0x3f,0x06,0x5b,0x4f,0x66,0x6d,

0x7d,0x07,0x7f,0x6f,0x40,0x00

};

//****************************函数声明******************************

void jia();

void jian();

//********************数组定义,数组内含有8个数值******************

uchar table1[8],table2[8],table3[8],table4[8];

//**************************时间显示初始值**************************

uchar shi=12,fen=0,miao=0;

//**************************定义全局变量****************************

uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;

uchar shi4,fen4,miao4;

uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;

//    1秒   等时  位闪 次数 校时   闹1  闹2   闹3

uint flag2;

//   蜂鸣

//*********************延时函数,用于动态扫描数码管*****************

void delay(uchar i)

{

uchar x,y;

for(x=i;x>0;x--)

for(y=120;y>0;y--);

}

//*******************************初始化函数*************************

void init()

{

TMOD=0x01;         //工作方式1

TH0=0x3c;          //定时时间为:50ms        (65536-50000)/256

TL0=0x0b0;         //(65536-50000)%256

EA=1;              //开总中断

ET0=1;             //打开定时器

TR0=1;             //启动定时器

beep=0;

}

//********************显示子函数,用于显示时间数值*****************

void display()

{

uchar i,j;

if(cnt!=10||wss==0)

{

table1[0]=miao%10;        //分离秒的个位与十位

table1[1]=miao/10;

}

else

table1[0]=table1[1]=11;

if(cnt!=11||wss==0)

{

table1[3]=fen%10;         //分离分的个位与十位

table1[4]=fen/10;

}

else

table1[3]=table1[4]=11;

if(cnt!=12||wss==0)

{

table1[6]=shi%10;         //分离时的个位与十位

table1[7]=shi/10;

}

else

table1[6]=table1[7]=11;

table1[2]=table1[5]=10;

j=0xfb;

for(i=0;i<=7;i++)          //从秒到时的扫描

{

P2=j;

P0=table[table1[i]];  //显示数值

delay(10);

j=_cror_(j,1);        //循环右移

}

}

//*******************显示子函数,用于显示定时1时间*****************

void display1()

{

uchar i,j;

if(alm1==0)

{

if(cnt!=1||wss==0)

{

table2[0]=miao1%10;        //以下含义同上

table2[1]=miao1/10;

}

else

table2[0]=table2[1]=11;

if(cnt!=2||wss==0)

{

table2[3]=fen1%10;

table2[4]=fen1/10;

}

else

table2[3]=table2[4]=11;

if(cnt!=3||wss==0)

{

table2[6]=shi1%10;

table2[7]=shi1/10;

}

else

table2[6]=table2[7]=11;

}

else

table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;

table2[2]=table2[5]=10;

j=0xfb;

for(i=0;i<=7;i++)

{

P2=j;

P0=table[table2[i]];

delay(10);

j=_cror_(j,1);

}

}

//********************显示子函数,用于显示定时2时间******************

void display2()

{

uchar i,j;

if(alm2==0)

{

if(cnt!=4||wss==0)

{

table3[0]=miao2%10;        //以下含义同上

table3[1]=miao2/10;

}

else

table3[0]=table3[1]=11;

if(cnt!=5||wss==0)

{

table3[3]=fen2%10;

table3[4]=fen2/10;

}

else

table3[3]=table3[4]=11;

if(cnt!=6||wss==0)

{

table3[6]=shi2%10;

table3[7]=shi2/10;

}

else

table3[6]=table3[7]=11;

}

else

table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;

table3[2]=table3[5]=10;

j=0xfb;

for(i=0;i<=7;i++)

{

P2=j;

P0=table[table3[i]];

delay(10);

j=_cror_(j,1);

}

}

//***************显示子函数,用于显示定时3时间数值****************//

void display3()

{

uchar i,j;

if(alm3==0)

{

if(cnt!=7||wss==0)

{

table4[0]=miao3%10;        //分离秒的个位与十位

table4[1]=miao3/10;

}

else

table4[0]=table4[1]=11;

if(cnt!=8||wss==0)

{

table4[3]=fen3%10;         //分离分的个位与十位

table4[4]=fen3/10;

}

else

table4[3]=table4[4]=11;

if(cnt!=9||wss==0)

{

table4[6]=shi3%10;         //分离时的个位与十位

table4[7]=shi3/10;

}

else

table4[6]=table4[7]=11;

}

else

table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;

table4[2]=table4[5]=10;

j=0xfb;                    //从秒到时的扫描

for(i=0;i<=7;i++)

{

P2=j;

P0=table[table4[i]];  //显示数值

delay(10);

j=_cror_(j,1);        //循环右移

}

}

//***********************时间子函数 *****************************//

void shijian()

{

if(flag>=20)               //判断是否到一秒

{

wss=~wss;

flag=0;                                 //到了,则标志位清零

if(cnt1!=0)

{

miao4++;          //秒加1

if(miao4>59)    //判断秒是否到60s

{

miao4=0;      //到了,则清零

fen4++;       //分加1

if(fen4>59)  //以下含义同上

{

fen4=0;

shi4++;

if(shi4>23)

shi4=0;

}

}

}

else

{

miao++;          //秒加1

if(miao>59)    //判断秒是否到60s

{

miao=0;      //到了,则清零

fen++;       //分加1

if(fen>59)  //以下含义同上

{

fen=0;

shi++;

if(shi>23)

shi=0;

}

}

}

}

}

//**************************键盘扫描子函数************************//

void key_scan()

{

if(key1==0)

{

while(!key1)          //防止掉显

{

if(cnt==1||cnt==2||cnt==3)

display1();

if(cnt==4||cnt==5||cnt==6)

display2();

if(cnt==7||cnt==8||cnt==9)

display3();

if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)

display();

}

cnt++;     //记下按键key1按下的次数

if(cnt==10&&cnt1==0)

{

miao4=miao;

fen4=fen;

shi4=shi;

cnt1++;

}

if(cnt==13)

{

cnt=0;

if(cnt1==1)

{

miao=miao4;

fen=fen4;

shi=shi4;

}

cnt1=0;

}

}

if(key2==0)              //判断key2是否按下

{

while(!key2)          //防止掉显

{

if(cnt==1||cnt==2||cnt==3)

display1();

if(cnt==4||cnt==5||cnt==6)

display2();

if(cnt==7||cnt==8||cnt==9)

display3();

if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)

display();

}

jia();

}

if(key3==0)              //判断key3是否按下

{

while(!key3)          //防止掉显

{

if(cnt==1||cnt==2||cnt==3)

display1();

if(cnt==4||cnt==5||cnt==6)

display2();

if(cnt==7||cnt==8||cnt==9)

display3();

if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)

display();

}

jian();                    //调用减1子函数

}

if(key4==0)                   //判断key4是否按下

{

while(!key4)            //防止掉

{

if(cnt==1||cnt==2||cnt==3)

{

alm1=~alm1;

display1();

}

if(cnt==4||cnt==5||cnt==6)

{

alm2=~alm2;

display2();

}

if(cnt==7||cnt==8||cnt==9)

{

alm3=~alm3;

display3();

}

if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)

display();

}

}

}

//****************************加1子函数***************************

void jia()

{

if(cnt==1)                         //判断key1按下的次数是否为1

{

miao1++;                 //是,则秒加1

if(miao1>59)         //判断秒是否大于60,是,则秒清零

miao1=0;

}

if(cnt==2)                         //以下含意同上

{

fen1++;

if(fen1>59)

fen1=0;

}

if(cnt==3)

{

shi1++;

if(shi1>23)

shi1=0;

}

if(cnt==4)

{

miao2++;

if(miao2>59)

miao2=0;

}

if(cnt==5)

{

fen2++;

if(fen2>59)

fen2=0;

}

if(cnt==6)

{

shi2++;

if(shi2>23)

shi2=0;

}

if(cnt==7)

{

miao3++;

if(miao3>59)

miao3=0;

}

if(cnt==8)

{

fen3++;

if(fen3>59)

fen3=0;

}

if(cnt==9)

{

shi3++;

if(shi3>23)

shi3=0;

}

if(cnt==10)

{

miao++;

if(miao>59)

miao=0;

cnt1++;

}

if(cnt==11)

{

fen++;

if(fen>59)

fen=0;

cnt1++;

}

if(cnt==12)

{

shi++;

if(shi>23)

shi=0;

cnt1++;

}

}

//***************************减1子函数**************************//

void jian()

{

if(cnt==1)                        //判断key1按下的次数是否为1,是则秒减1

{

miao1--;

if(miao1==255)        //判断秒是否减到255,是,则秒置59

miao1=59;

}

if(cnt==2)                        //以下含意同上

{

fen1--;

if(fen1==255)

fen1=59;

}

if(cnt==3)

{

shi1--;

if(shi1==255)

shi1=23;

}

if(cnt==4)

{

miao2--;

if(miao2==255)

miao2=59;

}

if(cnt==5)

{

fen2--;

if(fen2==255)

fen2=59;

}

if(cnt==6)

{

shi2--;

if(shi2==255)

shi2=23;

}

if(cnt==7)

{

miao3--;

if(miao3==255)

miao3=59;

}

if(cnt==8)

{

fen3--;

if(fen3==255)

fen3=59;

}

if(cnt==9)

{

shi3--;

if(shi3==255)

shi3=23;

}

if(cnt==10)

{

miao--;

if(miao==255)

miao=59;

cnt1++;

}

if(cnt==11)

{

fen--;

if(fen==255)

fen=59;

cnt1++;

}

if(cnt==12)

{

shi--;

if(shi==255)

shi=23;

cnt1++;

}

}

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

更多推荐