📄 1302.c
字号:
/*------------------------------------------------------------------------------
; Title: VS1302 Function Test/Demo Board
; Programer: Wang Hezuo(王合作)
; Version: 1.0
; Last updated: 2005.11.17
; Target: --------
; Processor: AT89C51(Generic 8031 series),at 12M(30P)
; Display: LCM1602
; Support E-mail: wanghz@vslun.com
; wanghezuo@hotmail.com
; DESCRIPTION:
; This Application Support to Test VS1302
; And Demo & Can Measure Pin Current.
------------------------------------------------------------------------------*/
//#pragma src // 产生汇编文件
#include <reg51.h>
#include <absacc.h>
#include <string.h>
#include <intrins.h>
// =★=★=★=★=★=★= 变量类型标识的宏定义,大家都喜欢这么做 =★=★=★=★=★=★=
#define uchar unsigned char
#define uint unsigned int
#define SomeNOP(); _nop_();_nop_();_nop_();_nop_(); //SomeNOP()使电路有一个稳定的过程
//uchar idata
#define cA 0x41
#define cB 0x42
#define cC 0x43
#define cD 0x44
#define cE 0x45
#define cF 0x46
#define cG 0x47
#define cH 0x48
#define cI 0x49
#define cJ 0x4a
#define cK 0x4b
#define cL 0x4c
#define cM 0x4d
#define cN 0x4e
#define cO 0x4f
#define cP 0x50
#define cQ 0x51
#define cR 0x52
#define cS 0x53
#define cT 0x54
#define cU 0x55
#define cV 0x56
#define cW 0x57
#define cX 0x58
#define cY 0x59
#define cZ 0x5a
#define ca 0x61
#define cb 0x62
#define cc 0x63
#define cd 0x64
#define ce 0x65
#define cf 0x66
#define cg 0x67
#define ch 0x68
#define ci 0x69
#define cj 0x6a
#define ck 0x6b
#define cl 0x6c
#define cm 0x6d
#define cn 0x6e
#define co 0x6f
#define cp 0x70
#define cq 0x71
#define cr 0x72
#define cs 0x73
#define ct 0x74
#define cu 0x75
#define cv 0x76
#define cw 0x77
#define cx 0x78
#define cy 0x79
#define cz 0x7a
#define c0 0x30
#define c1 0x31
#define c2 0x32
#define c3 0x33
#define c4 0x34
#define c5 0x35
#define c6 0x36
#define c7 0x37
#define c8 0x38
#define c9 0x39
code char exampl01[] = "-";
code char exampl02[] = ":";
code char exampl03[] = "Press 1 -- Date ";
code char exampl04[] = "Press 2 -- Time ";
code char exampl05[] = "Enter New Date: ";
code char exampl06[] = "Enter New Time: ";
code char exampl07[] = "Auto Test: ";
code char exampl08[] = "Please Waiting..";
code char exampl09[] = "Test Result: ";
code char exampl10[] = "20__-__-__ _ ";
code char exampl11[] = " __:__:__ ";
code char exampl12[] = "_";
code char exampl13[] = " ";
code char exampl14[] = "OK?";
code char exampl15[] = "ModifyDate RSLT:"; //修改日期
code char exampl16[] = "ModifyTime RSLT:"; //修改时间
code char exampl17[] = " SUCCESS! ";
code char exampl18[] = " CANCEL! ";
code char exampl19[] = "Write RAM 0-31: ";
code char exampl201[] = " Single OK! ";
code char exampl202[] = " Burst OK! ";
code char exampl21[] = "Select TimeMode:";
code char exampl22[] = "12---1 24---2 ";
// LCD1602的控制引脚定义
#define Busy 0x80 // LCD sfr Busy=0x80;
#define DataPort P3 // LCD数据端口
sbit RS = P2^5;
sbit RW = P2^6;
sbit Elcd = P2^7;
// LED的引脚定义
sbit Test_PASS = P2^0; // 测试通过,绿灯
sbit Test_FAIL = P2^1; // 测试失败,红灯
#define LED_ONN 0 // 灯亮
#define LED_OFF 1 // 灯灭
uchar key;
/******************************************************************************/
/* 实时日历/时钟芯片驱动程序 */
/* 实时日历/时钟芯片型号:VS1302 */
/* 实时日历/时钟芯片厂商:北京弗赛尔 */
/* VS1302与单片机之间采用SPI同步串行方式通信 */
/******************************************************************************/
// VS1302的控制引脚定义
sbit T_CLK = P2^2; /*VS1302的时钟线引脚 */
sbit T_IO = P2^3; /*VS1302的数据线引脚 */
sbit T_RST = P2^4; /*VS1302的复位线引脚 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
void v_RTInputByte(uchar ucData);
uchar uc_RTOutputByte(void);
void v_W1302(uchar ucAddr, uchar ucData);
uchar uc_R1302(uchar ucAddr);
void v_BurstW1302T(uchar *pSecDa);
void v_BurstR1302T(uchar *pSecDa);
void v_BurstW1302R(uchar *pReDa);
void v_BurstR1302R(uchar *pReDa);
void v_Set1302(uchar *pSecDa);
void v_Get1302(uchar ucCurtime[]);
/*******************************************************************************
* 函数名称: v_RTInputByte
* 说 明:
* 函数功能: 往VS1302写入1Byte的数据
* 调 用: 无
* 输 入: ucData 是要写入的数据
* 返 回 值: 无
*******************************************************************************/
void v_RTInputByte(uchar ucData)
{
uchar i;
ACC = ucData;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/*******************************************************************************
* 函数名称: uc_RTOutputByte
* 说 明:
* 函数功能: 从VS1302读取1Byte的数据
* 调 用: 无
* 输 入: 无
* 返 回 值: ACC
*******************************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************************************************************
* 函数名称: v_W1302
* 说 明: 先写入地址,后写入命令/数据
* 函数功能: 往VS1302的某地址写入1Byte的数据
* 调 用: v_RTInputByte()
* 输 入: ucAddr: VS1302的地址, ucData: 要写的数据
* 返 回 值: 无
*******************************************************************************/
void v_W1302(uchar ucAddr, uchar ucData)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucData); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/*******************************************************************************
* 函数名称: uc_R1302
* 说 明: 先写入地址,后写入命令/数据
* 函数功能: 读取VS1302某地址的1Byte的数据
* 调 用: v_RTInputByte() , uc_RTOutputByte()
* 输 入: ucAddr: VS1302的地址
* 返 回 值: ucData :读取的数据
*******************************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucData = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucData);
}
/*******************************************************************************
* 函数名称: v_BurstW1302T(写时钟日历寄存器)
* 说 明: 先写入地址,后写入数据(时钟日历多字节方式)
* 函数功能: 往VS1302 写入时钟数据(多字节方式)
* 调 用: v_RTInputByte()
* 输 入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返 回 值: 无
*******************************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
uchar i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写保护允许写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbe); /* 0xbe: 1011 1110 时钟多字节写命令 */
for (i=8;i>0;i--) /* 8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa); /* 写1Byte数据*/
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -