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]