ds1302.c

来自「用51写的实时时钟,DS1302做时钟,LCM1602做显示,4个按键,带闹钟.」· C语言 代码 · 共 120 行

C
120
字号
#include "reg51.h"
#include "typedef.h"
#include "lcd.h"
#include "ds1302.h"
#include "key.h"

void	reset_3w();
void	wbyte_3w(uchar);
uchar	rbyte_3w();
void	write_byte(uchar Clock_Add,uchar Clock_Data);
uchar read_byte(uchar);
void write_clock_burst();
void	ds1302_init();
void  ds1302_task();

void reset_3w()	/* ----- reset and enable the 3-wire interface ------ */
{
   SCLK = 0;
   RST = 0;
   RST = 1;
}


void wbyte_3w(uchar W_Byte)	/* ------ write one byte to the device ------- */
{
	uchar i;

	for(i = 0; i < 8; ++i)
	{
		IO = 0;
		if(W_Byte & 0x01)
		{
			IO = 1;	/* set port pin high to read data */
		}
		SCLK = 0;
		SCLK = 1;
		W_Byte >>= 1;
  }
}


uchar	rbyte_3w()	//read one byte from the device 
{
	uchar i;
	uchar R_Byte;
	uchar TmpByte;

	R_Byte = 0x00;
	IO = 1;
	for(i = 0; i < 8; i++)
	{
		SCLK = 1;
		SCLK = 0;
		TmpByte = (uchar)IO;
		TmpByte <<= 7;
		R_Byte >>= 1;
		R_Byte |= TmpByte; 
	}
	return R_Byte;
}


void	write_byte(uchar Clock_Add,uchar Clock_Data)	//write one byte using values entered by user
{
	reset_3w();
	wbyte_3w(Clock_Add);
	wbyte_3w(Clock_Data);
	reset_3w();
}

void write_clock_burst()
{
	reset_3w();
	wbyte_3w(CLOCK_BURST_ADD);	/* clock burst write (eight registers) */
	wbyte_3w(hex2bcd[sec]);
	wbyte_3w(hex2bcd[min]);
	wbyte_3w(hex2bcd[hour]);
	wbyte_3w(hex2bcd[date]);
	wbyte_3w(hex2bcd[month]);
	wbyte_3w(hex2bcd[day_of_week]);
	wbyte_3w(hex2bcd[year]);
	wbyte_3w(0);		/* must write control register in burst mode */
	reset_3w();
}

uchar	read_byte(uchar Clock_Add)	// Read one byte from DS1302
{
	uchar Clock_Data;
	reset_3w();
	wbyte_3w(Clock_Add);
	Clock_Data = rbyte_3w();
	reset_3w();
	return(Clock_Data);
}

void	ds1302_init()	/* --- initialize time & date for default value --- */
/* Note: NO error checking is done on the user entries! */
{
	reset_3w();
	wbyte_3w(0x8e);	// control register
	wbyte_3w(0);		// disable write protect
	reset_3w();
	wbyte_3w(0x90);	// trickle charger register
	wbyte_3w(0xa4);	//enable, 2 diodes, 8K resistor 
	write_clock_burst();   //写入初始化时间
}

void ds1302_task()
{
	//if(!key_enable)
	//{
  	sec = bcd2hex[read_byte(READ_SEC_ADD)];       //读DS1302 sec
		min = bcd2hex[read_byte(READ_MIN_ADD)];     //读DS1302 min
		hour = bcd2hex[read_byte(READ_HOUR_ADD)];   //读DS1302 hour
		date = bcd2hex[read_byte(READ_DATE_ADD)];     //读DS1302 day和day_of_week
		//day_of_week = bcd2hex[read_byte(READ_DOW_ADD)];
		month = bcd2hex[read_byte(READ_MONTH_ADD)];   //读DS1302 month
		year = bcd2hex[read_byte(READ_YEAR_ADD)];    //读DS1302 year
  //}
}

⌨️ 快捷键说明

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