📄 keypad.c
字号:
return;
}
if((data_deal==8)&(month==2)&(keypad<=8))
{
day=day/10*10+(uchar)keypad;
data_deal=0x00;
return;
}
if((data_deal==8)&(month!=2)&(day/10<=2))
{
day=day/10*10+(uchar)keypad;
data_deal=0x00;
return;
}
if((data_deal==8)&(day/10==3)&(keypad<=1))
{
if((keypad==0)&((month==4)|(month==6)|(month==9)|(month==11)))
{
day=day/10*10+(uchar)keypad;
data_deal=0x00;
return;
}
else
{
day=day/10*10+(uchar)keypad;
data_deal=0x00;
return;
}
}
}
}
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////
void dis_deal(uchar *x,uchar *y,uchar *z,uchar *a,uchar *b) //显示缓冲处理
{
dis[0]=*x%10;
dis[1]=*x/10;
dis[2]=*y%10;
dis[3]=*y/10;
dis[4]=*z%10;
dis[5]=*z/10;
dis[6]=*a;
dis[7]=*b;
}
//////////////////////////////////////////////////////////////////////////////////////////////////显示
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void display()
{
uchar a,b,c,d;
if((st_control==0)&(data_deal_flag==0)&(alarm_key_flag==0)&(down_key_flag==0)) //如果是时钟,秒分时,进显示缓存
{
b=14;c=14; //时钟时高两位不显示
if((switchover==0)|((hour>=1)&(hour<=12))) //24小时转12小时
{
dis_deal(&second,&minute,&hour,&b,&c);
}
else
{
if(hour==0x00)hour_12=12;
else hour_12=hour-12;
dis_deal(&second,&minute,&hour_12,&b,&c);
}
}
if(st_control!=0) //如果秒表,秒表显示进显示缓存
{
b=13;c=12;
dis_deal(&st_10ms,&st_s,&st_minute,&b,&c);
}
if(data_deal_flag!=0) //日期显示
{
b=year_higher%10;
c=year_higher/10;
dis_deal(&day,&month,&year,&b,&c);
}
if(alarm_key_flag!=0) //闹钟显示
{
if(alarm_flag==1){b=10,c=0;}
else {b=10;c=10;}
dis_deal(&alarm_second,&alarm_minute,&alarm_hour,&b,&c);
}
if(down_key_flag!=0) //倒计时显示
{
b=13;c=11;
dis_deal(&down_second,&down_minute,&down_hour,&b,&c);
}
for(a=0;a<8;a++)
{
d=dis_7[dis[a]];
if((a==4)|(a==2))d=d&0x7f;
pb8255=d;
P1=scan_con[a];
delay(5);
P1=0x00;
}
}
/*******************************************************************************
*File: Main.c
*
*功能: 多功能时钟
*******************************************************************************/
void main(void)
{
init();
while(1)
{
keypad=keyscan();
if(flag==1)out_time(); //时钟时间到外部处理
if(st_flag==1)st_outtime(); //秒表时间到外部处理
if(keypad>=0)key_deal();
if((alarm_flag==1)&(alarm_hour==hour)&(alarm_minute==minute)&(alarm_second==second)) //闹钟到响铃判断
{
ring_second=second;
ring_minute=minute;
sign=0;
ring(); // 响铃,sign用来判断是闹钟响铃还是倒计时响铃
}
if(down_ring==1) //倒计时判断
{
ring_second=second;
ring_minute=minute;
sign=1;
ring();
}
display();
}
}
//////////////////////////////////////////////////////////
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void quit(void) //响铃声按键退出
{
keypad=keyscan();
if(keypad==0x0a)
{
if(sign==0)
{
ring_second=0x00;
ring_minute=0x00;
alarm_flag=0;
}
else
{
down_ring=0;
down_flag=0;
down_key_flag=0;
down_deal=0x00;
}
p2_0=0;
}
}
/////////////////////////////////////////////////////////////////////////////////以下为时钟处理的
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void ring()
{
while(1)
{
p2_0=0;display();display();display();display();display();display();display();display();p2_0=1; //响铃三短第一短
quit(); //查看有没按键要退出响铃
if(flag==1)out_time(); //时钟1妙时间到外部处理
if(keypad==0x0a)
{
p2_0=1;
return;
}
display();display();display();
p2_0=0;display();display();display();display();display();display();display();display();p2_0=1; // 二短
quit();
if(keypad==0x0a)
{
p2_0=1;
return;
}
if(flag==1)out_time();
display();display();display();
p2_0=0;display();display();display();display();display();display();display();display();p2_0=1; // 三短
quit();
if(keypad==0x0a)
{
p2_0=1;
return;
}
if(flag==1)out_time();
display();display();display();
p2_0=0;display();display();display();display();display();display();display();display();
display();display();display();display();display();display();display();display();
p2_0=1; //一长
quit();
if(keypad==0x0a)
{
p2_0=1;
return;
}
if(flag==1)out_time();
display();
if((ring_second==second)&((minute-ring_minute)==1)) //响铃一分钟到退出处理
{
if(sign==0) //sign用来判断事倒计时还是闹钟响铃,
{
ring_second=0x00;
ring_minute=0x00;
alarm_flag=0; //*等下定时的标志也清掉
}
else
{
down_ring=0;
down_flag=0;
down_key_flag=0;
down_deal=0x00;
}
return;
}
}
}
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void init(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
p2_0=1;
comm8255=0x81;
pb8255=0xff;
TMOD=0x01;
TH0=0x3c; //定时50ms
TL0=0xb0;
ET0=1;
TR0=1;
EA=1;
}
///////////////////////////////////////////////////////////
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void out_time(void)
{
if(second>=60)
{
second=0x00;
minute++;
if(minute>=60)
{
minute=0x00;
hour++;
if(hour>=24)
{
hour=0x00;
day++;
/////////////////////////////////////////////////////////
if((day>=29)&(month==2)&(year%4!=0)) //二月28号非闰年判断
{
day=0x01;
month++;
}
if((day>=30)&(month==2)&(year%4==0)) //闰年二月判断
{
if(year%10!=0)
{day=0x01;month++;}
if((year%100==0)&(year%400==0))
{day=0x01;month++;}
}
if((day>=31)&((month==4)|(month==6)|(month==9)|(month==11)))//30号月判断
{
day=0x01;
month++;
}
if((day>=32)&((month==1)|(month==3)|(month==5)|(month==7)|(month==8)|(month==10)|(month==12)))//31号月判断
{
day=0x01;
month++;
}
if(month>=13)
{
month=0x01;
year++;
}
//////////////////////////////////////////////////////////////////////////
}
}
}
flag=0;
}
///////////////////////////////////////////////////////////
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void time_int0(void) interrupt 1 using 1 //50ms中断
{
ET0=0; TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
count++;
if(count==20)
{
count=0x00;
second++;
if(down_flag==1)
{
if((down_second<=0x00)&(down_minute==0x00)&(down_hour==0x00))
{
down_second=0x01;
down_ring=1; //倒计时到--响铃
down_flag=0; //关倒计时
}
if((down_second<=0x00)&((down_minute>=1)|(down_hour>=1)))
{
down_second=59;
if((down_minute<=0x00)&(down_hour>=1))
{
down_minute=59;
down_hour--;
}
else down_minute--;
}
else down_second--;
}
flag=1;
}
ET0=1;
}
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void time_int1(void) interrupt 3 using 2 //10ms(百分秒)秒表中断
{
ET1=0; TR1=0;
TH1=0xd8;
TL1=0xf0;
TR1=1;
st_count++;
if(st_count>=10)
{
st_count=0x00;
st_10ms++;
st_flag=1;
}
ET1=1;
}
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
void st_outtime(void)
{
if(st_10ms>=100)
{
st_10ms=0x00;
st_s++;
if(st_s>=60)
{
st_s=0x00;
st_minute++;
if(st_minute>=60)
{
st_10ms=0x00;
st_s=0x00;
st_minute=0x00;
}
}
}
st_flag=0;
}
//键盘说明:0x0c为进入和退出调时的控制键
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -