#include <reg51.h>typedef unsigned char BYTE; //自定义字节类型#define Set_Bit(BIT) (BIT = 1) //定义置1函数#define Clear_Bit(BIT) (BIT = 0) //定义清0函数/*7279指令*/#define HD7279_TEST 0xbf //测试#define HD7279_RLC 0xa3 //循环左移#define HD7279_RRC 0xa2 //循环右移#define HD7279_RL 0xa1 //左移#define HD7279_RR 0xa0 //右移#define DECODE0 0x80 //译码方式0#define HD7279_DECODE1 0xc8 //译码方式1#define UNDECODE 0x90 //译码方式2: 不译码#define HD7279_HIDE 0x98 //消隐#define HD7279_FLASH 0x88 //闪烁#define HD7279_SEGON 0xe0 //段亮#define HD7279_SEGOFF 0xc0 //段灭#define CMD_READ 0x15 //读键盘指令/*函数定义*/void write7279(BYTE,BYTE); //定义HD7279写函数BYTE read7279(BYTE); //定义HD7279读函数void Send_Byte(BYTE); //定义HD7279发送字节函数BYTE Receive_Byte(void); //定义HD7279接收字节函数void Short_Delay(void); //定义短延时函数void Long_Delay(void); //定义长延时函数void Mcu_Init(void); //定义MCU初始化函数void distime(void); //显示时间void discalendar(void); //显示日历void HD7279key(void); //按键控制BYTE Key_number; //定义键值变量unsigned char second=0,minute=40,hour=9,F; //秒、分、时变量unsigned int day=10,month=6,year=2014,mark=0,i,j,clock,wait=0;//年月日等变量sbit key=P1^4; //定义HD7279中断硬件连接--->INT1 sbit HD7279_Clk=P1^2; //定义HD7279时钟硬件连接sbit HD7279_Data=P1^3; //定义HD7279数据硬件连接sbit HD7279_CS=P1^1; //片选/*主函数*/void main(void){Mcu_Init();F=1;while(1){ while(!key){ HD7279key();}if(clock>19){ clock=0;second++;} //一秒计时if(second>59){second=0;minute++;} //分进位if(minute>59){minute=0;hour++;} //时进位if(hour>23){hour=0; //日进位day++;}if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月{if(month==2)if(month==2){if(day==29) //非闰年的进位{if(year%4==0&&year%100!=0||year%400==0)mark=1; //mark闰年标志位else mark=2;}if(mark==2) //2月为28天的{day=1;month++;if(month==13){month=1;year++; }}else //2月为29天的{if(day==30){day=1;month++; }if(month==13){month=1;year++; }}}if (day==31){ day=1;month++;}if (month==13){ month=1;year++;}}if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月大{if (day==32){ day=1;month++;}if (month==13){ month=1;year++;}}if(F==0) //显示日历{discalendar(); }if(F==1) //显示时间{distime();}}}/*MCU初始化函数*/void Mcu_Init(void){Set_Bit(ET0); //定时器Set_Bit(TR0);Set_Bit(EA); //中断使能TMOD=0x01; //工作在方式一TH0=0x3C; //晶振=12MHZ,定时时间50msTL0=0xb0;HD7279_CS=0;Send_Byte(0xa4); //HD7279复位指令}/*按键操作*/void HD7279key(void){Key_number=read7279(CMD_READ); //读取键盘的值while(key==0) ;if(F==0){switch(Key_number){case 0x04: write7279(HD7279_FLASH,0xfc);write7279(DECODE0, (day+=1)%10); write7279(DECODE0+1, day/10);break; //调节日case 0x05: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month+=1)%10);write7279(DECODE0+3,month/10);break; //调节月case 0x06: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year+=1)%10); write7279(DECODE0+5, year/10);break; //调节年case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0, (day-=1)%10); write7279(DECODE0+1, day/10);break; //调节日case 0x0D: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month-=1)%10);write7279(DECODE0+3,month/10);break; //调节月case 0x0E: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year-=1)%10); write7279(DECODE0+5, year/10);break; //调节年case 0x07: F=1; break;case 0x0f: write7279(HD7279_FLASH,0xff);break;default : break;}if(month==13) month=1;if(month==0) month=12;if((((month+1)%2==0&&month<8)||month==8||month==10||month==12)&&day==0)//1,3,5,7,8,10,12月day=31;if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月{if(month==2){if(mark=1&&day==0) day=29;//闰年if(mark=2&&day==0) day=28;}else if(day==0) day=30;}}else{switch(Key_number){case 0x04: write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second+=1)%10);write7279(DECODE 0+1,second/10);break; //调节秒case 0x05: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute+=1)%10);write7279(DECO DE0+4,minute/10);break; //调节分case 0x06: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour+=1)%10);write7279(DECODE 0+7,hour/10);break; //调节时case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second-=1)%10);write7279(DECODE 0+1,second/10);break; //调节秒case 0x0D: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute-=1)%10);write7279(DECO DE0+4,minute/10);break; //调节分case 0x0E: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour-=1)%10);write7279(DECODE 0+7,hour/10);break; //调节时case 0x07: F=0;break;case 0x0f: write7279(HD7279_FLASH,0xff);break;default : break;}}}/*定时中断0函数*/void int_HD7279key(void) interrupt 1{ TH0=0x4C;TL0=0x00;clock++;}void Short_Delay(void) /*短延时函数*/{BYTE i;for(i=0;i<0x08;i++);}void Long_Delay(void) /*长延时函数*/{BYTE i;for(i=0;i<0x30;i++);}void write7279(BYTE Command,BYTE Data) /*HD7279写函数*/{Send_Byte(Command);Send_Byte(Data);}BYTE read7279(BYTE Command) /*HD7279读函数*/{Send_Byte(Command);return(Receive_Byte());}/*HD7279发送字节函数*/void Send_Byte(BYTE Data_Out){BYTE i;Long_Delay();for(i=0;i<8;i++){if(Data_Out&0x80)Set_Bit(HD7279_Data);else Clear_Bit(HD7279_Data);Set_Bit(HD7279_Clk);Short_Delay();Clear_Bit(HD7279_Clk);Short_Delay();Data_Out=Data_Out<<1;}Clear_Bit(HD7279_Data);}BYTE Receive_Byte(void) /*HD7279接收字节函数*/ {BYTE i,Data_In;Set_Bit(HD7279_Data);Long_Delay();for(i=0;i<8;i++){Set_Bit(HD7279_Clk);Short_Delay();Data_In=Data_In<<1;if(HD7279_Data)Data_In=Data_In|0x01;Clear_Bit(HD7279_Clk);Short_Delay();}Clear_Bit(HD7279_Data);return(Data_In);}/*日期显示*/void discalendar(void){write7279(DECODE0,day%10); write7279(DECODE0+1,day/10);write7279(DECODE0+2,month%10); write7279(DECODE0+3,month/10);write7279(DECODE0+4,year%10); write7279(DECODE0+5,(year/10)%10); write7279(DECODE0+6,(year/100)%10); write7279(DECODE0+7,year/1000);}/*时间显示*/void distime(void){write7279(DECODE0, second%10); write7279(DECODE0+1,second/10);write7279(UNDECODE+2,0x01);write7279(DECODE0+3,minute%10); write7279(DECODE0+4,minute/10);write7279(UNDECODE+5,0x01);write7279(DECODE0+6,hour%10); write7279(DECODE0+7,hour/10);}。