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

📄 1302.c

📁 芯片
💻 C
📖 第 1 页 / 共 5 页
字号:
/*******************************************************************************
* 函数名称: v_BurstR1302T(读时钟日历寄存器)
* 说    明: 先写入地址,后读出命令/数据(时钟日历多字节方式)
* 函数功能: 读取VS1302 时钟数据
* 调    用: v_RTInputByte() , uc_RTOutputByte()
* 输    入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
*           7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返 回 值: ucData :读取的数据
*******************************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
        uchar i;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xbf);              /* 0xbf: 1011 1111 时钟多字节读命令 */
        for (i=8; i>0; i--)
        {
                *pSecDa = uc_RTOutputByte();                   /* 读1Byte数据 */
                pSecDa++;
         }
         T_CLK = 1;
         T_RST =0;
}


/*******************************************************************************
* 函数名称: v_BurstW1302R(写RAM寄存器)
* 说    明: 先写入地址,后写入数据(寄存器RAM多字节方式)
* 函数功能: 往VS1302 RAM寄存器数写入数据(多字节方式)
* 调    用: v_RTInputByte()
* 输    入: pReDa: 寄存器数据地址
* 返 回 值: 无
*******************************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
        uchar i;
        v_W1302(0x8e,0x00);                  /* 控制命令,WP=0,写保护允许写操作*/
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xfe);               /* 0xfe: 1111 1110 RAM多字节写命令 */
        for (i=31;i>0;i--)                                /*31Byte 寄存器数据 */
        {
                v_RTInputByte(*pReDa);                          /* 写1Byte数据*/
                pReDa++;
        }
        T_CLK = 1;
        T_RST =0;
}


/*******************************************************************************
* 函数名称: uc_BurstR1302R(读RAM寄存器)
* 说    明: 先写地址,后读命令/数据(寄存器RAM多字节方式)
* 函数功能: 读取VS1302 RAM寄存器数据
* 调    用: v_RTInputByte() , uc_RTOutputByte()
* 输    入: pReDa: 寄存器数据地址
* 返 回 值: 无(直接写入数组中)
*******************************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
        uchar i;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xff);               /* 0xff: 1111 1111 RAM多字节读命令 */
        for (i=31; i>0; i--)                              /*31Byte 寄存器数据 */
        {
                *pReDa = uc_RTOutputByte();                    /* 读1Byte数据 */
                pReDa++;
        }
        T_CLK = 1;
        T_RST =0;
}


/*******************************************************************************
* 函数名称: v_Set1302
* 说    明: 把数组里的数据设置到VS1302的时钟日历寄存器中
* 函数功能: 设置VS1302 初始时间
* 调    用: v_W1302()
* 输    入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
*           7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返 回 值: 无
*******************************************************************************/
void v_Set1302(uchar *pSecDa)
{
        uchar i;
        uchar ucAddr = 0x80;
        v_W1302(0x8e,0x00);                           /* 控制命令,WP=0,写操作 */
        for(i =7;i>0;i--)
        {
                v_W1302(ucAddr,*pSecDa);            /* 秒 分 时 日 月 星期 年 */
                pSecDa ++;
                ucAddr +=2;
        }
        v_W1302(0x8e,0x80);                           /* 控制命令,WP=1,写保护 */
}


/*******************************************************************************
* 函数名称: v_Get1302
* 说    明: 把VS1302的时钟日历寄存器中的数据读出存到一个数组里
* 函数功能: 读取VS1302 当前时间
* 调    用: uc_R1302()
* 输    入: ucCurtime: 保存当前时间地址。时间格式为: 秒 分 时 日 月 星期 年
*           7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返 回 值: 无
*******************************************************************************/
void v_Get1302(uchar ucCurtime[])
{
        uchar i;
        uchar ucAddr = 0x81;
        for (i=0;i<7;i++)
        {
                ucCurtime[i] = uc_R1302(ucAddr);    /* 秒 分 时 日 月 星期 年 */
                ucAddr += 2;
        }
}





// =★=★=★=★=★=★=★=★=★= LCD1602显示驱动程序 =★=★=★=★=★=★=★=★=★=

/*=============================================================================
            LCD1602字符液晶屏显示驱动程序

连接线图:   LCM-------51     LCM-------51     LCM--------51
            DB0-----P0.0     DB4-----P0.4     RS-------P2.0
            DB1-----P0.1     DB5-----P0.5     RW-------P2.1
            DB2-----P0.2     DB6-----P0.6     E--------P2.7
            DB3-----P0.3     DB7-----P0.7     VLCD接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHz
==============================================================================*/

void Delay5ms(void);
void Delay10ms(void );
void Delay200ms(void);
void Delay400ms(void);
void ePutstr(uchar x,uchar y, uchar code *ptr);
void Display( uchar dd );
void Disp_XY( char posx,char posy);
void DispOneChar(uchar x,uchar y,uchar Wdata);
void LcdInitial( void );
void LcdWriteCommand( uchar CMD,uchar AttribC );
void LcdWriteData( char dataW );
void WaitForEnable( void );
void LcdClear(void );
void LCD_LOGO(void );


// =★=★=★=★=★=★=★=★=★=★= 短延时 5ms =★=★=★=★=★=★=★=★=★=★=
void Delay5ms(void)
{
    	uint i = 5552;
    	while(i--);
}


// =★=★=★=★=★=★=★=★=★=★= 短延时 10ms =★=★=★=★=★=★=★=★=★=★=
void Delay10ms(void )
{
     	uchar i;
     	for(i = 200;i>0;i--) { }
}


// =★=★=★=★=★=★=★=★=★=★= 长延时 200ms =★=★=★=★=★=★=★=★=★=★=
void Delay200ms(void)
{
    	uchar i = 5;
    	uint  j;
    	while(i--)
    	{
        	j=3634;
        	while(j--);
    	};
}

// =★=★=★=★=★=★=★=★=★=★= 长延时 400ms =★=★=★=★=★=★=★=★=★=★=
void Delay400ms(void)
{
    	uchar i = 5;
    	uint  j;
    	while(i--)
    	{
        	j=7269;
        	while(j--);
    	};
}

/*==============================================================================
从指定位置显示字符串
x:0-15  y:0-1
==============================================================================*/
void ePutstr(uchar x,uchar y, uchar code *ptr)
{
	uchar i,l=0;

	while (ptr[l] > 31) {l++;};
    	for (i=0;i<l;i++)
    	{
        	DispOneChar(x++,y,ptr[i]);
        	if ( x == 16 )
        	{
            		x  = 0;
            		y ^= 1;
        	}
    	}
}


/*==============================================================================
演示一行连续字符串,配合上位程序演示移动字串
==============================================================================*/
void Display( uchar dd )
{
    	uchar i;

    	for (i=0;i<16;i++)
    	//for (i=15;i<0;i--)
    	{
        	DispOneChar(i,1,dd++);
                Delay200ms();
        	dd &= 0x7f;
        	if (dd<32) dd=32;
    	}
}


/*==============================================================================
显示光标定位  (x 0-15 ; y 0-1)
==============================================================================*/
void Disp_XY( char posx,char posy)
{
    	uchar temp;

    	temp = posx & 0xf;
    	posy &= 0x1;
    	if ( posy )temp |= 0x40;
    	temp |= 0x80;
    	LcdWriteCommand(temp,0);
}


/*==============================================================================
按指定位置显示数出一个字符
==============================================================================*/
void DispOneChar(uchar x,uchar y,uchar Wdata)
{
        Disp_XY( x, y );                                 // 定位显示地址
        LcdWriteData( Wdata );                           // 写字符
}


/*==============================================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
==============================================================================*/
void LcdInitial( void )
{
        Delay5ms();Delay5ms();Delay5ms();               // 延时15ms
        LcdWriteCommand( 0x38, 0);                      // 显示模式设置(不检测忙信号)
        Delay5ms();                                     // 延时5ms
        LcdWriteCommand( 0x38, 0);                      // 共三次
        Delay5ms();
        LcdWriteCommand( 0x38, 0);
        //Delay5ms();

        LcdWriteCommand( 0x38, 1);                      // 显示模式设置(以后均检测忙信号)
        LcdWriteCommand( 0x08, 1);                      // 显示关闭
        LcdWriteCommand( 0x01, 1);                      // 显示清屏
        LcdWriteCommand( 0x06, 1);                      // 显示光标移动设置
        LcdWriteCommand( 0x0c, 1);                      // 显示开及光标设置
}


/*==============================================================================
写控制字符子程序: E=1 RS=0 RW=0                    写指令
==============================================================================*/
void LcdWriteCommand( uchar CMD,uchar AttribC )
{

        if (AttribC) WaitForEnable();                   // 检测忙信号?
        RS = 0;  RW = 0; _nop_();_nop_();
        DataPort = CMD; _nop_();_nop_();
        // 送控制字子程序

        Elcd = 1; _nop_();_nop_(); Elcd = 0;            // 操作允许脉冲信号
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -