📄 1302_2.c
字号:
#include <1302_2.h>
#include <keyboard451.h>
#include <set.h>
static int m;
data_1302 default_date_time ={
0x80, //秒,第七位初始为1,停止计数
0x00, //分
0x00, //时,第七位为零,24小时模式,第六位固定为0,第五位为20小时位,第四位为20小时以下位(1or0),后四位为小时数个位的BCD码
0x02, //日,7,6固定为0,5,4位表示数字十位的BCD码,3,2,1,0位为数字的个位BCD码
0x11, //月
0x04, //星期
0x06 //年
};
data_1302 data_to_1302 = {0};
////////////////////////////////////////////////
set_struct set_pinyin_struct = {
//&data_to_1302,
0,
0
};
//---------------------------------------//
set_struct set_code_struct = {
//&data_to_1302,
0,
0
};
//---------------------------------------//
set_struct set_name_struct = {
//&data_to_1302,
0,
0
};
//---------------------------------------//
set_struct code_flag_struct = {
//&data_to_1302,
0,
0
};
//------------------------------------//
//////////////////////////////////////////
set_struct set_time_struct = {
&data_to_1302,
0
};
set_struct set_date_struct = {
&data_to_1302,
0
};
static void Input_Byte_1302(BYTE d) //向1302写入数据,按位
{
BYTE i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
static BYTE Output_Byte_1302(void) //从1302读数据,按位
{
BYTE i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
static void write_1302(BYTE ucAddr, BYTE ucDa) //写1302
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(ucAddr); /* 地址,命令 */
Input_Byte_1302(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
static BYTE read_1302(BYTE ucAddr) //读1302
{
BYTE ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(ucAddr); /* 地址,命令 */
ucData = Output_Byte_1302(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
***********************************************************************/
void Burstwrite_1302T(BYTE *pWClock) //写1302,多字节
{
BYTE i;
write_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(0xbe); /* 0xbe:时钟多字节写命令 */
for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
Input_Byte_1302(*pWClock); /* 写1Byte数据*/
pWClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
***********************************************************************/
void Burstread_1302T(BYTE *pRClock) //读1302,多字节
{
BYTE i;
write_1302(0x8e,0x00);
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pRClock = Output_Byte_1302(); /* 读1Byte数据 */
pRClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
入口参数:pWReg: 寄存器数据地址
***********************************************************************/
void Burstwrite_1302R(BYTE *pWReg) //写1302寄存器,多字节
{
BYTE i;
write_1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
{
Input_Byte_1302(*pWReg); /* 写1Byte数据*/
pWReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
入口参数:pRReg: 寄存器数据地址
***********************************************************************/
void Burstread_1302R(BYTE *pRReg) //读1302寄存器,多字节
{
BYTE i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
Input_Byte_1302(0xff); /* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pRReg = Output_Byte_1302(); /* 读1Byte数据 */
pRReg++;
}
T_CLK = 1;
T_RST = 0;
}
void Set_1302(data_1302 *pClock) //设置1302
{
BYTE i;
BYTE ucAddr = 0x80;
BYTE *j;
BYTE tem;
j = (BYTE*)pClock;
write_1302(0x8e,0x00);
for(i =7; i>0; i--)
{
tem = *j;
write_1302(ucAddr, tem);
j++;
ucAddr +=2;
}
write_1302(0x8e,0x80);
}
void Get_1302(data_1302 *ucCurtime) //读取1302数据
{
BYTE ucAddr = 0x81;
ucCurtime->second = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->minute = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->hour = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->day = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->month = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->week = read_1302(ucAddr);
ucAddr += 2;
ucCurtime->year = read_1302(ucAddr);
}
void Write_Enable_1302(void) //1302写保护,允许
{
write_1302(0x8e, 0x00);
}
void Write_Disbale_1302(void) //1302写保护,禁止
{
write_1302(0x8e, 0x80);
}
void Work_Start_1302(void) //1302工作,允许
{
BYTE val;
val = read_1302(0x81);
val &= 0x7f; //最高位置零,保留低位数值
Write_Enable_1302();
write_1302(0x80, val);
write_1302(0x90, 0xa5); //涓流充电
Write_Disbale_1302();
}
void get_second_from_1302_data(data_1302 *get_data) //从1302读取秒数据
{
BYTE second_data ;
second_data = (get_data->second);
second_buffer.shiwei = 0x30 + ((second_data >> 4) & 0x07);
second_buffer.gewei = 0x30 + ((get_data->second) & 0x0F);
}
void get_minute_from_1302_data(data_1302 *get_data) //从1302读取分钟数据
{
BYTE minute_data ;
minute_data = (get_data->minute);
minute_buffer.shiwei = 0x30 + ((minute_data >> 4) & 0x07);
minute_buffer.gewei = 0x30 + (minute_data & 0x0F);
}
//注意指定24小时制,小时的十位可以取11否?还是只能是00,01,10,现在的程序是不能取11
void get_hour_from_1302_data(data_1302 *get_data) //从1302读取小时数据
{
BYTE hour_data ;
hour_data = (get_data->hour);
hour_buffer.gewei = 0x30 + (hour_data& 0x0F);
hour_data = ((hour_data >> 4) & 0x03);
/*
if (hour_data < 2)
hour_buffer.shiwei = 0x30 + hour_data;
else
hour_buffer.shiwei = 0x30 + 2;
*/
hour_buffer.shiwei = 0x30 + hour_data;
}
void get_time_from_1302_data(data_1302 *get_data) //读取1302时间数据
{
get_second_from_1302_data(get_data);
get_minute_from_1302_data(get_data);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -