sujingliang 发表于 2023-11-24 21:58:38

STC89C52RC 驱动16x64LED点阵模块驱动记录(五)DS1302时钟

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[] =
{
{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;

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/10;
                        l=DS1302_Time%10;
                       
                       
                        Table_BUFF[(i-3)*16+j]=Table_Number;
                        Table_BUFF[(i-2)*16+j]=Table_Number;
                }
        }
        for(j=0;j<16;j++)
        {
                h=DS1302_Time/10;
               
                //Table_BUFF=Table_Number;
                Table_BUFF=Table_Number;
        }
        for(j=0;j<16;j++)
        {
                //Table_BUFF=Table_Number;
                Table_BUFF=Table_Number;
        }
                for(j=0;j<16;j++)
        {
                //Table_BUFF=Table_Number;
                Table_BUFF=Table_Number;
        }
       
                for(j=0;j<16;j++)
                {
                       
                        l=DS1302_Time%10;
                        //Table_BUFF=Table_Number;
                        Table_BUFF=Table_Number;
               
                }

       
        for(i=5;i<=5;i++)
        {
                for(j=0;j<16;j++)
                {
                        h=DS1302_Time/10;
                        l=DS1302_Time%10;
                        //Table_BUFF[(i+2)*16+j]=Table_Number;
                        //Table_BUFF[(i+1)*16+j]=Table_Number;
                        Table_BUFF[(i+1)*16+j]=Table_Number;
                        Table_BUFF[(i+2)*16+j]=Table_Number;
                }
        }
       
       
}
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++;
                if(DS1302_Time>99){DS1302_Time=0;}
                if(DS1302_Time>12){DS1302_Time=1;}
               
                if(YEAR(DS1302_Time+2000,DS1302_Time)==31)
                {
                        if(DS1302_Time>31){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==30)
                {
                        if(DS1302_Time>30){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==29)
                {
                        if(DS1302_Time>29){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==28)
                {
                        if(DS1302_Time>28){DS1302_Time=1;}
                }
               
                if(DS1302_Time>24){DS1302_Time=0;}
                if(DS1302_Time>59){DS1302_Time=0;}
                if(DS1302_Time>59){DS1302_Time=0;}
        }
        //减小更改位的数,并判断是否越界
        if(KeyNumber == 4)
        {
                DS1302_Time--;
                if(DS1302_Time>100){DS1302_Time=99;}
                if(DS1302_Time<1){DS1302_Time=12;}
               
                if(YEAR(DS1302_Time+2000,DS1302_Time)==31)
                {
                        if(DS1302_Time<1){DS1302_Time=31;}
                        if(DS1302_Time>31){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==30)
                {
                        if(DS1302_Time<1){DS1302_Time=30;}
                        if(DS1302_Time>30){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==29)
                {
                        if(DS1302_Time<1){DS1302_Time=29;}
                        if(DS1302_Time>29){DS1302_Time=1;}
                }
                if(YEAR(DS1302_Time+2000,DS1302_Time)==28)
                {
                        if(DS1302_Time<1){DS1302_Time=28;}
                        if(DS1302_Time>28){DS1302_Time=1;}
                }
               
                if(DS1302_Time>100){DS1302_Time=24;}
                if(DS1302_Time>100){DS1302_Time=59;}
                if(DS1302_Time>100){DS1302_Time=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));
        DS1302_WriteByte(DS1302_MONTH,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_DATE,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_HOUR,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_MINUTE,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_SECOND,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_DAY,BCD_10(DS1302_Time));
        DS1302_WriteByte(DS1302_WP,0x80);
}

/**
* @brief读出数组内容
* @param
* @retval
*/
void DS1302_ReadTime(){
       
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_YEAR));
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_MONTH));
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_DATE));
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_HOUR));
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_MINUTE));
        DS1302_Time=Ten_BCD(DS1302_ReadByte(DS1302_SECOND));
        DS1302_Time=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();


#endif4、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

页: [1]
查看完整版本: STC89C52RC 驱动16x64LED点阵模块驱动记录(五)DS1302时钟