完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include #include #include #define uchar unsigned char #define uint unsigned int /*------------LCD12864相关声明-----------------------------*/ #define com 0 #define dat 1 ***it cs =P3^5; ***it sid=P3^6; ***it sck=P3^7; uchar code TAB1[]={"万年历"};//第一行初始化. uchar code TAB2[]={"20 年 月 日"}; //第二行 uchar code TAB3[]={"星期 : : "}; //第三行 /*----------------------DS1302相关声明-------------------------*/ char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:时. 0x18,0x06,0x06,0x08}; //日:月:星期:年. uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符. ***it T_CLK=P2^0; /* 实时时钟的时钟线引脚*/ ***it T_IO=P2^1; /* 实时时钟的数据线*/ ***it T_RST=P2^2; /* 实时时钟的复位线引脚*/ uchar bdata datbyte; ***it datbyte0=datbyte^0; ***it datbyte7=datbyte^7; /*----------键盘相关声明-------------------------------------*/ ***it key=P1^0; //功能键 ***it key1=P1^1; //只有加1键 ***it key2=P1^2; uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志. /*--------------以下为LCD12864相关函数--------------------------*/ /************************************************************** 函数名称:void delay1ms(uint x) 函数功能: 延时1MS ***************************************************************/ void delay1ms(uint x) { uint i,j; for(i=0;i } /************************************************************** 函数名称:void w_12864byte(uchar byte) 函数功能: 写字节 **************************************************************/ void w_12864byte(uchar byte) { uchar i; for(i=0;i<8;i++) { sck=0; byte<<=1; sid=CY; sck=1; } } /************************************************************** 函数名称:uchar r_12864byte(void) 函数功能: 读字节 ***************************************************************/ uchar r_12864byte(void) { uchar i,temp1,temp2; temp1 = 0; temp2 = 0; for(i=0;i<8;i++) { temp1=temp1<<1; sck = 0; sck = 1; sck = 0; if(sid) temp1++; } for(i=0;i<8;i++) { temp2=temp2<<1; sck = 0; sck = 1; sck = 0; if(sid) temp2++; } return ((0xf0&temp1)+(0x0f&temp2)); } /************************************************************** 函数名称:void c_12864busy( void ) 函数功能: 检测忙函数 **************************************************************/ void c_12864busy( void ) { do w_12864byte(0xfc); //11111,RW(1),RS(0),0 while(0x80&r_12864byte()); } /************************************************************** 函数名称:void w_12864(bit dat_com,uchar byt) 函数功能: 写入函数 ***************************************************************/ void w_12864(bit dat_com,uchar byt) { uchar temp; if(dat_com==0) //为零,写入指令 temp=0xf8; //11111,RS(0),RW(0),0 else //否则,写入数据 temp=0xfa; //11111,RS(1),RW(0),0 cs=1; c_12864busy(); w_12864byte(temp); w_12864byte(byt&0xf0); //写入高四位 w_12864byte(byt<<4); //写入低四位 cs=0; } /************************************************************** 函数名称:void init_12864(void) 函数功能:初始化12864 ***************************************************************/ void init_12864(void) { w_12864(com,0x30); //基本指令功能. w_12864(com,0x0c); //显示打开,关光标,反白关. w_12864(com,0x01); //清屏指令. w_12864(com,0x06); //AC自动加一 } /*----------------以下为DS1302相关函数-------------------------*/ /************************************************************** 函数名称:void w_1302byte(uchar date) 函数功能:写一个字节(上升沿) ***************************************************************/ void w_1302byte(uchar date) { uchar i; datbyte=date; for(i=0;i<8;i++) { T_IO=datbyte0; //写最低位 T_CLK=0; T_CLK=1; datbyte>>=1; } } /************************************************************** 函数名称:uchar r_1302byte(void) 函数功能:读一个字节(下降沿) ***************************************************************/ uchar r_1302byte(void) { uchar i; datbyte=0; for(i=0;i<8;i++) { datbyte7=T_IO; //读最低位 T_CLK=1; T_CLK=0; datbyte>>=1; } return(datbyte); } /*************************************************************** 函数名称:void write_1302(uchar addr,uchar date) 函数功能: 指定位置写数据 ****************************************************************/ void write_1302(uchar addr,uchar date) { T_RST=0; T_CLK=0; T_RST=1; w_1302byte(addr); w_1302byte(date); T_CLK=0; T_RST=0; } /************************************************************** 函数名称:uchar read_1302(uchar addr) 函数功能: 指定位置读数据 ****************************************************************/ uchar read_1302(uchar addr) { uchar dat1,dat2,temp; T_RST=0; T_CLK=0; T_RST=1; w_1302byte(addr); temp=r_1302byte(); T_RST=0; T_CLK=0; dat1=temp/16; dat2=temp%16; temp=dat1*10+dat2; return(temp); } /*************************************************************** 函数名称:void init_1302(void) 函数功能: 初始化 *****************************************************************/ void init_1302(void) { uchar i; uchar addr=0x80; write_1302(0x8e,0x00); for(i=0;i<7;i++) { write_1302(addr,TAB_1302); addr+=2; } write_1302(0x8e,0x80); } /**************************************************************** 函数名称:void get_1302(void) 功能说明:读取DS1302时钟信息. *****************************************************************/ void get_1302(void) { uchar i,addr=0x81; for(i=0;i<7;i++) { TAB_1302=read_1302(addr); addr+=2; } } /*---------------以下为显示相关函数--------------------------*/ /****************************** 函数名称: void fenli(uchar x,uchar y,uchar val) 功能描述: 指定位置写入数据 ********************************/ void fenli(uchar x,uchar y,uchar val) { uchar ge,shi,addr,i=0; if(val==5)//这里把星期数字显示的转换为中文 { w_12864(com,0x88+2); for(i=0;i<2;i++) { //一个汉字写两次 if(TAB_1302[5]==0)w_12864(dat,TAB_XQ); if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); // if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); //!!??星期三显示没规律,不知咋回事. if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]); if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]); if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]); if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]); } } else { shi=TAB_1302[val]/10;//分离十位 ge=TAB_1302[val]%10; if(x==1)x=0x80; if(x==2)x=0x90; if(x==3)x=0x88; if(x==4)x=0x98; addr=x+y; w_12864(com,addr);//指定位置 w_12864(dat,0x30+shi);//写入 w_12864(dat,0x30+ge); } } /************************************************************* 函数名称:void display(void) 功能描述: 显示函数 **************************************************************/ void display(void) { get_1302(); //读1302 fenli(3,7,0); //读秒 fenli(3,5,1); //读分 fenli(3,3,2); //读时 fenli(2,5,3); //读日 fenli(2,3,4); //读月 fenli(3,2,5); //读星期 fenli(2,1,6); //读年 } /*---------------按键处理相关函数--------------------------*/ /************************************************************ 函数名称:void scanner() 功能描述: 按键函数 *************************************************************/ void scanner() { uchar i,j; if(!key) //功能键按下 { delay1ms(500); //延时500MS if(!key) //还按下,退出时间调整 { keyflag=0; //标志位为0 sum=0; //清0 w_12864(com,0x0c);//清闪烁 for(i=0;i<7;i++)//十进制转十六进制 { j=TAB_1302/10; TAB_1302=TAB_1302%10; TAB_1302=TAB_1302+16*j; } init_1302(); //写入1302 while(!key); //等待释放 delay1ms(10); //延时消抖 } else //500MS内放开 { keyflag=1; //标志为1,进行时间调整 sum++; //功能键加1 if(sum==8) sum=0; switch(sum) { case 1: // { w_12864(com,0x98+7); w_12864(com,0x0f); break; } case 2: //为2,年闪烁 w_12864(com,0x90+1); break; case 3: //月闪烁 w_12864(com,0x90+3); break; case 4: //日闪烁 w_12864(com,0x90+5); break; case 5: //分闪烁 w_12864(com,0x88+5); break; case 6: //时闪烁 w_12864(com,0x88+3); break; } } } if(sum) //功能键按下 { if(!key1) { delay1ms(10); if(!key1) { while(!key1);//等待加1键释放 delay1ms(10); if(sum==1) { //备用 } if(sum==2) { TAB_1302[6]++; if(TAB_1302[6]==100) TAB_1302[6]=0; fenli(2,1,6); w_12864(com,0x90+1);//闪烁归位 } if(sum==3) { TAB_1302[4]++; if(TAB_1302[4]==13) TAB_1302[4]=1; fenli(2,3,4); w_12864(com,0x90+3); } if(sum==4) { TAB_1302[3]++; if(TAB_1302[3]==32) TAB_1302[3]=1; fenli(2,5,3); w_12864(com,0x90+5); } if(sum==5) { TAB_1302[1]++; if(TAB_1302[1]==60) TAB_1302[1]=0; fenli(3,5,1); w_12864(com,0x88+5); } if(sum==6) { TAB_1302[2]++; if(TAB_1302[2]==24) TAB_1302[2]=0; fenli(3,3,2); w_12864(com,0x88+3); } } } if(sum) //功能键按下 { if(!key2) { delay1ms(10); if(!key2) { while(!key2);//等待加1键释放 delay1ms(10); if(sum==1) { } if(sum==2) { TAB_1302[6]--; if(TAB_1302[6]==0) TAB_1302[6]=100; fenli(2,1,6); w_12864(com,0x90+1);//闪烁归位 } if(sum==3) { TAB_1302[4]--; if(TAB_1302[4]==0) TAB_1302[4]=12; fenli(2,3,4); w_12864(com,0x90+3); } if(sum==4) { TAB_1302[3]--; if(TAB_1302[3]==0) TAB_1302[3]=31; fenli(2,5,3); w_12864(com,0x90+5); } if(sum==5) { TAB_1302[1]--; if(TAB_1302[1]==0) TAB_1302[1]=60; fenli(3,5,1); w_12864(com,0x88+5); } if(sum==6) { TAB_1302[2]--; if(TAB_1302[2]==0) TAB_1302[2]=24; fenli(3,3,2); w_12864(com,0x88+3); } } } } } } //============================================================= void init(void) { uchar i; init_12864(); init_1302(); while(TAB1!=' |