51单片机制作电子万年历
#include <>
#define uchar unsigned char
sbit btn_add=P1^0;
sbit btn_mode=P1^1;
sbit btn_minus=P1^2;
sbit btn1=P1^3;
sbit btn_add1=P1^4;
sbit btn_minus1=P1^5;
uchar data1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
uchar wei1[]={0xf7,0xfb,0xfd,0xfe,0xdf,0xef,0x7f,0xbf};
uchar max[]={31,28,31,30,31,30,31,31,30,31,30,31};//每月天数最大值数组
uchar cnt=0,h=0,m=0,s=0,mode_cnt=0,mon=6,d=4,mode_cnt1=0;
int y=2023;
void delay()//延时消抖函数
{
int i;
for(i=0;i<100;i++);
}
void init() //中断函数计数/计时器初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void time_init() interrupt 1 //中断函数
{
cnt++;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
if(cnt==20)
{
{
cnt=0;
s++;
if(s==60)
{s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
h=0;
{
d++;
if(d==max[m-1])
{
d=0;
m++;
if(mon=12)
{
mon=0;
y++;
if(y%400==0)//判断闰年改变二月的最大天数
{
max[1]=29;
}
}
}
}
}
}
}
}
}
void add() //时分秒加法功能函数
{
if(btn_add==0)
{
delay();
if(btn_add==0)
{
if(mode_cnt/2==0)
{
m++; //主键按一下 为分钟加法功能
while(!btn_add); //按两下为小时加法功能 同时mode_cnt清零
}
else if(mode_cnt/2!=0)
{
h++;
mode_cnt=0;
while(!btn_add);
}
}
}
}
void minus()//时分秒减法功能函数
{
if(btn_minus==0)
{
delay();
if(btn_minus==0)
{
if(mode_cnt/2==0)
{
m--; //主键按一下 为加法功能
while(!btn_minus);
}
else if(mode_cnt/2!=0)
{
h--;
mode_cnt=0;
while(!btn_minus);
}
}
}
}
void mode() //控制时分秒的按键
{
if(btn_mode==0)
{
delay();
if(btn_mode==0)
mode_cnt++;
while(!btn_mode);
}
}
void mode1() //控制年月日的按键
{
if(btn1==0)
{
delay();
if(btn1==0)
mode_cnt1++;
while(!btn1);
}
}
void add1() //年月日加法功能函数
{
if(btn_add1==0)
{
delay();
if(btn_add1==0)
{
if(mode_cnt1==1)
{
d++; //主键按一下 为天数加法功能
while(!btn_add1);//按两下为月份加法功能 }
else if(mode_cnt1==2)
{
mon++;
while(!btn_add1);
}
else if(mode_cnt1==3) //按三下为年份加法功能
{
y++;
//mode_cnt1=0;
while(!btn_add1);
}
}
}
}
void minus1() //年月日减法功能函数
{
if(btn_minus1==0)
{
delay();
if(btn_minus1==0)
{
if(mode_cnt1==1)
{
d--; //主键按一下为天数减法功能
while(!btn_minus1); //按两下为月份减法功能
}
else if(mode_cnt1==2)
{
mon--;
while(!btn_minus1);
}
else if(mode_cnt1==3) //按三下为年份减法功能
{
y--;
//mode_cnt1=0;
while(!btn_minus1);
}
}
}
}
void display(uchar h,uchar m,uchar s)//输入时分秒数据
{
//时
P2=data1[h/10];
P3=wei[0];
delay();
P3=0xff;
P2=data1[h%10];
P3=wei[1];
delay();
P3=0xff;
//分
P2=data1[m/10];
P3=wei[2];
delay();
P3=0xff;
P2=data1[m%10];
P3=wei[3];
delay();
P3=0xff;
//秒
P2=data1[s/10];
P3=wei[4];
delay();
P3=0xff;
P2=data1[s%10];
P3=wei[5];
delay();
P3=0xff;
}
void display2(int y,uchar mon,uchar d)//输入年月份数据
{
//年
P2=data1[y/1000];
P0=wei1[0];
delay();
P0=0xff;
P2=data1[y%1000/100];
P0=wei1[1];
delay();
P0=0xff;
P2=data1[y%1000%100/10];
P0=wei1[2];
delay();
P0=0xff;
P2=data1[y%1000%100%10];
P0=wei1[3];
delay();
P0=0xff;
//月
P2=data1[mon/10];
P0=wei1[4];
delay();
P0=0xff;
P2=data1[mon%10];
P0=wei1[5];
delay();
P0=0xff;
//日
P2=data1[d/10];
P0=wei1[6];
delay();
P0=0xff;
P2=data1[d%10];
P0=wei1[7];
delay();
P0=0xff;
}
void main()//主函数
{
init();
while(1)
{
mode();
add();
minus();
mode1();
add1();
minus1();
display(h,m,s);
display2(y,mon,d);
P2=0x80;
P3=0xaf; //小时后边的小数点 0xbf
//分钟后边的小数点 0xef
}
}