1.main.c
- #include <STC89C5xRC.H>
-
- #include <intrins.h>
- #include <absacc.h>
- #include "ds1302.h"
- #include "Timer0.h"
-
- #define FLASH_ADDR_BASE 0x0000
-
- sbit SH_CP = P1^5;
- sbit DS = P2^7;
- sbit ST_CP = P1^6;
-
- typedef unsigned int Uint16;
- typedef unsigned char Uint8;
-
- unsigned char code Table_Number[][16] =
- {
- {0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF},/*"0",0*/
-
- {0xFF,0xFF,0xC1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF1,0xF7,0xFF,0xFF,0xFF},/*"1",1*/
-
- {0xFF,0xFF,0x81,0xBD,0xFB,0xF7,0xEF,0xDF,0xDF,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"2",2*/
-
- {0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xBF,0xDF,0xE7,0xDF,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"3",3*/
-
- {0xFF,0xFF,0x87,0xDF,0xDF,0x81,0xDD,0xDD,0xDB,0xDB,0xD7,0xCF,0xDF,0xFF,0xFF,0xFF},/*"4",4*/
-
- {0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xBF,0xD9,0xE5,0xFD,0xFD,0xFD,0x81,0xFF,0xFF,0xFF},/*"5",5*/
-
- {0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,0xFF},/*"6",6*/
-
- {0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xEF,0xEF,0xDD,0xDD,0x81,0xFF,0xFF,0xFF},/*"7",7*/
-
- {0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"8",8*/
-
- {0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF},/*"9",9*/
-
- {0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*":",10*/
-
- };
-
- unsigned char xdata Table_BUFF[128];
-
- unsigned char KeyNumber,MODE,TimeSetSelect,TimeSetFlashFlag;
- void TimeSet();
- unsigned char YEAR(unsigned char year,month);
-
- void delayms(unsigned int m)
- {
- int i,j;
- for(i=0; i<m; i++)
- for(j=0; j<120; j++);
- }
-
-
- void HC595(unsigned char dat)
- {
- unsigned char j;
- for(j=0;j<8;j++)
- {
- SH_CP = 0; //为移位准备
- DS = dat & 0x01; //先低位
- dat=dat>>1;
- SH_CP =1; //上升沿,移位
- }
- }
-
-
- void Matrix16x16(unsigned char num)
- {
- unsigned char k,i;
- unsigned int m,n;
- unsigned char Char_num=num*32;
-
- // for(m=0;m<Char_num;m++)
- // {
-
- for(n=0;n<32;n++)
- {
- for(k=0;k<16;k++)
- {
-
- for(i=0;i<num;i++)
- {
- HC595(Table_BUFF[(16*2*i+k)]); //下半部分,不动
- HC595(Table_BUFF[(16*(2*i+1)+k)]); //上半部分,不动
- }
-
- ST_CP = 0;
- ST_CP = 1; //并行输出
- P1=k;
- //P1=0xFF;
- //delayms(1);
- }
- }
- //}
- }
-
-
- void makeTimeString(){
- Uint8 i,j;
- Uint8 h,l;
- for(i=3;i<=3;i++)
- {
- for(j=0;j<16;j++)
- {
- h=DS1302_Time[i]/10;
- l=DS1302_Time[i]%10;
-
-
- Table_BUFF[(i-3)*16+j]=Table_Number[h][j];
- Table_BUFF[(i-2)*16+j]=Table_Number[l][j];
- }
- }
- for(j=0;j<16;j++)
- {
- h=DS1302_Time[i]/10;
-
- //Table_BUFF[32+j]=Table_Number[h][j];
- Table_BUFF[48+j]=Table_Number[h][j];
- }
- for(j=0;j<16;j++)
- {
- //Table_BUFF[48+j]=Table_Number[10][j];
- Table_BUFF[32+j]=Table_Number[10][j];
- }
- for(j=0;j<16;j++)
- {
- //Table_BUFF[64+j]=Table_Number[10][j];
- Table_BUFF[80+j]=Table_Number[10][j];
- }
-
- for(j=0;j<16;j++)
- {
-
- l=DS1302_Time[i]%10;
- //Table_BUFF[80+j]=Table_Number[l][j];
- Table_BUFF[64+j]=Table_Number[l][j];
-
- }
-
-
- for(i=5;i<=5;i++)
- {
- for(j=0;j<16;j++)
- {
- h=DS1302_Time[i]/10;
- l=DS1302_Time[i]%10;
- //Table_BUFF[(i+2)*16+j]=Table_Number[h][j];
- //Table_BUFF[(i+1)*16+j]=Table_Number[l][j];
- Table_BUFF[(i+1)*16+j]=Table_Number[h][j];
- Table_BUFF[(i+2)*16+j]=Table_Number[l][j];
- }
- }
-
-
- }
- void main(){
-
- DS1302_Init();
- //Timer0_Init();
- DS1302_SetTime();
-
- while(1){
- DS1302_ReadTime();
- makeTimeString();
- Matrix16x16(4);
- //delayms(100);
- }
- }
-
-
-
- //定时器
- void Timer0_Routine() interrupt 1
- {
- static unsigned int count0 = 0;
- TL0 = 0x18; //设置定时初值
- TH0 = 0xFC; //设置定时初值
- count0++;
- //if(count0 == 600){
- if(count0 == 600){
- count0 = 0;
- //TimeSetFlashFlag=!TimeSetFlashFlag;
- DS1302_ReadTime();
- makeTimeString();
- Matrix16x16(4);
- }
-
- }
-
-
- //修改
- void TimeSet(){
- //选择需要更改的位
- if(KeyNumber == 2)
- {
- TimeSetSelect++;
- TimeSetSelect%=6;
- }
- //增加更改位的数,并判断是否越界
- if(KeyNumber == 3)
- {
- DS1302_Time[TimeSetSelect]++;
- if(DS1302_Time[0]>99){DS1302_Time[0]=0;}
- if(DS1302_Time[1]>12){DS1302_Time[1]=1;}
-
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
- {
- if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
- {
- if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
- {
- if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
- {
- if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
- }
-
- if(DS1302_Time[3]>24){DS1302_Time[3]=0;}
- if(DS1302_Time[4]>59){DS1302_Time[4]=0;}
- if(DS1302_Time[5]>59){DS1302_Time[5]=0;}
- }
- //减小更改位的数,并判断是否越界
- if(KeyNumber == 4)
- {
- DS1302_Time[TimeSetSelect]--;
- if(DS1302_Time[0]>100){DS1302_Time[0]=99;}
- if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
-
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
- {
- if(DS1302_Time[2]<1){DS1302_Time[2]=31;}
- if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
- {
- if(DS1302_Time[2]<1){DS1302_Time[2]=30;}
- if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
- {
- if(DS1302_Time[2]<1){DS1302_Time[2]=29;}
- if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
- }
- if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
- {
- if(DS1302_Time[2]<1){DS1302_Time[2]=28;}
- if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
- }
-
- if(DS1302_Time[3]>100){DS1302_Time[3]=24;}
- if(DS1302_Time[4]>100){DS1302_Time[4]=59;}
- if(DS1302_Time[5]>100){DS1302_Time[5]=59;}
- }
-
- }
-
-
- //闰年判断,月份天数判断
- unsigned char YEAR(unsigned char year,month){
- if(year%400==0||year%4==0&&year%100!=0)
- {
- if(month==2)
- return 29;
- }
- else
- {
- if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
- return 31;
- else if(month==4||month==6||month==9||month==11)
- return 30;
- else
- return 28;
- }
- return 0;
- }
复制代码
2、ds1302.c
- #include <STC89C5xRC.H>
-
- #define DS1302_SECOND 0x80
- #define DS1302_MINUTE 0x82
- #define DS1302_HOUR 0x84
- #define DS1302_DATE 0x86
- #define DS1302_MONTH 0x88
- #define DS1302_DAY 0x8A
- #define DS1302_YEAR 0x8C
- #define DS1302_WP 0x8E
-
- sbit DS1302_SCLK=P1^7;
- sbit DS1302_IO=P2^7;
- sbit DS1302_CE=P3^5;
-
- unsigned char DS1302_Time[]={23,04,22,21,51,00,6};
-
-
- /**
- * @brief BCD转10进制
- * @param
- * @retval
- */
- unsigned char BCD_10(unsigned char Num){
- unsigned char Temp;
- Temp = Num/10*16+Num%10;
- return Temp;
- }
-
- /**
- * @brief 10进制转BCD码
- * @param
- * @retval
- */
- unsigned char Ten_BCD(unsigned char Num){
- unsigned char Temp;
- Temp = Num/16*10+Num%16;
- return Temp;
- }
-
- /**
- * @brief 初始化DS1302
- * @param
- * @retval
- */
- void DS1302_Init(){
- DS1302_SCLK=0;
- DS1302_CE=0;
- }
-
-
-
-
-
- /**
- * @brief 写入字节
- * @param
- * @retval
- */
- void DS1302_WriteByte(unsigned char Command,Data){
- unsigned char i;
- DS1302_CE=1;
-
-
- for(i=0;i<8;i++){
- DS1302_IO=Command&(0x01<<i);
- DS1302_SCLK=1;
- DS1302_SCLK=0;
- }
- for(i=0;i<8;i++){
- DS1302_IO=Data&(0x01<<i);
- DS1302_SCLK=1;
- DS1302_SCLK=0;
- }
- DS1302_CE=0;
- }
-
- /**
- * @brief 读取字节
- * @param
- * @retval
- */
- unsigned char DS1302_ReadByte(unsigned char Command){
-
- unsigned char i,Data=0x00;
- Command|=0x01;
- DS1302_CE=1;
- for(i=0;i<8;i++){
- DS1302_IO=Command&(0x01<<i);
- DS1302_SCLK=0;
- DS1302_SCLK=1;
- }
- for(i=0;i<8;i++){
- DS1302_SCLK=1;
- DS1302_SCLK=0;
- if(DS1302_IO){Data|=(0x01<<i);}
- }
- DS1302_CE=0;
- DS1302_IO=0;
- return Data;
- }
-
- /**
- * @brief 将数组内容写入
- * @param
- * @retval
- */
- void DS1302_SetTime(){
- DS1302_WriteByte(DS1302_WP,0x00);
- DS1302_WriteByte(DS1302_YEAR,BCD_10(DS1302_Time[0]));
- DS1302_WriteByte(DS1302_MONTH,BCD_10(DS1302_Time[1]));
- DS1302_WriteByte(DS1302_DATE,BCD_10(DS1302_Time[2]));
- DS1302_WriteByte(DS1302_HOUR,BCD_10(DS1302_Time[3]));
- DS1302_WriteByte(DS1302_MINUTE,BCD_10(DS1302_Time[4]));
- DS1302_WriteByte(DS1302_SECOND,BCD_10(DS1302_Time[5]));
- DS1302_WriteByte(DS1302_DAY,BCD_10(DS1302_Time[6]));
- DS1302_WriteByte(DS1302_WP,0x80);
- }
-
- /**
- * @brief 读出数组内容
- * @param
- * @retval
- */
- void DS1302_ReadTime(){
-
- DS1302_Time[0]=Ten_BCD(DS1302_ReadByte(DS1302_YEAR));
- DS1302_Time[1]=Ten_BCD(DS1302_ReadByte(DS1302_MONTH));
- DS1302_Time[2]=Ten_BCD(DS1302_ReadByte(DS1302_DATE));
- DS1302_Time[3]=Ten_BCD(DS1302_ReadByte(DS1302_HOUR));
- DS1302_Time[4]=Ten_BCD(DS1302_ReadByte(DS1302_MINUTE));
- DS1302_Time[5]=Ten_BCD(DS1302_ReadByte(DS1302_SECOND));
- DS1302_Time[6]=Ten_BCD(DS1302_ReadByte(DS1302_DAY));
- }
复制代码
3、ds1302.h
- #ifndef __SD1302_H__
- #define __SD1302_H__
-
- extern unsigned char DS1302_Time[];
-
- void DS1302_Init();
- void DS1302_ReadTime();
- void DS1302_SetTime();
-
-
- #endif
复制代码
4、timer0.c
- #include <STC89C5xRC.H>
-
- void Timer0_Init(void) //1毫秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x18; //设置定时初值
- TH0 = 0xFC; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- EA = 1;
- PT0 = 0;
- }
复制代码
5、timer0.h
- #ifndef __TIMER0_H__
- #define __TIMER0_H__
-
- void Timer0_Init(void);
-
- #endif
复制代码
|