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

📄 时钟程序0701.asm

📁 一个很好用的时钟程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
           JNZ    ADD_MED_QU
           MOV    MED_L,#00H
           MOV    MED_H,#01H
ADD_MED_QU:
           RET
;*********************************************
ADD_EMEND: MOV    A,EMEND_L
           ADDC   A,#1
           DA     A
           MOV    EMEND_L,A
           CLR    C
           CJNE   A,#11H,ADD_EMEND_1
ADD_EMEND_1:JC    ADD_EMEND_QU
           MOV    EMEND_L,#10H
ADD_EMEND_QU:RET
;************************************************************************************

ANT_SUBB: JB     06H,SUBB_QU       ;防抖时间未到退出
          MOV    A,24H             ;SUBB查询子程序
          MOV    B,A
          MOV    C,P1.5            ;取样比较
          MOV    ACC.0,C
          MOV    24H,A
          XRL    A,B
          JZ     SUBB_QU           ;没有变化退出

          JB     20H,SUBB_QU
          CLR    01H               ;按下键时必须亮数码管
          MOV    72H,#0FFH          ;置亮时限
          MOV    73H,#2
          MOV    5EH,#0FFH         ;置连发时限
          MOV    5FH,#3
          SETB   06H
          MOV    2EH,#0A0H         ;置防抖时限
          MOV    2FH,#01H          ;置防抖延时限
          CALL   RETUN_EQU         ;返回时间档延时时限
          JB     MED,SUBB_MED      ;在药量档
          JB     ALLTIME,SUBB_QU
          JB     TEMP,SUBB_TEM
          JB     INTEN,SUBB_WU_DEC
          JB     TIME,SUBB_QU
          JB     TEMPTEST,SUBB_QU
          JB     02H,SUBB_QU       ;在运行时按下无效

          MOV    A,MINUTE          ;分个位清零,保留十位
          ANL    A,#0F0H
          MOV    MINUTE,A
          MOV    A,HOUR            ;小时单元为零查看分钟单元
          XRL    A,#00H
          JZ     SUBB_1
          JMP    SUBB_2
SUBB_1:   MOV    A,MINUTE
          XRL    A,#00H
          JZ     SUBB_QU           ;小时分钟单元都有为零减键按下无效
SUBB_2:   MOV    SECOND,#00H          ;秒清零
          ;CALL   SUBB_DEC1
          CALL   SUBB_BCD          ;调减10子程序
          MOV    A,MINUTE
          ANL    A,#0F0H
          XRL    A,#90H
          JNZ    SUBB_3
          MOV    MINUTE,#50H
SUBB_3:   SETB   05H               ;在暂停时有调整置标志
SUBB_QU:  RET
;***************************

;SUBB查询子程序结束
SUBB_TEM:
          CLR    C
          CLR    A
          ADDC   A,#99H             ;加99
          SUBB   A,#00H             ;减去减数
          ADD    A,TEMPERATURE              ;加被减数
          DA     A                  ;十进制调整
          MOV    TEMPERATURE,A
          CLR    C
          CJNE   A,#20H,SUBB_TEM1
SUBB_TEM1:JNC    SUBB_TEM_QU
          MOV    TEMPERATURE,#20H
SUBB_TEM_QU: RET
;*************************************************
SUBB_WU_DEC:
           MOV     A,INTENSITY
           DEC     A
           MOV     INTENSITY,A
           CLR     C
           CJNE    A,#01H,SUBB_DEC_1
SUBB_DEC_1:JNC     SUBB_DEC_QU
           MOV     INTENSITY,#01H         ;不超过5,不超过按下才有效
SUBB_DEC_QU:MOV    49H,#00H         ;按下键雾化时间间隔计数清零
           RET
;************************************************
SUBB_MED:
           CALL    SUBB_MED_1
           RET
;************************************************
SUBB_EMEND:CALL    SUBB_EMEND_1
           RET
;************************************************
SUBB_MED_1:
          MOV      A,MED_H
          XRL      A,#1
          JZ       SUBB_MED_0
          MOV      A,MED_L
          XRL      A,#0
          JZ       SUBB_MED_QU

SUBB_MED_0:
          ;CLR    00H                ;开机在药量档按下加或减键终止待机状态
          SETB     PSW.3
          SETB     PSW.4
          MOV      R0,#5AH         ;被减数高位地址送R0
          MOV      R1,#5CH         ;减数高位地址送R1
          MOV      R3,#2           ;运算字节数送R3
          MOV      5CH,#00H        ;被减数为10,假放于两个字节
          MOV      5DH,#10
          MOV      5AH,MED_H
          MOV      5BH,MED_L


          MOV      A,R0            ;从低位开始进行十进制减法
          ADD      A,R3
          MOV      R0,A
          DEC      R0
          MOV      A,R1
          ADD      A,R3
          MOV      R1,A
          DEC      R1
          SETB     C               ;加1
SUBB_MED_2:    CLR      A
          ADDC     A,#99H          ;加99
          SUBB     A,@R1           ;减去减数
          ADD      A,@R0           ;加被减数
          DA       A               ;十进制调整
          MOV      @R0,A
          DEC      R0
          DEC      R1
          DJNZ     R3,SUBB_MED_2        ;循环N次
          JC       SUBB_MED_3
          MOV      MED_L,#00H        ;如果CY为0,则差为负,不够减,减键无效
          MOV      MED_H,#00H
SUBB_MED_3:MOV     MED_H,5AH
          MOV      MED_L,5BH
          CLR      PSW.3
          CLR      PSW.4
SUBB_MED_QU:  RET
;*************************************************
SUBB_EMEND_1:
          MOV    A,EMEND_L
          XRL    A,#00H
          JZ     SUBB_EMEND_QU
          CLR    C
          CLR    A
          ADDC   A,#99H             ;加99
          SUBB   A,#00H             ;减去减数
          ADD    A,EMEND_L          ;加被减数
          DA     A                  ;十进制调整
          MOV    EMEND_L,A
          CLR    C
          ;CJNE   A,#01H,SUBB_EMEND_2
;SUBB_EMEND_2:JNC    SUBB_EMEND_QU
          ;MOV    EMEND_L,#00H
SUBB_EMEND_QU: RET
          RET
;R0被减数高位地址,R1减数高位地址,R3为字节数
SUBB_BCD: SETB     PSW.3
          SETB     PSW.4
          MOV      R0,#5AH         ;被减数高位地址送R0
          MOV      R1,#5CH         ;减数高位地址送R1
          MOV      R3,#2           ;运算字节数送R3
          MOV      5CH,#00H        ;被减数为10,假放于两个字节
          MOV      5DH,#10
          MOV      5AH,HOUR
          MOV      5BH,MINUTE

          MOV      A,R0            ;从低位开始进行十进制减法
          ADD      A,R3
          MOV      R0,A
          DEC      R0
          MOV      A,R1
          ADD      A,R3
          MOV      R1,A
          DEC      R1
          SETB     C               ;加1
CSUL1:    CLR      A
          ADDC     A,#99H          ;加99
          SUBB     A,@R1           ;减去减数
          ADD      A,@R0           ;加被减数
          DA       A               ;十进制调整
          MOV      @R0,A
          DEC      R0
          DEC      R1
          DJNZ     R3,CSUL1        ;循环N次
          JC       SUBB_OVER
          MOV      SECOND,#00H        ;如果CY为0,则差为负,不够减,减键无效
          MOV      MINUTE,#00H
          MOV      HOUR,#00H
SUBB_OVER:MOV      HOUR,5AH
          MOV      MINUTE,5BH
          CLR      PSW.3
          CLR      PSW.4
          RET
;***********************************************************************************
;***********************************************************************************
;十位连发延时处理
AN_LFA:   JB    TEMPTEST,AN_LFB2
          JB    TIME,AN_LFB2
          JB    INTEN,AN_LFB2
          JB    ALLTIME,AN_LFB2
          JB    MED,AN_LFB2
          JB    TEMP,AN_LFB2
          JB    02H,AN_LF2         ;在运行时按下无效

          JB    P1.4,AN_LF2
          DEC   5EH
          MOV   A,5EH
          JNZ   AN_LF2
          DEC   5FH
          MOV   A,5FH
          JNZ   AN_LF3
          NOP
          NOP
          CLR    01H                ;按下键时必须亮数码管
          MOV    72H,#0FFH          ;置亮时限
          MOV    73H,#2
 ;连发加十,迢过50回到0,小时加1
          CALL   RETUN_EQU          ;返回时间档延时时限
          MOV    SECOND,#00H           ;秒清零
          MOV    A,MINUTE              ;分个位清零,保留十位
          ANL    A,#0F0H
          MOV    MINUTE,A
          MOV    A,MINUTE              ;分加10
          ADD    A,#10
          DA     A
          MOV    MINUTE,A
          ANL    A,#0F0H
          XRL    A,#60H
          JNZ    AN_LF4
          MOV    MINUTE,#00H
          MOV    A,HOUR
          ADD    A,#01H
          DA     A
          MOV    HOUR,A

AN_LF4:   MOV   5EH,#0A0H       ;重置初值,等待下一次连发
          MOV   5FH,#1
          JMP   AN_LF2
AN_LF3:   MOV   5EH,#0A0H

AN_LF2:   RET
;************************************************************************************
 AN_LFB2: RET
