📄 1302.c
字号:
/*******************************************************************************
* 函数名称: 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 + -