#include
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&&year0!=0||year@0==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,定时时间50ms TL0=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)); write7279(DECODE0+1, day/10);break; //调节日 case 0x05: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month+=1)); write7279(DECODE0+3,month/10);break; //调节月 case 0x06: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year+=1)); write7279(DECODE0+5, year/10);break; //调节年 case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0, (day-=1)); write7279(DECODE0+1, day/10);break; //调节日 case 0x0D: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month-=1)); write7279(DECODE0+3,month/10);break; //调节月 case 0x0E: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year-=1)); 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));write7279(DECODE0+1,second/10);break; //调节秒 case 0x05: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute+=1));write7279(DECODE0+4,minute/10);break; //调节分
case 0x06: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour+=1));write7279(DECODE0+7,hour/10);break; //调节时 case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second-=1));write7279(DECODE0+1,second/10);break; //调节秒 case 0x0D: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute-=1));write7279(DECODE0+4,minute/10);break; //调节分 case 0x0E: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour-=1));write7279(DECODE0+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); }