Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Code for HT1380 in C Language

Status
Not open for further replies.
also read datasheet HT1380 and DS1302
Code:
#include	<stdio.h>
#include	< reg51.h>		
sbit CE   = P0^0;
sbit SCLK = P0^1;
sbit IO   = P0^2;
/***************************************************************************/
/* Prototypes                                                              */
/***************************************************************************/
uchar	rbyte_3w();
void	reset_3w();
void	wbyte_3w(uchar);
void	writebyte();
void	write_clk_regs();
void	read_clk_regs();
void	burstramrd();
void	burstramwr();
/***************************************************************************/
void reset_3w()	/* ----- reset and enable the 3-wire interface ------ */
{
   SCLK = 0;
   CE = 0;
   CE = 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	writebyte()	/* --- write one byte using values entered by user --- */
{
uchar ClkAdd;
uchar ClkData;

	/* Get Clock Address & Data */
	printf("\nEnter register write address (hex): ");
	scanf("%bx", &ClkAdd);
	printf("Enter data (hex): ");
	scanf("%bx", &ClkData);

	reset_3w();
	wbyte_3w(ClkAdd);
	wbyte_3w(ClkData);
	reset_3w();
}
void read_clk_regs()	/* ---- loop read & display clock registers ---- */
{
uchar prev_sec = 99, sec, min, hrs, dte, mon, day, yr;

	printf("\nYr/Mn/Dt Dy Hr/Mn/Sec");
	do	/* Read & Display Clock Registers */
	{
		reset_3w();
		wbyte_3w(0xBF);	/* clock burst */
		sec = rbyte_3w();
		min = rbyte_3w();
		hrs = rbyte_3w();
		dte = rbyte_3w();
		mon = rbyte_3w();
		day = rbyte_3w();
		yr  = rbyte_3w();
		reset_3w();
		if(sec != prev_sec)	/* print once per second */
		{
			printf("\n%02bX/%02bX/%02bX %02bX", yr, dte, mon, day);
			printf(" %02bX:%02bX:%02bX", hrs, min, sec);
			prev_sec = sec;
		}
	}	while(!RI);
	RI = 0;	/* clear read buffer */
}
void burstramrd()	/* ----------- read RAM in burst mode --------------- */
{
uchar i;

	printf("\nDS1302 Ram");

	reset_3w();
	wbyte_3w(0xFF);	/* RAM burst read */
	for (i = 0; i < 31; i++)
	{
		if(!(i % 8)) printf("\n");
		printf("%2.bX ", rbyte_3w() );
	}
	reset_3w();
}
void burstramwr()	/* ---- write one value entire RAM in burst mode ---- */
{
uchar ramdata;
uchar	i;

	printf("\nWrite Ram DATA (HEX):");		/* Get Ram Data */
	scanf("%bx", &ramdata);

	reset_3w();
	wbyte_3w(0xfe);	/* RAM burst write */
	for (i=0; i<31; ++i)
	{
		wbyte_3w(ramdata);
	}
	reset_3w();
}
void	write_clk_regs()	/* --- initialize time & date from user entries --- */
/* Note: NO error checking is done on the user entries! */
{
uchar	yr, mn, date, dy, hr, min, sec, day;

	printf("\nEnter the year (0-99): ");
	scanf("%bx", &yr);
	printf("Enter the month (1-12): ");
	scanf("%bx", &mn);
	printf("Enter the date (1-31): ");
	scanf("%bx", &date);
	printf("Enter the day (1-7): ");
	scanf("%bx", &dy);
	printf("Enter the hour (1-24): ");
	scanf("%bx", &hr);
	hr = hr & 0x3f;	/* force clock to 24 hour mode */
	printf("Enter the minute (0-59): ");
	scanf("%bx", &min);
	printf("Enter the second (0-59): ");
	scanf("%bx", &sec);

	reset_3w();
	wbyte_3w(0x8e);	/* control register */
	wbyte_3w(0);		/* disable write protect */
	reset_3w();
	wbyte_3w(0x90);	/* trickle charger register */
	wbyte_3w(0xab);	/* enable, 2 diodes, 8K resistor */
	reset_3w();
	wbyte_3w(0xbe);	/* clock burst write (eight registers) */
	wbyte_3w(sec);
	wbyte_3w(min);
	wbyte_3w(hr);
	wbyte_3w(date);
	wbyte_3w(mn);
	wbyte_3w(dy);
	wbyte_3w(yr);
	wbyte_3w(0);		/* must write control register in burst mode */
	reset_3w();
}
main	(void)	/* ---------------------------------------------- */
{
uchar	M, M1;

	while (1)
	{ 
	printf("\nDS1302 build: %s\n", __DATE__);
	printf("CW Clock Write CR Clock Read\n");
	printf("RW RAM Write   RR RAM Read\n");
	printf("W  Write byte\n");
	printf("Enter Menu Selection: ");

	M = _getkey();

	switch(M) 
	{
		case 'C':
		case 'c':
		printf("\rEnter Clock Routine to run:C");
		M1 = _getkey();

		switch(M1) 
            {
			case 'R':
			case 'r':	read_clk_regs();	break;

			case 'W':
			case 'w':	write_clk_regs();	break;
		}
		break;

		case 'R':
		case 'r':
		printf("\rEnter Ram Routine to run:R");
		M1 = _getkey();

		switch(M1) 
		{
			case 'R':
			case 'r':	burstramrd();	break;

			case 'W':
			case 'w':	burstramwr();	break;
		}
		break;

		case 'W':
		case 'w':	writebyte();	break;
	}
   }
}
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top