电子日历时钟程序

2020-05-03 17:35

#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); }


电子日历时钟程序.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2010年红旗社区党建工作基础台帐 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: