B.按键功能
1) 按键 S7 定义为“时钟设置”按键,通过该按键可切换选择待调整的时、分、 秒,
当前选择的显示单元以 1 秒为间隔亮灭,时、分、秒的调整需注意数据边界
属性。
2) 按键 S6 定义为“闹钟设置”按键,通过该按键可进入闹钟时间设置功能,数码
管显示当前设定的闹钟时间。
3) 按键 S5 定义为“加”按键,在“时钟设置”或“闹钟设置”状态下,每次按下该按 键
当前选择的单元(时、分或秒)增加 1 个单位。 4) 按键 S4 定义为“减”按键,在“时钟设置”或“闹钟设置”状态下,每次按下该按
键当前选择的单元(时、分或秒)减少 1 个单位。
#include
#include
unsigned char code abile[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//¹²Ñô¼«Êý×é
unsigned char display[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char code nao[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char miao=50,fen=59,shi=23,m,n,p,a,nmiao=0,nfen=0,nshi=0;
void Delay1ms();
void duanxuan();
void weixuan();
void Timer0Init();
void Timer1Init();
void naolin();
void shizhongshezhi();
void naozhongshezhi();
void Timer1Init();
void jia();
void jian();
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
int qq;
void main()
{
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;
while(1)
{
Timer0Init();//ʱÖÓ
Timer1Init();
weixuan();
duanxuan();
shizhongshezhi();
naolin();//ÄÖÁå
naozhongshezhi();
jia();
jian();
}
}
void naolin()
{
if(miao==nmiao&&fen==nfen&&shi==nshi)//Èç¹ûʱÖÓʱ¼äºÍÄÖÁåʱ¼äÒ»Ñù£¬·äÃùÆ÷¹¤×÷
{
P2=0XA0;P0=0Xff;P2=0X1F;// ¿ª·äÃùÆ÷
}
else
{
P2=0XA0;P0=0X00;P2=0X1F;// ¹Ø·äÃùÆ÷
}
}
void duanxuan()
{
display[2]=0xbf;// ʱ·ÖÃëÖмäµÄºáÏß
display[5]=0xbf;
if(p==0){
if((qq>1000)&&(m==1))// ¿ØÖÆʱÖÓµÄʱ·ÖÃë
{
display[7]=0xff;
display[6]=0xff;
}
else
{
display[7]=abile[miao%10];
display[6]=abile[miao/10];
}
if(qq>1000&&m==2)
{display[4]=0xff;
display[3]=0xff;}
else
{display[4]=abile[fen%10];
display[3]=abile[fen/10];}
if(qq>1000&&m==3)
{
display[1]=0xff;
display[0]=0xff;}
else
{display[1]=abile[shi%10];
display[0]=abile[shi/10];}}
if(p==1)// ¿ØÖÆÄÖÖÓµÄʱ·ÖÃë
{
if((qq>1000)&&(a==1))
{
display[7]=0xff;
display[6]=0xff;
}
else
{
display[7]=abile[nmiao%10];
display[6]=abile[nmiao/10];
}
if((qq>1000)&&(a==2))
{display[4]=0xff;
display[3]=0xff;}
else
{display[4]=abile[nfen%10];
display[3]=abile[nfen/10];}
if((qq>1000)&&(a==3))
{
display[1]=0xff;
display[0]=0xff;}
else
{display[1]=abile[nshi%10];
display[0]=abile[nshi/10];}}
}
void weixuan()// ÊýÂë¹Üλѡ£¨8¸öÈ«Ñ¡£©
{
unsigned char i;
P2=(P2&0x1f)|0xc0;
P0=(1<<i);
P2=0x1f;
P2=(P2&0x1f)|0xe0;
P0=display[i];
i++;
Delay1ms();
if(i==8) i=0;
}
void shumaguan() interrupt 1// µ±°´¼üS7û°´Ê±m=0£¬´Ëʱ ÿÃë¼ÓÒ»¡£Èç¹û°´¼ü°´Ï£¬Ôò²»¼Ó
{
unsigned int i;
if(m==0)
i++;
if(i==1000)
{
i=0;
miao++;
}
if(miao==60)
{
miao=0;
fen++;
}
if (fen==60)
{
fen=0;
shi++;
}
if(shi==24)
{
shi=0;
}
}
void Timer0Init() //1ºÁÃë[email protected]
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0xCD;
TH0 = 0xD4;
TF0 = 0;
TR0 = 1;
EA=1;
ET0=1;
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void shizhongshezhi()// m¿ØÖÆÑ¡Ôñʱ·ÖÃ룬°´Ò»´ÎS7£¬m¼ÓÒ»£¬µ±¼Óµ½4ʱ
{
if(S7==0)
{
Delay1ms();
if(S7==0)
{
p=0;
m++;
if(m==4)
m=0;
while(!S7);
}
}
}
void naozhongshezhi()// ±äÁ¿a¿ØÖÆÄÖÖÓʱ·ÖÃ룬±äÁ¿pÖ»ÓÐ0ºÍ1£¬µ±ÎªÒ»
{
if(S6==0)
{
Delay1ms();
if(S6==0)
{
a++;
if(a==4)
a=0;
p=1;
while(!S6);
}
}
}
void jia()
{
if(S5==0)
{
Delay1ms();
if(S5==0)
{
if(m==1)miao+=1;if(miao>59)miao=0;
if(m==2)fen+=1;if(fen>59)fen=0;
if(m==3)shi+=1;if(shi>23)shi=0;
if(a==1)nmiao+=1;if(nmiao>59)nmiao=0;
if(a==2)nfen+=1;if(nfen>59)nfen=0;
if(a==3)nshi+=1;if(nshi>23)nshi=0;
while(!S5);
}
}
}
void jian()
{
if(S4==0)
{
Delay1ms();
if(S4==0)
{
if(m==1)miao--;if(miao>99)miao=59;
if(m==2)fen--;if(fen>99)fen=59;
if(m==3)shi--;if(shi>99)shi=23;
if(a==1)nmiao--;if(nmiao>99)nmiao=59;
if(a==2)nfen--;if(nfen>99)nfen=59;
if(a==3)nshi--;if(nshi>99)nshi=23;
while(!S4);
}
}
}
void Timer1Init(void) //[email protected]
{
AUXR |= 0x40; //?????1T??
TMOD &= 0x0F; //???????
TL1 = 0xCD; //??????
TH1 = 0xD4; //??????
TF1 = 0; //??TF1??
TR1 = 1;
ET1=1;
EA=1;
}
void shan() interrupt 3
{
qq++;
if(qq==2000)qq=0;
}