⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1302_2.c

📁 这是一称的项目原文件,包括T9汉字输入,打印机,24C512,已经引用到产品上
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -