单片机电子日历(电子时钟)程序
51 单片机?电子日历(电子时钟)程序
经过两天的?调试,完成了51 ?单片机电子?日历课程设?计,现在把C程?序源代码帖?出来纪念一?下:
硬件实验箱?是伟福LA?B2000 ?实验箱
程序代码:
/****************************************************************************/
/* 电子日历,有时间显示?、闹铃、日期、秒表及键盘?设置功能*/
/* 功能键A: 设置位数字?+1 闹钟模式下?为闹钟开关? 秒表模式下?为记时开关? */
/* 功能键B: 设置位数字-?1 闹钟模式下?为闹钟开关? */
/* 功能键C:设置模式及?设置位选择? 秒表模式下?为清零键*/
/* 功能键D:在四种工作?模式下切换?设置闹钟开?关*/
/* 曹宇03 电子02010 ?29 */
/* 2006.6.3 更新*/
/****************************************************************************/
#inclu ?de
#inclu ?de
/*************** 这里设置程?序初始化时?显示的时间*?***************/ #defin ?e
SET_H ?OUR 12 /* 设置初始化?小时*/
#defin ?e SET_M I?NUTE ?00 /* 设置初始化?分钟*/
#defin ?e SET_S ?E COND ?00 /* 设置初始化?秒数*/
/************************* 系统地址****************************/
#defin ?e BASE_ ?PORT 0x800 0? /* 选通基地址*?/
#defin ?e KEY_L I?NE BASE_ ?PORT+1 /* 键盘行线地?址*/
#defin ?e KEY_C ?OLUMN ?BASE_ ?PORT+2 /* 键盘列线地?址*/
#defin ?e LED_S ?EG BASE_ ?PORT+4 /* 数码管段选?地址*/
#defin ?e LED_B I?T BASE_ ?PORT+2 /* 数码管位选?地址*/
#defin ?e LED_O ?N(x) XBYTE [?LED_B I?T]=(0x01< 5*="" #defin ?e LED_O ?FF XBYTE [?LED_S ?EG]=0x00 /*LED 显示?空*/ 在设置模式?下对秒分时?的宏定义*****************/ #defin ?e SECON ?D 0 /* 对应数码管?右边两位*/ #defin ?e MINUT ?E 1 /*对应数码管?中间两位*/ #defin ?e HOUR 2 /*对应数码管?左边两位*/ 定义四种工?作模式 #defin ?e CLOCK ?clock s?tr /* 时钟模式*/ #defin ?e ALART ?alart s?tr /*闹钟模式*/ #defin ?e DATE dates t?r /*日期模式*/ #defin ?e TIMER ?timer s?tr /* 秒表模式*/ 以下是所有?子函数的声?明*********************/ void sys i ?nit(void); /*系统的初始?化程序*/ void displ ?a y(void); /* 动态刷新一?次数码管子?程序*/ void clock ?plus(void); /* 时间加 1S?的子程序*/ void updat e?_clo c?kstr (?void); /* 更新时间显?示编码*/ void updat ?e_ala r?tstr (?void); /*更新闹钟时?间的显示编?码*/ void updat ?e_dat ?e str(void); /* 更新日期显?示编码*/ void updat ?e_tim ?erstr (?void); /*更新秒表时?间的显示编?码*/ void deley (?int); /* 延时子程序*?/ void updat e?_dis?pbuf(unsig ?ned char *); /*更新显示缓?冲区*/ unsig n?ed char getke y?code (?void); /* 获取键值子?程序*/ void keypr ?ocess (?unsig n?ed char); /* 键值处理子?程序*/ unsig ?ned char getmo ?nthday?s(unsig ?ned int,unsig ?ned char);/* 计算某月的?天数子程序*?/ /*功能键功能?子函数*/ void Akey(void); /*当前设置位?+1 开关闹钟开关秒表*/ void Bkey(void); void Ckey(void); /* 当前设置位-?1 开关闹钟*/ /* 设置位选择? 秒表清零*/ void Dkey(void); /*切换四种工?作模式*/ /***************** 全局变量声?明部分*********************/ ***** unsig ?ned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/* 从0~9 的LED ?编 码*/ unsig n?ed char ledch ?ar[3]={0x5c,0x54,0x71};/*o n f*/ //unsig ?ned char key[24]={ /* 键值代码数?组对应键位:*/ // 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE ?RESET ?*/ // 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */ // 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */ // 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */ struc t?{ /* 时间结构体?变量*/ unsig ?ned char s; unsig ?ned char m; unsig ?ned char h; }clock ?={SET_S ?ECOND ,?SET_M I?NUTE ,?SET_H ?OUR}; struc t?{ /*闹铃时间结?构体变量*/ unsig n?ed char m; unsig ?ned char h; }alart ?={SET_M I?NUTE ,?SET_H ?OUR}; struc t?{ /*日期结构体?变量*/ unsig n?ed int year; unsig ?ned char month ;? unsig n?ed char day; }date={6,1,1}; struc t?{ /*秒表时间结?构体变量*/ unsig ?ned char ms; unsig ?n ed char s; unsig ?ned char m; }timer ?={0,0,0}; unsig ?ned char dispb ?uf[6]; /* 显示缓冲区?数组*/ unsig n?ed char clock s?tr[6]; /* 时间显示的?数码管编码?数组*/ unsig n?ed char alart s?tr[6]; }