📄 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 + -