;**********************************
;十位连发延时处理
AN_LFB:   JB    TEMPTEST,AN_LFB2
          JB    TIME,AN_LFB2
          JB    INTEN,AN_LFB2
          JB    ALLTIME,AN_LFB2
          JB    MED,AN_LFB2
          JB    TEMP,AN_LFB2
          JB    02H,AN_LFB2         ;在运行时按下无效

          JB    P1.5,AN_LFB2
          DEC   5EH
          MOV   A,5EH
          JNZ   AN_LFB2
          DEC   5FH
          MOV   A,5FH
          JNZ   AN_LFB3
          NOP
          NOP
          CLR    01H               ;按下键时必须亮数码管
          MOV    72H,#0FFH          ;置亮时限
          MOV    73H,#2
          CALL   RETUN_EQU         ;返回时间档延时时限
          JMP    AN_LFB_NEXT


 ;连发减十
 AN_LFB_NEXT:
          MOV    A,MINUTE             ;分个位清零,保留十位
          ANL    A,#0F0H
          MOV    MINUTE,A
          MOV    A,HOUR             ;小时单元为零查看分钟单元
          XRL    A,#00H
          JZ     AN_LFBX
          JMP    AN_LFBY
AN_LFBX:  MOV    A,MINUTE
          XRL    A,#00H
          JZ     AN_LFB4           ;小时分钟单元都有为零减键按下无效
AN_LFBY:  MOV    SECOND,#00H          ;秒清零
          CALL   SUBB_BCD          ;调减10子程序
          MOV    A,MINUTE
          ANL    A,#0F0H
          XRL    A,#90H
          JNZ    AN_LFB4
          MOV    MINUTE,#50H

AN_LFB4:  MOV   5EH,#0A0H          ;重置初值,等待下一次连发
          MOV   5FH,#1
          JMP   AN_LFB2
AN_LFB3:  MOV   5EH,#0A0H

AN_LFB2_QU:  RET
;********************************************************************************

;************************************************************************************
FDOU:     DJNZ   2EH,FDOU_QU
          DJNZ   2FH,FDOU_1
          CLR    06H
          MOV    2EH,#01H
          MOV    2FH,#01H
          JMP    FDOU_QU
FDOU_1:   MOV    2EH,#0FFH
FDOU_QU:  RET
;************************************************************************************
RETUN_EQU:MOV    4EH,#0FFH          ;返回时间档显示延时时限
          MOV    4FH,#10H
          RET
;************************************************************************************
RETUN_TIME:DJNZ   4EH,ST_1
          DJNZ   4FH,ST_2
          MOV    4EH,#00H
          MOV    4FH,#00H
          CLR    MED
          CLR    SETTIME
          CLR    ALLTIME
          CLR    INTEN
          CLR    TEMPTEST
          CLR    TEMP
          SETB   TIME           ;时限到回到时间档位显示时间
          MOV    45H,#0FFH
          MOV    46H,#0FFH
          MOV    47H,#0FFH
          MOV    48H,#0FFH
          SETB   07H
          MOV    34H,#01H
          JMP    ST_1
ST_2:     MOV    4EH,#0FFH
ST_1:     RET
;************************************************************************************
DELAY:   MOV    R7,#02H            ;开机延时
YSA:     MOV    R6,#0FFH
YSB:     MOV    R5,#0FFH
YSC:     DJNZ   R5,YSC
         DJNZ   R6,YSB
         DJNZ   R7,YSA
         RET
;*************************************************************************************
RETUN0:   MOV    51H,SECOND
          MOV    52H,SECOND
          MOV    A,#0FH
          ANL    A,51H
          MOV    51H,A
          MOV    A,#0F0H
          ANL    A,52H
          SWAP   A
          MOV    52H,A
 ;***************
          MOV    DPTR,#TAB
          MOV    A,51H
          MOVC   A,@A+DPTR
          ;MOV    33H,A
          NOP
          NOP
          MOV    A,52H
          MOVC   A,@A+DPTR
          ;MOV    32H,A
 ;**************************
 RETUN1:   MOV    53H,MINUTE
          MOV    54H,MINUTE
          MOV    A,#0FH
          ANL    A,53H
          MOV    53H,A
          MOV    A,#0F0H
          ANL    A,54H
          SWAP   A
          MOV    54H,A
          MOV    DPTR,#TAB
          MOV    A,53H
          MOVC   A,@A+DPTR
          MOV    33H,A
          MOV    A,54H
          MOVC   A,@A+DPTR
          MOV    32H,A
 RETUN2:  MOV    55H,HOUR
          MOV    56H,HOUR
          MOV    A,#0FH
          ANL    A,55H
          MOV    55H,A
          MOV    A,#0F0H
          ANL    A,56H
          SWAP   A
          MOV    56H,A
 ;***************
          MOV    DPTR,#TAB
          MOV    A,55H
          MOVC   A,@A+DPTR
          MOV    31H,A
          NOP
          NOP
          MOV    A,56H
          MOVC   A,@A+DPTR
          MOV    30H,A
          RET
;************************************************************************************
 MUSIC_0: DJNZ   4AH,MUSIC_QU
          DJNZ   4BH,MUSIC_1
          DJNZ   4CH,MUSIC_2
          ;SETB   BEE
          CLR    TR2

⌨️ 快捷键说明

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