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

📄 ht1380.c

📁 时钟芯片HT1380
💻 C
字号:
//HT1380实时时钟驱动程序
#include <AT89X55.H>  
//#include <reg52.h>                                                                                                                                                                                                                                  
#include <INTRINS.H>
#include <absacc.h>
#define	 uchar unsigned char
#define	 uint unsigned int
sbit clock_dat=P1^1;
sbit clock_clk=P1^0;
sbit clock_rst=P1^2;
uchar second;
///////////uchar second minute,hour,date,month,week,year;
uchar Clock_dat[8]={0x59,0x59,0x13,0x03,0x03,0x06,0x06,};

sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
void delay(uint t)//1ms
{
	unsigned int i;
	unsigned char j;
	for(i=0;i<t;i++)	
	{
//		WDT=~WDT;
		for(j=0;j<=152;j++);
	}
}

void Clock_in(unsigned char Ucda) //往HT1380写入1BYTE
{
	ACC=Ucda;
	clock_dat=a0;clock_clk=1;clock_clk=0;
	clock_dat=a1;clock_clk=1;clock_clk=0;
	clock_dat=a2;clock_clk=1;clock_clk=0;
	clock_dat=a3;clock_clk=1;clock_clk=0;
	clock_dat=a4;clock_clk=1;clock_clk=0;
	clock_dat=a5;clock_clk=1;clock_clk=0;
	clock_dat=a6;clock_clk=1;clock_clk=0;
	clock_dat=a7;clock_clk=1;clock_clk=0;
}
unsigned char Clock_out(void)//从HT1380读出1BYTE
{
	clock_dat=1;
	a0=clock_dat;clock_clk=1;clock_clk=0;
	a1=clock_dat;clock_clk=1;clock_clk=0;
	a2=clock_dat;clock_clk=1;clock_clk=0;
	a3=clock_dat;clock_clk=1;clock_clk=0;
	a4=clock_dat;clock_clk=1;clock_clk=0;
	a5=clock_dat;clock_clk=1;clock_clk=0;
	a6=clock_dat;clock_clk=1;clock_clk=0;
	a7=clock_dat;clock_clk=1;clock_clk=0;
	return(ACC);
}
unsigned char Read_clock(unsigned char Addr) //读一地址值
{
	unsigned char Ucda=0;
	clock_rst=0;
	clock_clk=0;
	clock_rst=1;
	Clock_in(Addr);
	Ucda=Clock_out();
	clock_clk=1;
	clock_rst=0;	
	return(Ucda);
}
void Write_clock(unsigned char Addr,unsigned char Ucda)//写一地址值
{
//	second=Ucda;
	clock_rst=0;
	clock_clk=0;
	clock_rst=1;
	Clock_in(Addr);
	Clock_in(Ucda);
	clock_clk=1;
	clock_rst=0;

}
/************************
多字节写数据0xbe;
8BYTE Clock_data 为时钟数据地址:秒、分、时、日、月、星期、年、控制
调用Clock_in函数
///////////////////////
void Clock_8in(uchar *secdat)
{
	uchar i;
	Write_clock(0x8e,0x00)
	clock_rst=0;
	clock_clk=0;
	clock_rst=1;
	Clock_in(0xbe);
	for(i=0;i<8;i++)
	{
		Clock_in(*secdat);
		*secdat++;
	}
	clock_clk=1;
	clock_rst=0;

}
/************************
多字节读数据0xbf;
8BYTE Clock_data 为时钟数据地址:秒、分、时、日、月、星期、年、控制
调用Clock_in函数
///////////////////////
void Clock_8out(uchar *secdat)
{
	uchar i;
	clock_rst=0;
	clock_clk=0;
	clock_rst=1;
	Clock_in(0xbf);
	for(i=0;i<8;i++)
	{
		*secdat=Clock_out();
		*secdat++;
	}
	clock_clk=1;
	clock_rst=0;

}
*//////////////////////////设置初值
void Set_clock_int(void)
{
	uchar i;
	uchar Addr=0x80;
	Write_clock(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		Write_clock(Addr,Clock_dat[i]);
		Addr+=2;		
	}
	Write_clock(0x8e,0x80);
}
//////////////////////////读初值
void Read_clock_int(void)
{
	uchar i;
	uchar Addr=0x81;
	Write_clock(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		Clock_dat[i]=Read_clock(Addr);
		Addr+=2;		
	}	
}
void main(void)
{
	uchar i;
	Write_clock(0x8e,0x00);	
	Write_clock(0x80,0x00);
//	second=0x59;
//	minute=0x59;
//	hour=0x13;
//	date=0x03;
//	month=0x03;
//	year=0x06;
	for(i=0;i<7;i++)
	{
		Write_clock(0x80+2*i,Clock_dat[i]);
	}
	Set_clock_int();
/*	write_clock(0x82,minute);
	write_clock(0x84,hour);
	write_clock(0x86,date);
	write_clock(0x88,month);
	write_clock(0x8c,year);*/
gh:	delay(500);
	for(i=0;i<7;i++)
	{
		Clock_dat[i]=Read_clock(0x81+2*i);	
	}
	Read_clock_int();
	goto gh;
	while(1);
}

