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

📄 1302.c

📁 芯片
💻 C
📖 第 1 页 / 共 5 页
字号:

/*------------------------------------------------------------------------------
;          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 + -