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

📄 ds1302-dsy.asm

📁 DS1302-制作的电子时钟
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         MOV  41H,A
         XRL  A,#60H
         JNZ  K022A
         MOV  41H,#00H
K022A:   MOV  R1,#82H           ;写分寄存器
         MOV  R0,41H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K020
;---------------------------------------------------
K021B:
         MOV  A,41H
         XRL  A,#00H
         JZ  K022B
         SETB  C              ;求补运算
         CLR  A
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,41H          ;加被减数
         DA A                 ;十进制调整
         MOV 41H,A            ;
         XRL  A,#00H
         JNZ K022C
K022B:   MOV  41H,#59H
K022C:   MOV  R1,#82H           ;写分寄存器
         MOV  R0,41H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K020
;---------------------------------------------------
K003:    CALL DATE_DELAY       ;校日
         JNB K3,K003            ;K3为位移键

K030:    CALL  CHULI
         JNB  0AH,KR01

         MOV  60H,7FH          ;送入熄灭符
         MOV  61H,7FH
         JMP  KR02

 KR01:   MOV  60H,76H          ;送实时值
         MOV  61H,77H          ;送实时值
 KR02:   MOV  R0,#DATE_DATA
         CALL  DISP
         MOV  R0,#DATE_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K031A
         JNB  K2,K031B
         JNB  K3,K004
         JMP  K030
K031A:
         MOV  A,43H
         ADD  A,#01H
         DA A
         MOV  43H,A
         XRL  A,#32H
         JNZ  K032A
         MOV  43H,#00H
K032A:    MOV  R1,#86H           ;写日寄存器
         MOV  R0,43H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP  K030

K031B:
         MOV  A,43H
         XRL  A,#00H
         JZ  K032B
         SETB  C                ;求补运算
         CLR  A
         ADDC  A,#99H           ;加99
         SUBB  A,#01H           ;减去减数
         ADD   A,43H            ;加被减数
         DA A                   ;十进制调整
         MOV 43H,A
         XRL  A,#00H
         JNZ K032C
K032B:   MOV  43H,#31H
K032C:   MOV  R1,#86H           ;写日寄存器
         MOV  R0,43H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP  K030
;------------------------------------------------
K004:    CALL DATE_DELAY        ;校月
         JNB K3,K004            ;K3为位移键

K040:    CALL  CHULI
         JNB  0AH,KC01

         MOV  62H,7FH           ;送入熄灭符
         MOV  63H,7FH
         JMP  KC02

 KC01:   MOV  62H,78H           ;送实时值
         MOV  63H,79H           ;送实时值
 KC02:   MOV  R0,#DATE_DATA
         CALL  DISP
         MOV  R0,#DATE_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K041A
         JNB  K2,K041B
         JNB  K3,K005
         JMP  K040
K041A:
         MOV  A,44H
         ADD  A,#01H
         DA A
         MOV  44H,A
         XRL  A,#13H
         JNZ  K042A
         MOV  44H,#00H
K042A:   MOV  R1,#88H           ;写月寄存器
         MOV  R0,44H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP  K040

K041B:
         MOV  A,44H
         XRL  A,#00H
         JZ  K042B
         SETB  C              ;求补运算
         CLR  A
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,44H          ;加被减数
         DA A                 ;十进制调整
         MOV 44H,A            ;
         XRL  A,#00H
         JNZ  K042C
K042B:   MOV  44H,#12H
K042C:   MOV  R1,#88H        ;写月寄存器
         MOV  R0,44H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP  K040
;-----------------------------------------------
K005:     CALL DATE_DELAY       ;校年
         JNB K3,K005            ;K3为位移键

K050:    CALL  CHULI
         JNB  0AH,KY01

         MOV  64H,7FH          ;送入熄灭符
         MOV  65H,7FH
         JMP  KY02

 KY01:   MOV  64H,7AH          ;送实时值
         MOV  65H,7BH          ;送实时值
 KY02:   MOV  R0,#DATE_DATA
         CALL  DISP
         MOV  R0,#DATE_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K051A
         JNB  K2,K051B
         JNB  K3,K008
         JMP  K050
K051A:
         MOV  A,45H
         ADD  A,#01H
         DA A
         MOV  45H,A
         XRL  A,#9AH
         JNZ  K052A
         MOV  45H,#00H
K052A:   MOV  R1,#8CH         ;写年寄存器
         MOV  R0,45H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP   K050

K051B:
         MOV  A,45H
         XRL  A,#00H
         JZ  K052B
         SETB  C              ;求补运算
         CLR  A
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,45H          ;加被减数
         DA A                 ;十进制调整
         MOV  45H,A            ;
         XRL  A,#00H
         JNZ  K052C
K052B:   MOV  45H,#99H
K052C:   MOV  R1,#8CH         ;写年寄存器
         MOV  R0,45H
         LCALL WRITE
         CALL  DATE_DELAY
         JMP   K050
;-------------------------------------------------
K008:    JNB K3,K008
         MOV  R1,#80H          ;写秒寄存器
         MOV  R0,#00H          ;启动振荡器工作
         LCALL WRITE

         MOV  R1,#8EH          ;写保护寄存器
         MOV  R0,#80H          ;禁止写入
         LCALL WRITE

         CALL  DATE_DELAY
         CLR  0AH
         CLR  TR0
         CALL  BEEP_BL
         RET
;===================================================
;定时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;===================================================
DSSET:
         SETB  TR0
DS01:    LCALL DS_DELAY        ;定时分设定
         JNB  K4,$

DS010:   CALL  DS_CHULI
         JNB  0AH,DS01_1
         MOV  58H,7FH          ;送入熄灭符
         MOV  59H,7FH
         JMP  DS01_2

DS01_1:  MOV  58H,70H         ;送实时值
         MOV  59H,71H         ;送实时值
DS01_2:  MOV  R0,#58H
         LCALL  DS_SP
         MOV  R0,#58H
         LCALL  DS_DISPLAY
         JNB  K1,DS01A        ;加键
         JNB  K2,DS01B        ;减键
         JNB  K3,DS02
         JMP  DS010

DS01A:                        ;加
          MOV  A,48H
          ADD A,#01H
          DA A
          MOV 48H,A
          XRL  A,#60H
          JNZ DS011
          MOV  48H,#00H
DS011:    LCALL DS_DELAY
          JMP  DS010

DS01B:    MOV  A,48H          ;判48H是否为0
          XRL  A,#00H
          JZ  DS012
          SETB  C              ;减
         CLR  A               ;求补运算
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,48H          ;加被减数
         DA A                 ;十进制调整
         MOV 48H,A            ;
         XRL  A,#00H
         JNZ  DS013
DS012:   MOV  48H,#59H
DS013:   CALL  DS_DELAY
         JMP  DS010
;----------------------------------------------
DS02:     LCALL DS_DELAY      ;定时时设定
          JNB  K3,$
DS020:
         CALL  DS_CHULI
         JNB  0AH,DS02_1

         MOV  5AH,7FH          ;送入熄灭符
         MOV  5BH,7FH
         JMP  DS02_2

DS02_1:  MOV  5AH,72H          ;送实时值
         MOV  5BH,73H          ;送实时值
DS02_2:  MOV  R0,#58H
         LCALL  DS_SP
         MOV  R0,#58H
         LCALL  DS_DISPLAY
         JNB  K1,DS02A
         JNB  K2,DS02B
         JNB  K3,DS03
         JMP  DS020

DS02A:    MOV  A,49H          ;加
          ADD  A,#01H
          DA A
          MOV  49H,A
          XRL  A,#24H
          JNZ  DS021
          MOV  49H,#00H
DS021:    LCALL DS_DELAY
          JMP  DS020

DS02B:    MOV  A,49H           ;判49H是否为0
          XRL  A,#00H
          JZ  DS022
          SETB  C              ;减
          CLR  A               ;求补运算
          ADDC  A,#99H         ;加99
          SUBB  A,#01H         ;减去减数
          ADD   A,49H          ;加被减数
          DA A                 ;十进制调整
          MOV 49H,A            ;
          XRL  A,#00H
          JNZ  DS023
DS022:    MOV  49H,#23H
DS023:    CALL  DS_DELAY
          JMP  DS020
;-------------------------------------------
DS03:     CALL DS_DELAY
          JNB  K3,$

DS030:    CALL  DS_CHULI
          JNB  0AH,DS03_1
          MOV  5CH,7FH         ;送入熄灭符
          JMP  DS03_2
DS03_1:   MOV  5CH,74H         ;送实时值
DS03_2:   MOV  R0,#58H         
          LCALL  DS_SP
          MOV  R0,#58H
          LCALL  DS_DISPLAY
          JNB K3,DS04
          JNB  K1,DS03A
          JMP  DS030

DS03A:    CPL  20H.1              ;报警标记取反
          JNB  20H.1,DS031
          MOV  4AH,#01H           ;报警标记=1,允许报警
          AJMP  DS032
DS031:    MOV  4AH,#00H           ;报警标记=0,禁止报警
DS032:    LCALL DS_DELAY
          JMP  DS030
;--------------------------------------------
DS04:     CLR  TR0
          CLR  0AH
          CALL  BEEP_BL
          LCALL DS_DELAY
          RET

;=============================================
;定时时间数据处理子程序
;=============================================
DS_CHULI:
          MOV A,48H               ;处理分数据
          ANL A,#0FH
          MOV 58H,A
          MOV 70H,A
          MOV A,48H
          ANL A,#0F0H
          SWAP A
          MOV 59H,A
          MOV 71H,A

          MOV A,49H               ;处理时数据
          ANL A,#0FH
          MOV 5AH,A
          MOV 72H,A
          MOV A,49H
          ANL A,#0F0H
          SWAP A
          MOV 5BH,A
          MOV 73H,A

          MOV A,4AH              ;处理定时标记
          ANL A,#01H
          MOV 5CH,A
          MOV  74H,A
          RET
;==================================================
;定时时间查表取数子程序
;==================================================
DS_SP:    ;MOV R0,#58H
          MOV R3,#05H
DS_SP1:   MOV A,@R0
          MOV DPTR,#TAB_NU
          MOVC A,@A+DPTR
          MOV @R0,A
          INC R0
          DJNZ R3,DS_SP1
          RET
;==================================================
;定时时间显示子程序
;==================================================
DS_DISPLAY:
          ;MOV  R0,#58H          ;取得设定显示单元首地址
          MOV  R1,#07FH          ;从第一个数码管开始
          MOV  R2,#07H           ;共7个数码管
DSPLAY:   MOV  P0,@R0            ;获得当前单元数据
          MOV  A,R1
          MOV  P2,A              ;数码显示
          JB  ACC.5,DSLP1        ;第三位数码管显示“-”
          MOV  P0,#0BFH
          JMP  DSLP3
DSLP1:    JB  ACC.2,DSLP2        ;第六位数码管显示“-”
          MOV  P0,#0BFH
          JMP  DSLP3
DSLP2:    INC  R0
DSLP3:    MOV  A,R1              ;为下一个数准备
          RR  A                  ;下一个单元
          MOV  R1,A              ;保存
          LCALL  DELAY
          DJNZ  R2,DSPLAY        ;重复显示,直到全部数据刷新过
          RET                    ;返回
;====================================================
;实时时间与设定时间比较子程序

;20H.0 止闹标记,=0,允许,=1,禁止。
;20H.1 报警标记,=1,允许,=0,禁止。
;====================================================
COMP:     JNB  20H.1,COMP1
          MOV  R0,#TIME_DATA
          LCALL  TIME_DISPLAY
          MOV  A,42H             ;实时时间与设定时间比较
          CJNE  A,49H,COMP1      ;先比较时后比较分
          MOV A,41H
          CJNE  A,48H,COMP1
          JB   20H.0,COMP2       ;20H.0=1,止闹开关,关
          ;LCALL  BEEP_BL
          CLR  RELAY             ;继电器吸合1分钟
          JMP  COMP3
COMP1:    CLR  20H.0
COMP2:    SETB  RELAY
COMP3:    RET

;====================================================
;键延时子程序
;多次调用显示程序做键延时
;====================================================
DS_DELAY:
          MOV  R6,#0AH         ;设定定时时间,键延时用
 DS_KK:
          LCALL  DS_CHULI
          MOV  R0,#DS_DATA
          LCALL  DS_SP
          MOV  R0,#DS_DATA
          LCALL  DS_DISPLAY
          DJNZ  R6,DS_KK
          RET

TIME_DELAY:                    ;设定时间,键延时用
          MOV  R6,#0AH
TIME_KK:
          LCALL  CHULI
          MOV  R0,#TIME_DATA
          LCALL  DISP
          MOV  R0,#TIME_DATA
          CALL  TIME_DISPLAY
          DJNZ  R6,TIME_KK
          RET

DATE_DELAY:                    ;设定日期,键延时用
          MOV  R6,#0AH
DATE_KK:
          LCALL  CHULI
          MOV  R0,#DATE_DATA
          LCALL  DISP
          MOV  R0,#DATE_DATA
          CALL  TIME_DISPLAY
          DJNZ  R6,DATE_KK
          RET

;====================================================
;蜂鸣器响一声子程序 (适用交流蜂鸣器)
;====================================================
BEEP_BL:
         MOV  R6,#100
 BL2:    CALL  DEX1
         CPL  BEEP
         DJNZ  R6,BL2
         MOV  R5,#10
         CALL  DELAY_BL
         RET
 DEX1:   MOV  R7,#180
 DE2:    NOP
         DJNZ  R7,DE2
         RET
DELAY_BL:                    ;(R5)*延时10MS
         MOV  R6,#50
 DL1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DL1
         DJNZ  R5,DELAY_BL
         RET

;*************************************************************
TAB_NU: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0-9
        DB 0FFH ;灭
        DB 88H,83H,0C6H,0A1H,86H,8EH ;A-F  《 共阳数码管 》
;*************************************************************
        END

⌨️ 快捷键说明

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