ps/2键盘的程序,可供參考
fangli单片机 发表于 2005-11-13 23:55:59 http://fangli8437.c51bbs.com
$MOD51
    clk    bit    p1.6    ;時鐘
    dat    bit    p1.7    ;數据

;destrop 26h,a,r0,r6,r7
;============================
;接收數据
keb_0:    mov    26h,#00        ;清除
          call    kx_0          ;接收
          cjne    a,#0e0h,f0_a  ;a=e0h
          call    kx_0          ;接收下一位
;===========================
;功能鍵
f0_1:    cjne    a,#0f0h,f0_2   ;a=f0h
         call    kx_0           ;接收下一位
         clr    a               ;清除
         ret                    ;結束
f0_2:    add    a,#7fh          ;a+7fh以上為功能鍵
         mov    dptr,#keb_a     ;設定鍵盤相對碼
         movc    a,@a+dptr      ;把"鍵盤相對碼"載入累積器a內
         mov    26h,a           ;鍵盤相對鍵
         ret                    ;結束
;===========================
;參數鍵
f0_a:    cjne    a,#0f0h,f0_b   ;a=f0h
         call    kx_0           ;接收下一位
         clr    a               ;清除
          ret                   ;結束
f0_b:    cjne    a,#5ah,keb_3   ;判斷ENTER按鈕
         ljmp    f0_2           ;為功能鍵
keb_3:    cjne    a,#76h,keb_4  ;判斷Esc按鈕
          ljmp    f0_2           ;為功能鍵
keb_4:    cjne    a,#66h,keb_5   ;判斷BKSP按鈕
          ljmp    f0_2          ;為功能鍵
keb_5:    mov    dptr,#keb_a    ;設定鍵盤相對碼
          movc    a,@a+dptr    ;把"鍵盤相對碼"載入累積器a內
          ret                  ;結束
;===========================
;設定接收8位數据
kx_0:    setb    clk        ;clk=1(釋放抑制)*******
         setb    dat        ;dat=1
kx_1:    mov    r7,#80       ;100ms
kx_2:    mov    r6,#250      ;
kx_3:    jnb    clk,kx_4    ;判斷開始位(start)
         djnz    r6,kx_3
         djnz    r7,kx_2
         clr    a
         ret
;=====================
kx_4:    jNb    clk,kx_4    ;判斷開始位(start)
         mov    r7,#08       ;設定接收8位數据
         clr    a            ;清零
dat_0:   jb    clk,dat_0     ;判斷clock
         mov    c,dat        ;把數据載入c內
         rrc    a           ;右移一位
         jnb    clk,$        ;判斷clock
         djnz    r7,dat_0    ;r7-1
         jb    clk,$        ;校驗位
         jnb    clk,$        ;判斷clock
         jb    clk,$        ;停止位(STOP)
         jnb    clk,$        ;判斷clock
         clr    clk        ;clk=0(抑制發送)*******
dat_1:    ret

⌨️ 快捷键说明

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