ds1302.c
来自「本人做的一款LED控制程序」· C语言 代码 · 共 239 行
C
239 行
/*----------------------------------------------
DS1302读写一体化C51源程序
何代仁 2005-6-20
------------------------------------------------*/
sbit SCLK = P1^5;
sbit IO = P1^6;
sbit RSTB = P1^7;
/******************函数原型说明******************/
void clkwritebyte(); //时钟字节写入函数
void ramwritebyte(); //RAM字节写入函数
Uchar rbyte_3w(); //字节读入函数
void reset_3w(); //复位函数
void wbyte_3w(Uchar); //字节写入函数
void initialize_DS1302(); //DS1302初始化函数
void disp_clk_regs(Uchar); //显示时钟寄存器内容函数
void burstramrd(); //多字节突发方式读取RAM函数
void burstramwr(); //多字节突发方式写入RAM函数
/****************复位函数*************************/
void reset_3w() {
SCLK = 0;
RSTB = 0;
RSTB = 1;
}
/*****************字节写入函数********************/
void wbyte_3w(Uchar W_Byte) {
Uchar i;
for(i = 0;i < 8; ++i) {
IO = 0;
if(W_Byte & 0x01) IO = 1;
SCLK = 0;
SCLK = 1;
W_Byte >>= 1;
}
}
/*****************字节读取函数********************/
Uchar rbyte_3w() {
Uchar i;
Uchar R_Byte;
Uchar TmpByte;
R_Byte = 0;
IO = 1;
for(i=0; i<8; ++i) {
SCLK = 1;
SCLK = 0;
TmpByte = (Uchar)IO;
TmpByte <<= 7;
R_Byte >>= 1;
R_Byte |= TmpByte;
}
return (R_Byte);
}
/*****************时钟字节写入函数********************/
/*
void clkwritebyte() {
Uchar ClkAdd;
Uchar ClkData;
printf("\nWrite Clock ADDRESS:");
scanf("%bu", &ClkAdd); // 输入时钟地址
printf("\nWrite Clock DATA:");
scanf("%bx", &ClkData); // 输入时钟数据
ClkAdd = ((ClkAdd * 2) | 0x80); //时钟数据写入命令
reset_3w();
wbyte_3w(ClkAdd);
wbyte_3w(ClkData);
reset_3w();
}
/*****************RAM字节写入函数********************/
/*
void ramwritebyte() {
Uchar ramadd;
Uchar ramdata;
printf("\nWrite Ram ADDRESS (HEX):");
scanf("%bx", &ramadd); //输入RAM地址
printf("\nWrite Ram DATA (HEX):");
scanf("%bx", &ramdata); //输入RAM数据
ramadd = ((ramadd * 2) | 0xc0); //RAM数据写入命令
reset_3w();
wbyte_3w(ramadd);
wbyte_3w(ramdata);
reset_3w();
} */
/*****************显示时钟寄存器内容函数********************/
/*
void disp_clk_regs(Uchar loop) {
Uchar lsec = 99, sec, min, hrs, dte, mon, day, yr;
do { //读取并显示时钟寄存器内容
reset_3w();
wbyte_3w(0xbf); //以多字节突发方式读取时钟数据
sec = rbyte_3w(); //秒
min = rbyte_3w(); //分
hrs = rbyte_3w(); //小时
dte = rbyte_3w(); //日期
mon = rbyte_3w(); //月份
day = rbyte_3w(); //星期
yr = rbyte_3w(); //年
reset_3w();
}
}
*/
/******************多字节突发方式读取RAM函数******************/
/*void burstramrd() {
Uchar rmary[31];
Uchar i;
reset_3w();
wbyte_3w(0xff);
for (i=0; i<31; ++i) {
rmary[i] = rbyte_3w();
}
reset_3w();
} */
/******************多字节突发方式写入RAM函数******************/
/*
void burstramwr() {
Uchar ramdata;
Uchar i;
reset_3w();
wbyte_3w(0xfe); //以多字节突发方式写入RAM
for (i=0; i<31 ;++i) {
wbyte_3w(ramdata);
}
reset_3w();
}
/***********************DS1302初始化函数**********************/
Uchar BCD2HEX(Uchar d) {
Uchar d1;
d1 = d >> 4 & 0x0f;
d1 = d1 * 10 ;
d = d1 + (d & 0x0f);
return(d);
}
Uchar HEX2BCD (Uchar d) {
Uchar d1,d2;
d1 = d / 10 << 4;
d2 = d % 10;
d = d1 | d2;
return (d) ;
}
void initialize_DS1302() {
Uchar yr, mn, date, dy, hr, min, sec,menu;
reset_3w();
wbyte_3w(0xbf); //以多字节突发方式读取时钟数据
sec = BCD2HEX(rbyte_3w()); //秒
min = BCD2HEX(rbyte_3w()); //分
hr = BCD2HEX(rbyte_3w()); //小时
date = BCD2HEX(rbyte_3w()); //日期
mn = BCD2HEX(rbyte_3w()); //月份
dy = BCD2HEX(rbyte_3w()); //星期
yr = BCD2HEX(rbyte_3w()); //年
reset_3w();
while(1) {
if(key_e==1){key_e=0; menu++; if(menu>=7)menu=0;Discmd=1;}
if(menu==0)yr=Getkey(yr,99);
if(menu==1)mn=Getkey(mn,12);
if(menu==2)date=Getkey(date,31);
if(menu==3)dy=Getkey(dy,7);
if(menu==4)hr=Getkey(hr,24);
if(menu==5)min=Getkey(min,59);
if(menu==6)sec=Getkey(sec,59);
if(key_c == 1){key_c = 0; goto oc;}
if(Discmd == 1){
Uchar a,b;
Discmd = 0;
ePutstr(0,0,"20 - - W ");
ePutstr(0,1," : : ");
a = yr/10;
b = yr%10;
DispOneChar(2,0,a+0x30);
DispOneChar(3,0,b+0x30);
a = mn/10;
b = mn%10;
DispOneChar(5,0,a+0x30);
DispOneChar(6,0,b+0x30);
a = date/10;
b = date%10;
DispOneChar(8,0,a+0x30);
DispOneChar(9,0,b+0x30);
b = dy%10;
DispOneChar(13,0,b+0x30);
a = hr/10;
b = hr%10;
DispOneChar(0,1,a+0x30);
DispOneChar(1,1,b+0x30);
a = min/10;
b = min%10;
DispOneChar(3,1,a+0x30);
DispOneChar(4,1,b+0x30);
a = sec/10;
b = sec%10;
DispOneChar(6,1,a+0x30);
DispOneChar(7,1,b+0x30);
if(menu==0)Coruscant(3,0);
if(menu==1)Coruscant(6,0);
if(menu==2)Coruscant(9,0);
if(menu==3)Coruscant(13,0);
if(menu==4)Coruscant(1,1);
if(menu==5)Coruscant(4,1);
if(menu==6)Coruscant(7,1);
}
}
oc: ePutstr(0,0,"Save OK ");
Menu2 = 0;
reset_3w();
wbyte_3w(0x8e); //写保护控制寄存器
wbyte_3w(0); //允许写入
reset_3w();
wbyte_3w(0x90); //涡流充电控制寄存器
wbyte_3w(0xab); //允许充电,双二极管,8K电阻
reset_3w();
wbyte_3w(0xbe); //多字节突发方式写入时钟数据(8个字节)
wbyte_3w(HEX2BCD(sec));
wbyte_3w(HEX2BCD(min));
wbyte_3w(HEX2BCD(hr));
wbyte_3w(HEX2BCD(date));
wbyte_3w(HEX2BCD(mn));
wbyte_3w(HEX2BCD(dy));
wbyte_3w(HEX2BCD(yr));
wbyte_3w(0); //以多字节突发方式写入时钟数据时
//必须对写保护控制寄存器写入0值
reset_3w();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?