📄 ds1302x.asm
字号:
;************************DS1302_INITIAL****************************************
;功能: ds1302初始化
;set trickle charg and start real time clock
;******************************************************************************
ds1302_initial: lcall ds1302_sclk_clr
lcall ds1302_rst_clr ;打开写保护
mov second,#10001110b ;“控制字”的地址
mov minite,#0 ;“wp”=0,禁止写保护
mov r0,#second
lcall ds1302_wr_data
mov second,#10010000b ;trickle change register
mov minite,#10100101b ;允许
mov r0,#second
lcall ds1302_wr_data
mov second,#10000000b ;sec bust
mov minite,#0 ;禁止低功耗
mov r0,#second
lcall ds1302_wr_data
ret
;DS1302写允许
DS1302_WRITE_EN: MOV TEMP_RAM_1,#10001110B ;控制字的地址
;*********************DS1302_wr_data*******************************************
;功能: 写单字节数据到ds1302
;入口: SECCOND---命令/地址字节 MINITE---写入数据 R0---指向SECOND单元
;影响寄存器:R6,R7,R0,A,PSW
;******************************************************************************
;sec=address; min=command/data; r0=#sec
ds1302_wr_data: lcall ds1302_sclk_clr
nop
lcall ds1302_rst_setb
mov r7,#2
ds1302_wr_data_1: mov r6,#8
mov a,@r0
clr c
ds1302_wr_data_2: rrc a
mov ds1302_io,c
nop
mov ds1302_io,c
nop
nop
nop
nop
lcall ds1302_sclk_setb
nop
lcall ds1302_sclk_clr
nop
djnz r6,ds1302_wr_data_2
inc r0
djnz r7,ds1302_wr_data_1
clr ds1302_io;??????????????????????????????????
ret
;*********************DS1302_READ*****************************************
;功能: 读ds1302的时间数据存到内存ram
;time=0.6ms
;use:a,b,r0,r6,r7(其值保持不变)
;出口: sec,min,hour,day,month,year_l,year_h
;**************************************************************************
ds1302_read: push a
push b
push 00h
push 06h
push 07h
mov b,#10000001b;读秒指令
mov r0,#second
mov r7,#7 ;读的个数
ds1302_read_1: lcall ds1302_rst_setb
mov r6,#8 ;发送指令
mov a,b
ds1302_read_2: rrc a
mov ds1302_io,c
mov ds1302_io,c
nop
nop
nop
nop
lcall ds1302_sclk_setb
lcall ds1302_sclk_clr
djnz r6,ds1302_read_2
mov r6,#8 ;读数据
setb ds1302_io
nop
ds1302_read_3: mov c,ds1302_io
rrc a
lcall ds1302_sclk_setb
lcall ds1302_sclk_clr
djnz r6,ds1302_read_3
lcall ds1302_rst_clr;每次操作必须有一次间隔
mov @r0,a ;存数据
inc r0
mov a,b ;指向下一个时间寄存器
add a,#00000010b
mov b,a
djnz r7,ds1302_read_1 ;读下一个
pop 07h
pop 06h
pop 00h
pop b
mov a,second
clr c
subb a,#60h
jc ds1302_read_4
; mov second,#0
ds1302_read_4: pop a
clr ds1302_io;??????????????????????????????????
ret
;********************DS1302_WRITE************************************
;功能: 修改写ds1302的时间数据
;入口: (sec,min,....year)---------------------------
;使用寄存器:A,B,R0,R6,R7(其值保持不变)
;******************************************************************
ds1302_write: mov day,#01h
push a
push b
push 00h
push 06h
push 07h
mov b,#10000000b ;写命令
mov r0,#second
mov r7,#8 ;只写8个值,包含秒
lcall ds1302_sclk_clr
ds1302_write_1: lcall ds1302_rst_setb
mov r6,#8 ;传送命令
mov a,b
ds1302_write_2: rrc a
mov ds1302_io,c
nop
mov ds1302_io,c
nop
nop
nop
nop
lcall ds1302_sclk_setb
lcall ds1302_sclk_clr
djnz r6,ds1302_write_2
mov r6,#8;传送数据
ds1302_write_3: mov a,@r0
ds1302_write_4: rrc a
mov ds1302_io,c
mov ds1302_io,c
nop
nop
nop
nop
lcall ds1302_sclk_setb
lcall ds1302_sclk_clr
djnz r6,ds1302_write_4
nop
nop
nop
nop
lcall ds1302_rst_clr ;每次操作必须有一次间隔
nop
nop
nop
inc r0 ;指向下一个
mov a,b
add a,#00000010b
mov b,a
djnz r7,ds1302_write_1
clr ds1302_io;??????????????????????????????????
pop 07h
pop 06h
pop 00h
pop b
pop a
ret
;********************DS1302_FIRST_SET********************************
;功能: ds1302初值设定02年3月3日6时6分6秒
;过程: 检查时分秒的格式是否正确,如不正确重置
;使用寄存器:A,B,R0,R6,R7
;************************************************
;ds1302_first_set: lcall ds1302_read
; mov a,second
; lcall ds1302_first_set_3
; jnz ds1302_first_set_2
; mov a,minite
; lcall ds1302_first_set_3
; jnz ds1302_first_set_2
; mov a,hour
; lcall ds1302_first_set_3
; jnz ds1302_first_set_2
; ret
;ds1302_first_set_2: mov second,#06h ;10秒
; mov minite,#06h ;10分
; mov hour,#06h ;10点
; mov date,#03h ;
; mov month,#03h
; mov day,#03
; mov year,#02
; lcall ds1302_write
; lcall delay_1s
; lcall ds1302_read
; ret
;*******************DS1302_First_SET_3***************************
;功能:检查时间数据的格式,是否符合BCD码
;入口:A---待检查数据
;出口:A=0 格式正确 A=1格式错误
;影响寄存器A,B,PSW
;*************************************************************
;ds1302_first_set_3: mov b,a
; anl a,#0fh
; clr c
; subb a,#0ah
; jnc ds1302_first_set_5
; mov a,b
; swap a
; anl a,#0fh
; clr c
; subb a,#6
; jnc ds1302_first_set_5
; mov a,#0
; ret
;ds1302_first_set_5: mov a,#1
; ret
;*******************DS1302_TEST****************************************
;功能: 测试时间芯片
;过程: 若两次间隔超过1秒读,数据不变化,则为错误
;出口: a=0正确 a=1:错误
;影响寄存器:A,PSW,B
;******************************************************************
;ds1302_test: sjmp ds1302_test_4 ;由于温度的影响,该芯片可能损坏2001-1-27
; lcall select_normal_io
; lcall ds1302_read ;读一次时间
; mov a,second ;判断数据错误
; clr c
; subb a,#61h
; jnc ds1302_test_0
; mov a,minite ;判断数据错误
; clr c
; subb a,#61h
; jc ds1302_test_3
;ds1302_test_0: lcall ds1302_first_set ;时间错误,重写
;ds1302_test_3: lcall ds1302_read
; mov a,second
; push a
; lcall delay_2s
; lcall ds1302_read
; pop a
; cjne a,second,ds1302_test_4
; setb error_ds1302 ;时间芯片错误
; ret
;ds1302_test_4: clr error_ds1302 ;时间芯片正确
; ret
;******************DS1302_SCLK_CLR*********************************************
;功能: 置74HC574_1的7Q端为低,将ds1302_sclk清零
ds1302_sclk_clr: anl ram_74ls574_1,#10111111b
ds1302_sclk_clr1: push a
lcall select_normal_io
mov dptr,#cs_74ls574_1
mov a,ram_74ls574_1
movx @dptr,a
pop a
ret
;*****************DS1302_sclk_setb********************************
;功能: 置74HC574_1的7Q端为高,将ds1302_sclk置高
ds1302_sclk_setb: orl ram_74ls574_1,#01000000b
sjmp ds1302_sclk_clr1
;*******************DS1302_RST_CLR*********************************
;功能: 置74HC574_1的8Q端输出低,清零ds1302_rst
ds1302_rst_clr: anl ram_74ls574_1,#01111111b ;clr time_rst
sjmp ds1302_sclk_clr1
;*******************DS1302_RST_CLR*********************************
;功能: 置74HC574_1的8Q端输出高;置高ds1302_rst
ds1302_rst_setb: orl ram_74ls574_1,#10000000b ;clr time_rst
sjmp ds1302_sclk_clr1
;*******************RST_DOG********************
;看门狗的复位信号连接到ds1302的sclk端
;rst_watchdog: setb p1.7
; nop
; clr p1.7
; clr p1.7
; setb p1.7
; ret
;********************DS1302_RD_RAM************************************
;功能: 从DS1302的RAM中读出R7个数据保存在628256的影像地址单元中
;入口: R0----指向源开始地址单元
; R7---所读数据的长度<30
;使用寄存器: A,PSW,B,R6,R0
;***********************************************************************
;ds1302_RD_RAM: push a
; push b
; push 06
; MOV A,R0
; CLR C
; RLC A
; ANL a,#00111110b
; ORL A,#11000001b
; mov b,a
;ds1302_rd_Ram_1: lcall ds1302_rst_setb
; mov r6,#8 ;发送指令
; mov a,b
;ds1302_rd_ram_2: rrc a
; mov ds1302_io,c
; mov ds1302_io,c
; nop
; nop
; nop
; nop
; lcall ds1302_sclk_setb
; lcall ds1302_sclk_clr
; djnz r6,ds1302_RD_ram_2
; mov r6,#8 ;读数据
; setb ds1302_io
; nop
;ds1302_rD_RAM_3: mov c,ds1302_io
; rrc a
; lcall ds1302_sclk_setb
; lcall ds1302_sclk_clr
; djnz r6,ds1302_RD_RAM_3
; lcall ds1302_rst_clr;每次操作必须有一次间隔
; lcall save_45D041_to_628256 ;存数据到628256的影像地址单元中
; inc r0
; mov a,b ;指向下一个RAM单元
; add a,#00000010b
; mov b,a
; djnz r7,ds1302_rD_RAM_1 ;读下一个
; pop 06
; pop b
; pop a
; ret
;**********************________ds1302___end________*********
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -