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

Cookies are required to use this site. You must accept them to continue using the site. Learn more…