📄 clock_main.c
字号:
#include <AT89X51.H>
#include "CLOCK_MAIN.h"
void delay_ms(int xms)
{
uchar j;
int i;
for(i=xms;i>0;i--)
for(j=250;j>0;j--);
}
void delay(void)
{
uchar i,j;
for(i=5;i>0;i--)
for(j=248;j>0;j--);
}
void main(void)
{
TMOD=0x12; //设置工作方式
TH0=0x06; // 设置定时初值
TL0=0x06;
TH1=0XFF/50000;
TL1=0XFF%50000;
TR0=1; // 开启定时器0
TR1=0; // 关闭定时器1
ET0=1; // 充许定时中断
ET1=1;
EA=1;
flag2=0;
while(1)
{
KeyBord ( );
keymenu( );
alarm_s( );
ring();
test=!test;
} //end while 1
}//end main
void Time0(void) interrupt 1 using 0
{
EA=0;
mstcnt++;
if(mstcnt==8){
mstcnt=0;
P2=dispbitcode_ca[dispbitcnt];
P0=dispcode_cc[dispbuf[dispbitcnt]];
dispbitcnt++;
if(dispbitcnt==6){
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000){
tcnt=0;
second++;
if(second==60){
second=0;
minite++;
if(minite==60){
minite=0;
hour++;
if(hour==24) {
hour=0;
p_month_day=p_month_day+1;
} // end if (hour)
} //end if (minite)
}//end if(second )
if(flag1==1)
{
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[4]=hour%10;
dispbuf[5]=hour/10;
}
}//end if (tcont)
EA=1;
}
void Time1(void) interrupt 3 using 0
{
test=!test;
if((flag0==0x80)&&(tcnt<2000))
{
TH1=0xfe; // 重装定时器频率为1600hz
TL1=0xc7;
TR1=1;
speak=!speak;
}
// else TR1=0;
if((flag0==0x40)&&(tcnt<1000))
{
TH1=0xfd; // 重装定时器频率为800hz
TL1=0x8f;
TR1=1;
speak=!speak;
}
// else TR1=0;
if (flag2)
{
TH1=0XFF/50000;
TL1=0XFF%50000;
TR1=1; // 重起定时器1
if (second%2) //
{ if (flag0==1 ){
flag0=0;
undispbuf[0]=dispbuf[0] ; // 进行数据保护
undispbuf[1]=dispbuf[1] ;
undispbuf[2]=dispbuf[2] ;
undispbuf[3]=dispbuf[3] ;
undispbuf[4]=dispbuf[4] ;
undispbuf[5]=dispbuf[5] ;}
if (flag2==0x01)
dispbuf[0]=16 ; // 显示灭(查表的)
if ( flag2==0x02)
dispbuf[1]=16 ;
if (flag2==0x04)
dispbuf[2]=16 ;
if (flag2==0x08)
dispbuf[3]=16 ;
if (flag2==0x10)
dispbuf[4]=16 ;
if (flag2==0x20)
dispbuf[5]=16 ;
}
else // 恢复显示
{
if(flag0==0){
flag0=1;
dispbuf[0]=undispbuf[0] ;
dispbuf[1]=undispbuf[1] ;
dispbuf[2]=undispbuf[2] ;
dispbuf[3]=undispbuf[3] ;
dispbuf[4]=undispbuf[4] ;
dispbuf[5]=undispbuf[5] ; }
}
}
}
/*****************************************************************
//
//
*****************************************************************/
uchar KeyBord (void)
{
uchar key ;
key =P1&0xf;
if(key) // 检测到按键
{ delay(); // 去抖动延时
P1=P1&0xf;
key=P1;
if (key==0x0f)
{
ligth=0; // 输出指示
return 0;
}
else
{
ligth=1; // 输出指示
return key;
}
}
return 0;
}
void keymenu(void )
{
uchar state=0x01;
key=KeyBord();
// 主功能键
if (key==KEY1)
{
flag1=0; //停止时间显示
/*
// 刷新数据区
dispbuf[0]=0;
dispbuf[1]=0;
dispbuf[2]=0;
dispbuf[3]=0;
dispbuf[4]=0;
dispbuf[5]=0;
flag2=0x3f; //计数时间显示闪烁等待开始
TR1=1;
key=KeyBord();
while (key!=KEY1)
{
key=KeyBord();
if (key==KEY2)
{
flag2=0; // 停止闪烁
flag3=1 ; //开始时间计时标志
}
if (key==KEY3){
if (flag3==1)
flag3=0; }
if (key==KEY4)
{
if (flag3==0)
{
// 刷新数据区
dispbuf[0]=0;
dispbuf[1]=0;
dispbuf[2]=0;
dispbuf[3]=0;
dispbuf[4]=0;
dispbuf[5]=0;
}
}
delay_ms(100) ;
// key=KeyBord();
} // enf while (key!=key1) 结束计时模块
*/
flag3=0;
flag2=0x01;
TR1=1;
dispbuf[0]=alarm[0][1]%10; // 刷新数据区
dispbuf[1]=alarm[0][1]/10;
dispbuf[2]=alarm[0][0]%10;
dispbuf[3]=alarm[0][0]/10;
//dispbuf[4]=al_state&&0x01;
dispbuf[5]=0;
if (al_state&&0x01)
dispbuf[4]=10;
else
dispbuf[4]=11;
key=KeyBord();
while( key==KEY1)
key=KeyBord(); // 等待按间释放
while(key!=KEY1)
{
key=KeyBord();
if (key==KEY2)
{
if (flag2==1){
alarm[num][1]=alarm[num][1]+1;
dispbuf[0]=dispbuf[0]+1;
}
if (flag2==2){
alarm[num][1]=alarm[num][1]+10;
dispbuf[1]=dispbuf[1]+1;
}
if (flag2==4){
alarm[num][0]=alarm[num][0]+1;
dispbuf[2]=dispbuf[2]+1;
}
if (flag2==8){
alarm[num][0]=alarm[num][0]+10;
dispbuf[3]=dispbuf[3]+1;
}
if (flag2==16){
al_state=al_state|state;
dispbuf[4]= al_state&&flag2+10;
}
if (flag2==32){
num=num+1;
state=state<<1;
dispbuf[0]=alarm[num][1]%10; // 刷新数据区
dispbuf[1]=alarm[num][1]/10;
dispbuf[2]=alarm[num][0]%10;
dispbuf[3]=alarm[num][0]/10; }
//dispbuf[4]=al_state&&state+10;
dispbuf[5]=num;
if (al_state&state)
dispbuf[4]=10;
else
dispbuf[4]=11;
} //end if (key==key2) 修改闹铃时间操作(+)
if (key==KEY3)
{
if (flag2==0x01){
alarm[num][1]=alarm[num][1]-1;
dispbuf[0]=dispbuf[0]-1;
}
if (flag2==0x02){
alarm[num][1]=alarm[num][1]-10;
dispbuf[1]=dispbuf[1]-1;
}
if (flag2==0x04){
alarm[num][0]=alarm[num][0]-1;
dispbuf[2]=dispbuf[2]-1;
}
if (flag2==0x08){
alarm[num][0]=alarm[num][0]-10;
dispbuf[3]=dispbuf[3]-1;
}
if (flag2==0x10){
state=~state;
al_state=al_state&(state);
state=~state;
dispbuf[4]=al_state&&flag2+10;
}
if (flag2==32){
num=num-1;
state=state>>1;
dispbuf[0]=alarm[num][1]%10; // 刷新数据区
dispbuf[1]=alarm[num][1]/10;
dispbuf[2]=alarm[num][0]%10;
dispbuf[3]=alarm[num][0]/10; }
//dispbuf[4]=al_state&&state+10;
dispbuf[5]=num;
if (al_state&state)
dispbuf[4]=10;
else
dispbuf[4]=11;
} //end if (key==key3) 修改闹铃时间操作(-)
if (key==KEY4)
if(flag2<32)
flag2=flag2<<1; // 进行移位操作
else
flag2=0x01;
delay_ms(200) ;
} // end (key!=key1) 完成闹钟设置
key=KeyBord();
while( key==KEY1)
key=KeyBord(); // 等待按间释放
flag2=0;
TR1=0;
dispbuf[0]=second%10; // 刷新数据区
dispbuf[1]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[4]=hour%10;
dispbuf[5]=hour/10;
flag2=1; //开始时间设置
TR1=1;
flag1=0;
/*
key=KeyBord();
while( key==KEY1)
key=KeyBord(); // 等待按键释放 */
while (key!=KEY1)
{
if (key==KEY2)
{
if (flag2==1){
second=second+1;
dispbuf[0]=second%10;
}
if (flag2==2){
second=second+10;
dispbuf[1]=second/10;
}
if (flag2==4){
minite=minite+1;
dispbuf[2]=minite%10;
}
if (flag2==8){
minite=minite+10;
dispbuf[3]=minite/10;
}
if (flag2==16){
hour=hour+1;
dispbuf[4]=hour%10;
}
if (flag2==32){
hour=hour+10;
dispbuf[5]=hour/10;
}
} //end if (key==key2) 修改时间操作(+)
if (key==KEY3)
{
if (flag2==0x01){
second=second-1;
dispbuf[0]=second%10;
}
if (flag2==0x02){
second=second-10;
dispbuf[1]=second/10;
}
if (flag2==0x04){
minite=minite-1;
dispbuf[2]=minite%10;
}
if (flag2==0x08){
minite=minite-10;
dispbuf[3]=minite/10;
}
if (flag2==0x10){
hour=hour-1;
dispbuf[4]=hour%10;
}
if (flag2==0x20){
hour=hour-10;
dispbuf[5]=hour/10;
}
} //end if (key==key2) 修改时间操作(-)
if (key==KEY4)
if(flag2<32)
flag2=flag2<<1; // 进行移位操作
else
flag2=0x01;
delay_ms(300) ;
key=KeyBord();
}// end (key!=key1) 完成时间设置
/*
key=KeyBord();
while( key==KEY1) // 等待按间释放
key=KeyBord(); */
flag2=0; //关闭闪烁控制
TR1=0;
flag1=1; //正常时间显示
dispbuf[0]=second%10; // 刷新数据区
dispbuf[1]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[4]=hour%10;
dispbuf[5]=hour/10;
}// end if (key==KEY1) 主功能键设置完
key=KeyBord();
while( key==KEY1) // 等待按间释放
key=KeyBord();
//次功能键
key=KeyBord();
if (key==KEY2) //查看日期
while (key!=0x00)
{
flag1=0 ; // 暂停时间显示
dispbuf[0]=(uchar)(*p_month_day%32)%10; // 刷新数据区
dispbuf[1]=(uchar)(*p_month_day%32)/10;
dispbuf[2]=(uchar)(*p_month_day/32)%10;
dispbuf[3]=(uchar)(*p_month_day/32)/10;
dispbuf[4]=7;
dispbuf[5]=0;
key=KeyBord();
}
flag1=1; // 恢复时间显示
key=KeyBord();
if (key==KEY3) // 省电控制
{
flag1=0 ; // 暂停时间显示
delay_ms(10) ; //如果KEY2常按则进入省电模式
if (key==KEY3)
sleep=!sleep; // 进入省电模式
if(sleep==1)
flag1=0;
}
key=KeyBord(); // 查看闹钟设置
flag2=0x00 ;
if (key==KEY4)
{
uchar disp=0x01;
num=0;
flag1=0;
key=KeyBord() ;
while (key&KEY4)
{
if (key==(KEY5))
{
num=num+1;
disp=disp<<1;
}
if (key==(KEY6) )
{
num=num-1;
disp=disp>>1;
}
dispbuf[0]=alarm[num][1]%10;
dispbuf[1]=alarm[num][1]/10;
dispbuf[2]=alarm[num][0]%10;
dispbuf[3]=alarm[num][0]/10;
dispbuf[5]=num;
delay_ms(200) ;
key=KeyBord();
}
flag2=0x00 ;
}
delay_ms(200) ;
}
void alarm_s(void)
{
uchar i ,j=0x01;
speak=0;
for (i=0;i<8;i++,j=j>>1)
if (hour==alarm[i][0])
if (minite==alarm[i][1])
if (al_state&j)
sound_al();
else
{ speak=0; TR1=0 ;}
}
void sound_al(void)
{ speak=1;
//delay_ms(1000);
}
void ring ( ) //整点报
{ flag0=1;
if((minite==0)&&(second>=55)) //前五声低音
{ TR1=1; flag0=0x40; } // 启动定时器 发出滴滴声 // 设置定时标志
if( (minite==1)&&(second==0)) //整点高音
{ TR1=1; flag0=0x80; } // 启动定时器 发出滴滴声 // 设置定时标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -