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

📄 ds1302x.asm

📁 关于时钟的汇编语言的应用程序
💻 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 + -