ds1302汇编语言的驱动程序.docx
《ds1302汇编语言的驱动程序.docx》由会员分享,可在线阅读,更多相关《ds1302汇编语言的驱动程序.docx(15页珍藏版)》请在冰豆网上搜索。
ds1302汇编语言的驱动程序
第一个汇编语言程序(DS1302的驱动程序)
时钟芯片DS1302的程序(汇编)
;时钟芯片DS1302的程序(汇编)
;*********************************************************************
;模块名称:
DS1302.a51
;功能:
实时时钟模块时钟芯片型号:
DS1302
;说明:
(修改版)
;程序设计:
;*********************************************************************/
T_CLKBitP3.2;实时时钟时钟线引脚
T_IOBitP3.3;实时时钟数据线引脚
T_RSTBitP3.4;实时时钟复位线引脚
;**********************************************************
SECONDEQU50H;秒寄存器
MINUTEEQU51H;分寄存器
HOUREQU52H;时寄存器
DAYEQU53H;号寄存器
MONTHEQU54H;月寄存器
WEEKEQU55H;星期寄存器
YEAREQU56H;年寄存器
ORG0000H
SJMPSTART
ORG0040H
;**************************************
;功能:
给秒分时日月星期年赋初值
;**************************************
START:
MOVSECOND,#00H
MOVMINUTE,#06H
MOVHOUR,#17H
MOVDAY,#00H
MOVMONTH,#00H
MOVWEEK,#00H
MOVYEAR,#00H
LCALLSET1302
LCALLGET1302
LCALLDISPLAY
MAIN:
MOVR5,#25
MOVTMOD,#01H
MOVTH0,#63H;置定时器初值(定时40ms)
MOVTL0,#0C0H
SETBTR0;启动定时器0
LP1:
JBCTF0,LP2;查询计数溢出
SJMPLP1;未到40ms继续计数
LP2:
MOVTH0,#63H;重新置定时器初值
MOVTL0,#0C0H
LCALLDISPLAY;显示
DJNZR5,LP1;未到1S继续循环
LCALLGET1302;每过1s从DS1302读取一次时间
MOVR5,#25
SJMPLP1
DISPLAY:
MOVR3,SECOND
LCALLCHAG
MOVP2,#0FFH
MOVP0,R2;段码
SETBP2.0;位码
NOP
CLRP2.0
LCALLDELAY
MOVP2,#0FFH
MOVP0,R3
SETBP2.1
NOP
CLRP2.1
LCALLDELAY
MOVR3,MINUTE
LCALLCHAG
MOVP2,#0FFH
MOVP0,R2;段码
SETBP2.2;位码
NOP
CLRP2.2
LCALLDELAY
MOVP2,#0FFH
MOVP0,R3
SETBP2.3
NOP
CLRP2.3
LCALLDELAY
MOVR3,HOUR
LCALLCHAG
MOVP2,#0FFH
MOVP0,R2;段码
SETBP2.4;位码
NOP
CLRP2.4
LCALLDELAY
MOVP2,#0FFH
MOVP0,R3
SETBP2.5
NOP
CLRP2.5
LCALLDELAY
RET
DELAY:
MOVR7,#50
D1:
MOVR6,#10
D2:
DJNZR6,$
DJNZR7,D1
RET
CHAG:
PUSHACC;低字节放入R2,高字节放入R3
MOVA,R3
ANLA,#0FH
MOVR2,A
MOVA,R3
SWAPA
ANLA,#0FH
MOVR3,A
MOVDPTR,#DATATAB
MOVA,R2
MOVCA,@A+DPTR
MOVR2,A
MOVA,R3
MOVCA,@A+DPTR
MOVR3,A
POPACC
RET
DATATAB:
DB0B7H,90H,3DH,0B9H,9AH,0ABH,0AFH,0B0H,0BFH,0BBH
;**********************************************************
;子程序名:
Set1302
;功能:
设置DS1302初始时间,并启动计时。
;说明:
;调用:
RTInputByte
;入口参数:
初始时间在:
Second,Minute,Hour,Day,Month,Week.YearL(地址连续)
;出口参数:
无
;影响资源:
ABR0R1R4R7
;设计:
Reuben日期:
2009-04-17
;修改:
日期:
;**********************************************************
SET1302:
CLRT_RST
CLRT_CLK
SETBT_RST
MOVB,#8EH;控制寄存器
LCALLRTInputByte
MOVB,#00H;写操作前WP=0
LCALLRTInputByte
SETBT_CLK
CLRT_RST
MOVR0,#Second;
MOVR7,#7;秒分时日月星期年
MOVR1,#80H;秒写地址
S13021:
CLRT_RST
CLRT_CLK
SETBT_RST
MOVB,R1;写秒分时日月星期年地址
LCALLRTInputByte
MOVA,@R0;写秒数据
MOVB,A
LCALLRTInputByte
INCR0
INCR1
INCR1
SETBT_CLK
CLRT_RST
DJNZR7,S13021
CLRT_RST
CLRT_CLK
SETBT_RST
MOVB,#8EH;控制寄存器
LCALLRTInputByte
MOVB,#80H;控制,WP=1,写保护
LCALLRTInputByte
SETBT_CLK
CLRT_RST
RET
;**********************************************************
;子程序名:
Get1302
;功能:
从DS1302读时间
;说明:
;调用:
RTInputByte,RTOutputByte
;入口参数:
时间保存在:
Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:
无
;影响资源:
ABR0R1R4R7
;设计:
Reuben日期:
2009-04-17
;修改:
日期:
;**********************************************************
GET1302:
MOVR0,#SECOND;
MOVR7,#7
MOVR1,#81H;秒地址
G13021:
CLRT_RST
CLRT_CLK
SETBT_RST
MOVB,R1;秒分时日月星期年地址
LCALLRTInputByte
LCALLRTOutputByte
MOV@R0,A;秒
INCR0
INCR1
INCR1
SETBT_CLK
CLRT_RST
DJNZR7,G13021
RET
;**********************************************************
;功能:
写1302一字节(内部子程序)
;**********************************************************
RTInputByte:
MOVR4,#8
Inbit1:
MOVA,B
RRCA
MOVB,A
MOVT_IO,C
SETBT_CLK
CLRT_CLK
DJNZR4,Inbit1
RET
;**********************************************************
;功能:
读1302一字节(内部子程序)
;**********************************************************
RTOutputByte:
MOVR4,#8
Outbit1:
MOVC,T_IO
RRCA
SETBT_CLK
CLRT_CLK
DJNZR4,Outbit1
RET
END
第二个ds1302驱动程序
;**************DS1302端口位定义**************
IO_DATABITP1.1;数据传送总线
SCLKBITP1.0;时钟控制总线
RSTBITP1.2;复位总线
;--------------------------------------------
;DS1302初始化子程序
;(R0)=数据(R1)=地址
;--------------------------------------------
PROSET:
CLRRST;DS1302复位
CLRSCLK
NOP
NOP
SETBRST
MOVR1,#90H;写充电寄存器
MOVR0,#0ABH
LCALLWRITE
RET
;================================================
;写DS1302子程序
;================================================
WRITE:
CLRSCLK
NOP
NOP
SETBRST
NOP
MOVA,R1
MOVR2,#08H
WRI_01:
RRCA;传输地址到DS1302
NOP
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_01
CLRSCLK
NOP
NOP
MOVA,R0
MOVR2,#08H
WRI_02:
RRCA;传输数据到DS1302
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_02
CLRSCLK
NOP
NOP
CLRRST
NOP
NOP
RET
;=================================================
;读DS1302子程序
;=================================================
READ:
CLRSCLK
NOP
NOP
SETBRST
NOP
NOP
MOVA,R1
MOVR2,#08H
READ_01:
RRCA
NOP;先传输地址到DS1302
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
CLRSCLK
NOP
NOP
DJNZR2,READ_01
NOP
NOP
SETBIO_DATA
CLRA
CLRC
MOVR2,#08H
READ_02:
CLRSCLK
NOP
NOP
MOVC,IO_DATA
NOP
NOP
RRCA;再从DS1302接收数据
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,READ_02
MOVR0,A
CLRRST
RET
;===============================================
;读时间、日期数据子程序
;存放单元40H-46H
;===============================================
GET_TIME:
MOVR1,#81H;读秒
LCALLREAD
MOV40H,R0
MOVR1,#83H;读分
LCALLREAD
MOV41H,R0
MOVR1,#85H;读时
LCALLREAD
MOV42H,R0
MOVR1,#87H;读出日期
LCALLREAD
MOV43H,R0
MOVR1,#89H;读出月份
LCALLREAD
MOV44H,R0
MOVR1,#8BH;读出星期
LCALLREAD
MOV46H,R0
MOVR1,#8DH;读出年
LCALLREAD
MOV45H,R0
RET