51单片机制作电子万年历

时间:2025-03-25 08:34:06
#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 } }