首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
AT89C52闹钟程序
来源:本站整理  作者:佚名  2011-08-04 10:14:30



;*********************************************************************************************;
;以下程序能用于24小时计时,能作为秒表使用,能定时闹铃1分钟(也可关).
;使用方法:开机后在00:00:00起开始计时,(1)长按P1.0进入调分状态:分单元闪烁
;按P1.0加1,按P1.1减1.再长按P1.0进入时调整状态,时单元闪烁,加减调整同调分.
;按长按退出调整状态.  (2)按下P1.1进入秒表状态:按P1.2暂停,再按P1.2秒表清零,再按
;P1.2秒表又启动,按P1.1退出秒表回到时钟状态. (3)按P1.3进入设定闹时状态: 00:00: -,可进
;行分设定,按P1.2分加1,再按P1.3为时调整,00:00:- ,按P1.2时加1,按P1.1闹铃有效,显示为00:00:-0,再按
;P1.1闹铃无效(显示00:00:- ,),按P1.3调闹钟结束.在闹铃时可按P1.3停闹,不按闹铃1分钟.
;定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁及秒表定时用,
;P1.0、P1.1、P1.2、P1.3为调整按钮,P0口为字符输出口,P2为扫描口,P1.7为蜂呜器口,采用共阳显示管。
;50H-55H为闹钟定时单元,60H-65H为秒表计时单元,70H-75H为显示时间单元,76H-79H为分时计时单元。
;03H标志=0时钟闪烁,=1秒表,    05H=0,不闹铃,=1要闹铃.    07H每秒改变一次,用作间隔呜叫.
;***********************************************************************************************;
           DISPFIRST  EQU  30H     ;显示首址存放单元
           BELL       EQU  P1.7    ;小喇叭
           CONBS      EQU  2FH     ;存放报时次数
;
;****************************************
;;           中断入口程序              ;;
;****************************************
;
              ORG 0000H        ;程序执行开始地址
              LJMP      START  ;跳到标号START执行
              ORG 0003H        ;外中断0中断程序入口
              RETI             ;外中断0中断返回
              ORG 000BH        ;定时器T0中断程序入口
          LJMP      INTT0  ;跳至INTTO执行
              ORG 0013H        ;外中断1中断程序入口
          RETI             ;外中断1中断返回
          ORG 001BH        ;定时器T1中断程序入口
          LJMP      INTT1  ;跳至INTT1执行
          ORG 0023H        ;串行中断程序入口地址
              RETI             ;串行中断程序返回
;
;****************************************
;;          以下程序开始                 ;;
;****************************************
;整点报时用
QQQQ             : MOV  A,#10H
                   MOV  B,79H
                   MUL  AB
                   ADD  A,78H
                   MOV  CONBS,A
           BSLOOP: LCALL DS20MS
                   LCALL DL1S
                   LCALL DL1S
                   LCALL DL1S
                   DJNZ CONBS,BSLOOP
                   CLR   08H          ;清整点报时标志
                   AJMP  START1
;
;****************************************
;;          主程序开始                 ;;
;****************************************
;
            START: LCALL ST             ;上电显示年月日及班级学号
                   MOV   R0,#00H          ;清00H-7FH内存单元
                   MOV   R7,#80H          ;
       CLEARDISP:  MOV   @R0,#00H          ;
                   INC   R0             ;
                   DJNZ  R7,CLEARDISP   ;
                   MOV   20H,#00H         ;清20H(标志用)
                   MOV   7AH,#0AH       ;放入"熄灭符"数据
                   MOV      TMOD,#11H      ;设T0、T1为16位定时器
                   MOV   TL0,#0B0H       ;50MS定时初值(T0计时用)
                   MOV   TH0,#3CH       ;50MS定时初值
                   MOV   TL1,#0B0H       ;50MS定时初值(T1闪烁定时用)
                   MOV   TH1,#3CH        ;50MS定时初值
                   SETB  EA             ;总中断开放
                   SETB  ET0            ;允许T0中断
                   SETB  TR0            ;开启T0定时器
                   MOV   R4,#14H        ;1秒定时用计数值(50MS×20)
                   MOV   DISPFIRST,#70H ;显示单元为70-75H
;以下主程序循环
           START1: LCALL DISPLAY        ;调用显示子程序
                   JNB      P1.0,SETMM1    ;P1.0口为0时转时间调整程序
                   JNB   P1.1,FUNSS     ;秒表功能,P1.1按键调时时作减1加能
                   JNB   P1.2,FUNPT     ;秒表STOP,PUSE,CLR
                   JNB   P1.3,TSFUN     ;定时闹铃设定
                   JB   08H,  QQQQ
                   AJMP  START1         ;P1.0口为1时跳回START1
;
          FUNPT:  LJMP  FUNPTT
;以下闹铃时间设定程序,按P1.3进入设定
            TSFUN: LCALL DS20MS
                   JB    P1.3,START1     ;
         WAIT113:  JNB   P1.3,WAIT113    ;等待键释放
                   JB   05H,CLOSESP      ;闹铃已开的话,关闹铃
                   MOV   DISPFIRST,#50H  ;进入闹铃设定程序,显示50-55H闹钟定时单元
                   MOV   50H,#0CH        ;"-"   闹铃设定时显示格式00:00: -
                   MOV   51H,#0AH        ;"黑"
;
         DSWAIT:   SETB   EA
                   LCALL DISPLAY
                   JNB  P1.2,DSFINC       ;分加1
                   JNB  P1.0,DSDEC        ;分减1
                   JNB  P1.3,DSSFU        ;进入时调整
                   AJMP DSWAIT
;
          CLOSESP: CLR  05H              ;关闹铃标志
                   CLR  BELL
                   AJMP  START1
           DSSFU:  LCALL DS20MS         ;消抖
                   JB  P1.3, DSWAIT
                   LJMP  DSSFUNN         ;进入时调整
;
           SETMM1:      LJMP SETMM     ;转到时间调整程序SETMM
;
        DSFINC :   LCALL DS20MS         ;消抖
                   JB  P1.2, DSWAIT
        DSWAIT12: LCALL DISPLAY         ;等键 释放
                  JNB   P1.2, DSWAIT12
                  CLR   EA
                  MOV   R0,#53H            ;
                  LCALL ADD1               ;闹铃设定分加1
                  MOV      A,R3              ;分数据放入A

                  CLR   C                 ;清进位标志
                  CJNE  A,#60H,ADDHH22      ;
            ADDHH22: JC     DSWAIT             ;小于60分时返回
                   ACALL CLR0              ;大于或等于60分时分计时单元清0
                   AJMP  DSWAIT
         DSDEC :   LCALL DS20MS         ;消抖
                   JB  P1.0, DSWAIT
        DSWAITEE: LCALL DISPLAY         ;等键 释放
                  JNB   P1.0, DSWAITEE
                  CLR   EA
                  MOV   R0,#53H            ;
                  LCALL sub1               ;闹铃设定分减1
                  LJMP DSWAIT

;以下秒表功能/时钟转换程序
;按下P1.1 可进行功能转换
            FUNSS: LCALL DS20MS
                   JB    P1.1,START11
         WAIT11:   JNB   P1.1,WAIT11
                   CPL   03H
                   JNB   03H,TIMFUN
                   MOV   DISPFIRST,#60H  ;显示秒表数据单元
                   MOV   60H,#00H
                   MOV   61H,#00H
                   MOV   62H,#00H
                   MOV   63H,#00H
                   MOV   64H,#00H
                   MOV   65H,#00H
                   MOV   TL1,#0F0H       ;10MS定时初值()
                   MOV   TH1,#0D8H        ;10MS定时初值
                   SETB  TR1
                   SETB  ET1
         START11:  LJMP  START1
            TIMFUN:MOV   DISPFIRST,#70H  ;显示时钟数据单元
                   CLR   ET1
                   CLR   TR1
       START12:    LJMP  START1
;以下秒表暂停\清零功能程序
;按下P1.2暂停或清0,按下P1.1退出秒表回到时钟计时
            FUNPTT: LCALL DS20MS
                   JB    P1.2,START12
         WAIT22:   JNB   P1.2,WAIT21
                   CLR   ET1
                   CLR   TR1
         WAIT33:   JNB  P1.1,FUNSS
                   JB   P1.2,WAIT31
                   LCALL DS20MS
                   JB    P1.2,WAIT33
        WAIT66:    JNB   P1.2,WAIT61
                   MOV   60H,#00H
                   MOV   61H,#00H
                   MOV   62H,#00H
                   MOV   63H,#00H
                   MOV   64H,#00H
                   MOV   65H,#00H
       WAIT44:     JNB  P1.1,FUNSS
                   JB   P1.2,WAIT41
                   LCALL DS20MS
                   JB    P1.2,WAIT44
       WAIT55:     JNB   P1.2,WAIT51
                   SETB  ET1
                   SETB  TR1
                   AJMP  START1
;以下键等待释放时显示不会熄灭用
    WAIT21:        LCALL DISPLAY
                   AJMP  WAIT22
    WAIT31:        LCALL DISPLAY
                   AJMP  WAIT33
    WAIT41:        LCALL DISPLAY
                   AJMP  WAIT44
    WAIT51:        LCALL DISPLAY
                   AJMP  WAIT55
    WAIT61:        LCALL DISPLAY
                   AJMP  WAIT66
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           1秒计时程序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
            INTT0: PUSH  ACC           ;累加器入栈保护
                   PUSH  PSW           ;状态字入栈保护
                   CLR   ET0           ;关T0中断允许
                   CLR   TR0           ;关闭定时器T0
                   MOV   A,#0B7H       ;中断响应时间同步修正
                   ADD   A,TL0         ;低8位初值修正
                   MOV   TL0,A         ;重装初值(低8位修正值)
                   MOV   A,#3CH        ;高8位初值修正
                   ADDC  A,TH0         ;
                   MOV   TH0,A         ;重装初值(高8位修正值)
                   SETB  TR0           ;开启定时器T0
                   DJNZ  R4, OUTT0         ;20次中断未到中断退出
           ADDSS:  MOV     R4,#14H           ;20次中断到(1秒)重赋初值

                   CPL   07H               ;闹铃时间隔呜叫用
                   MOV      R0,#71H           ;指向秒计时单元(71H-72H)
                   ACALL ADD1              ;调用加1程序(加1秒操作)
                   MOV   A,R3              ;秒数据放入A(R3为2位十进制数组合)
                   CLR     C                 ;清进位标志
                   CJNE  A,#60H,ADDMM      ;
           ADDMM:  JC       OUTT0             ;小于60秒时中断退出
                   ACALL CLR0              ;大于或等于60秒时对秒计时单元清0
                   MOV     R0,#77H           ;指向分计时单元(76H-77H)
                   ACALL ADD1              ;分计时单元加1分钟
                   MOV      A,R3              ;分数据放入A
                   CLR   C                 ;清进位标志
                   CJNE  A,#60H,ADDHH      ;
            ADDHH: JC     OUTT0             ;小于60分时中断退出
                   ACALL CLR0              ;大于或等于60分时分计时单元清0
                   LCALL DS20MS             ;正点报时
                   SETB  08H
                   MOV     R0,#79H           ;指向小时计时单元(78H-79H)
                   ACALL ADD1              ;小时计时单元加1小时
                   MOV   A,R3              ;时数据放入A
                   CLR   C                 ;清进位标志
                   CJNE  A,#24H,HOUR       ;
             HOUR: JC    OUTT0             ;小于24小时中断退出
                   ACALL CLR0              ;大于或等于24小时小时计时单元清0
            OUTT0: MOV   72H,76H           ;中断退出时将分、时计时单元数据移
                   MOV   73H,77H           ;入对应显示单元
                   MOV   74H,78H           ;
                   MOV   75H,79H           ;
                   LCALL  BAOJ
                   POP      PSW               ;恢复状态字(出栈)
                   POP   ACC               ;恢复累加器
                   SETB  ET0               ;开放T0中断
                   RETI                    ;中断返回
;
;****************************************
;;    闪动调时程序\秒表功能程序        ;;
;****************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1:          PUSH    ACC                ;中断现场保护
                PUSH    PSW                ;
                JB      03H, MMFUN         ;=1时秒表
                MOV     TL1,   #0B0H       ;装定时器T1定时初值
                MOV     TH1,   #3CH           ;
                DJNZ    R2,INTT1OUT           ;0.3秒未到退出中断(50MS中断6次)
                MOV     R2,#06H               ;重装0.3秒定时用初值
                CPL     02H                   ;0.3秒定时到对闪烁标志取反
                JB      02H,FLASH1            ;02H位为1时显示单元"熄灭"
                MOV     72H,76H       ;02H位为0时正常显示
                MOV     73H,77H       ;
                MOV     74H,78H       ;
                MOV     75H,79H       ;
INTT1OUT:       POP     PSW             ;恢复现场
                POP     ACC           ;
                RETI                  ;中断退出
FLASH1:         JB      01H,FLASH2    ;01H位为1时,转小时熄灭控制
                MOV     72H,7AH       ;01H位为0时,"熄灭符"数据放入分
                MOV     73H,7AH       ;显示单元(72H-73H),将不显示分数据
                MOV     74H,78H       ;
                MOV     75H,79H       ;
                AJMP    INTT1OUT      ;转中断退出
FLASH2:         MOV     72H,76H       ;01H位为1时,"熄灭符"数据放入小时
                MOV     73H,77H       ;显示单元(74H-75H),小时数据将不显示
                MOV     74H,7AH       ;
                MOV     75H,7AH       ;
                AJMP    INTT1OUT      ;转中断退出
;
MMFUN :            CLR  TR1
                   MOV   A,#0F7H       ;中断响应时间同步修正,重装初值(10ms)
                   ADD   A,TL1         ;低8位初值修正
                   MOV   TL1,A         ;重装初值(低8位修正值)
                   MOV   A,#0D8H        ;高8位初值修正
                   ADDC  A,TH1         ;
                   MOV   TH1,A         ;重装初值(高8位修正值)
                   SETB  TR1           ;开启定时器T0
                   MOV      R0,#61H           ;指向秒计时单元(71H-72H)
                   ACALL ADD1              ;调用加1程序(加1秒操作)
                   CLR   C                 ;
                   MOV   A,R3              ;
                   JZ    FSS1              ;加1后为00,C=0
                   AJMP  OUTT01            ;加1后不为00,C=1
  FSS1:            ACALL CLR0              ;大于或等于60秒时对秒计时单元清0
                   MOV     R0,#63H           ;指向分计时单元(76H-77H)
                   ACALL ADD1              ;分计时单元加1分钟
                   MOV      A,R3              ;分数据放入A
                   CLR   C                 ;清进位标志
                   CJNE  A,#60H,ADDHH1      ;
            ADDHH1: JC     OUTT01             ;小于60分时中断退出
                   LCALL CLR0              ;大于或等于60分时分计时单元清0
                   MOV     R0,#65H           ;指向小时计时单元(78H-79H)
                   ACALL ADD1              ;小时计时单元加1小时

            OUTT01:
                   POP      PSW               ;恢复状态字(出栈)
                   POP   ACC               ;恢复累加器
                   RETI                    ;中断返回            ;
;****************************************
;;           加1子 程 序              ;;
;****************************************
;
;
             ADD1: MOV     A,@R0       ;取当前计时单元数据到A
                   DEC     R0          ;指向前一地址
                   SWAP  A           ;A中数据高四位与低四位交换
                   ORL      A,@R0       ;前一地址中数据放入A中低四位
                   ADD     A,#01H      ;A加1操作
                   DA      A           ;十进制调整
                   MOV   R3,A        ;移入R3寄存器
                   ANL      A,#0FH      ;高四位变0
                   MOV      @R0,A       ;放回前一地址单元
                   MOV     A,R3        ;取回R3中暂存数据
                   INC     R0          ;指向当前地址单元
                   SWAP     A           ;A中数据高四位与低四位交换
                   ANL      A,#0FH      ;高四位变0
                   MOV     @R0,A       ;数据放入当削地址单元中
                   RET                  ;子程序返回
;
;****************************************
;;           分减1子 程 序              ;;
;****************************************
;
             SUB1: MOV     A,@R0       ;取当前计时单元数据到A
                   DEC     R0          ;指向前一地址
                   SWAP  A           ;A中数据高四位与低四位交换
                   ORL      A,@R0       ;前一地址中数据放入A中低四位
                   JZ    SUB11
                   DEC     A           ;A减1操作
           SUB111: MOV   R3,A        ;移入R3寄存器
                   ANL      A,#0FH      ;高四位变0
                   CLR     C           ;清进位标志
                   SUBB  A,#0AH
          SUB1111: JC       SUB1110
                   MOV      @R0,#09H    ;大于等于0AH,为9
          SUB110:  MOV     A,R3        ;取回R3中暂存数据
                   INC     R0          ;指向当前地址单元
                   SWAP     A           ;A中数据高四位与低四位交换
                   ANL      A,#0FH      ;高四位变0
                   MOV     @R0,A       ;数据放入当削地址单元中
                   RET               ;子程序返回
   ;
            SUB11: MOV   A,#59H
                   AJMP  SUB111
           SUB1110:MOV   A,R3        ;移入R3寄存器
                   ANL      A,#0FH      ;高四位变0
                   MOV   @R0,A
                   AJMP  SUB110
;****************************************
;;           时减1子 程 序             ;;
;****************************************
;
             SUBB1:MOV     A,@R0       ;取当前计时单元数据到A
                   DEC     R0          ;指向前一地址
                   SWAP  A           ;A中数据高四位与低四位交换
                   ORL      A,@R0       ;前一地址中数据放入A中低四位
                   JZ    SUBB11      ;00减1为23(小时)
                   DEC     A           ;A减1操作
           SUBB111:MOV   R3,A        ;移入R3寄存器
                   ANL      A,#0FH      ;高四位变0
                   CLR     C           ;清进位标志
                   SUBB  A,#0AH      ;时个位大于9为9
         SUBB1111: JC       SUBB1110    ;
                   MOV      @R0,#09H    ;大于等于0AH,为9
          SUBB110: MOV     A,R3        ;取回R3中暂存数据
                   INC     R0          ;指向当前地址单元
                   SWAP     A           ;A中数据高四位与低四位交换
                   ANL      A,#0FH      ;高四位变0
                   MOV     @R0,A       ;时十位数数据放入
                   RET               ;子程序返回
   ;
           SUBB11: MOV   A,#23H
                   AJMP  SUBB111
          SUBB1110:MOV   A,R3        ;时个位小于0A不处理
                   ANL      A,#0FH      ;高四位变0
                   MOV   @R0,A       ;个位移入
                   AJMP  SUBB110
;****************************************
;;           清零程序                  ;;
;****************************************
;对计时单元复零用
             CLR0: CLR         A           ;清累加器
                   MOV         @R0,A       ;清当前地址单元
                   DEC         R0          ;指向前一地址
                   MOV         @R0,A       ;前一地址单元清0
                   RET                      ;子程序返回
;
;****************************************
;;           时钟时间调整程序          ;;
;****************************************
;当调时按键按下时进入此程序
           SETMM:  cLR      ET0            ;关定时器T0中断
                   CLR      TR0            ;关闭定时器T0
                   LCALL      DL1S           ;调用1秒延时程序
                   LCALL DS20MS                ;消抖
                   JB          P1.0,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
                   MOV      R2,#06H        ;进入调时状态,赋闪烁定时初值
                   MOV          70H,#00H       ;调时时秒单元为00 秒
                   MOV          71H,#00H
                   SETB     ET1            ;允许T1中断
                   SETB     TR1            ;开启定时器T1
            SET2:  JNB         P1.0,SET1      ;P1.0口为0(键未释放),等待
                   SETB      00H            ;键释放,分调整闪烁标志置1
            SET4:  JB          P1.0,SET3      ;等待键按下
                   LCALL       DL05S          ;有键按下,延时0.5秒
                   LCALL DS20MS                ;消抖
                   JNB        P1.0,SETHH     ;按下时间大于0.5秒转调小时状态
                   MOV         R0,#77H        ;按下时间小于0.5秒加1分钟操作
                   LCALL     ADD1           ;调用加1子程序
                   MOV         A,R3           ;取调整单元数据
                   CLR         C              ;清进位标志
                   CJNE     A,#60H,HHH     ;调整单元数据与60比较
              HHH: JC         SET4           ;调整单元数据小于60转SET4循环
                   LCALL     CLR0           ;调整单元数据大于或等于60时清0
                   CLR         C              ;清进位标志
                   AJMP      SET4           ;跳转到SET4循环
        CLOSEDIS:  SETB      ET0           ;省电(LED不显示)状态。开T0中断
                   SETB      TR0           ;开启T0定时器(开时钟)
        CLOSE:     JB        P1.0,CLOSE    ;无按键按下,等待。
                   LCALL DS20MS                ;消抖
                   JB        P1.0,CLOSE     ;是干扰返回CLOSE等待
        WAITH:     JNB       P1.0,WAITH     ;等待键释放
                   LJMP      START1         ;返回主程序(LED数据显示亮)
           SETHH:  CLR       00H           ;分闪烁标志清除(进入调小时状态)
                   SETB         01H            ;小时调整标志置1
          SETHH1:  JNB         P1.0,SET5      ;等待键释放
            SET6:  JB          P1.0,SET7      ;等待按键按下
                   LCALL       DL05S          ;有键按下延时0.5秒
                   LCALL DS20MS                 ;消抖
                   JNB        P1.0,SETOUT    ;按下时间大于0.5秒退出时间调整
                   MOV         R0,#79H       ;按下时间小于0.5秒加1小时操作
                   LCALL      ADD1            ;调加1子程序
                   MOV         A,R3            ;
                   CLR         C                ;
                   CJNE     A,#24H,HOUU      ;计时单元数据与24比较
            HOUU:  JC         SET6             ;小于24转SET6循环
                   LCALL     CLR0             ;大于或等于24时清0操作
                   AJMP      SET6             ;跳转到SET6循环
           SETOUT: JNB       P1.0,SETOUT1     ;调时退出程序。等待键释放
                   LCALL DS20MS                  ;消抖
                   JNB       P1.0,SETOUT      ;是抖动,返回SETOUT再等待
                   CLR       01H              ;清调小时标志
                   CLR       00H              ;清调分标志
                   CLR       02H              ;清闪烁标志
                   CLR       TR1              ;关闭定时器T1
                   CLR       ET1              ;关定时器T1中断
                   SETB      TR0              ;开启定时器T0
                   SETB      ET0              ;开定时器T0中断(计时开始)
                   LJMP     START1           ;跳回主程序
            SET1:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调分)
                   AJMP     SET2             ;防止键按下时无时钟显示
            SET3:  LCALL    DISPLAY          ;等待调分按键时时钟显示用
                   JNB      P1.1, FUNSUB     ;减1分操作
                   AJMP     SET4             ;调分等待
            SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时)
                   AJMP     SETHH1           ;防止键按下时无时钟显示
            SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用
                   JNB      P1.1, FUNSUBB     ;小时减1操作
                   AJMP     SET6              ;调时等待
         SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待
                   AJMP    SETOUT            ;防止键按下时无时钟显示
;FUNSUB,分减1程序?
          FUNSUB:  LCALL DS20MS              ;消抖
                   JB       P1.1,SET41       ;干扰,返回调分等待
          FUNSUB1: JNB      P1.1,FUNSUB1     ;等待键放开
                   MOV         R0,#77H          ;
                   LCALL    SUB1             ;分减1程序
                   LJMP     SET4             ;返回调分等待
;
            SET41: LJMP     SET4             ;
;FUNSUBB,时减1程序                                            ;
         FUNSUBB:  LCALL DS20MS              ;消抖
                   JB       P1.1,SET61       ; 干扰,返回调时等待
         FUNSUBB1: JNB      P1.1,FUNSUBB1    ; 等待键放开
                   MOV         R0,#79H          ;
                   LCALL    SUBB1            ; 时减1程序
                   LJMP     SET6             ; 返回调时等待
;
            SET61: LJMP  SET6
;***************************************
;;           显示程序                  ;;
;***************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
          DISPLAY: MOV         R1,DISPFIRST       ;指向显示数据首址
                   MOV         R5,#0FEH      ;扫描控制字初值
             PLAY: MOV         A,R5          ;扫描字放入A
                   MOV         P2,A          ;从P2口输出
                   MOV         A,@R1         ;取显示数据到A
                   MOV         DPTR,#TAB     ;取段码表地址
                   MOVC        A,@A+DPTR     ;查显示数据对应段码
                   MOV         P0,A          ;段码放入P1口
                   MOV          A,R5          ;
                   JB           ACC.2,LOOP5   ;小数点处理
                   CLR          P0.7          ;
       LOOP5:      JB           ACC.4,LOOP6   ;小数点处理
                   CLR          P0.7          ;
       LOOP6:      LCALL     DL1MS         ;显示1MS
                   INC         R1            ;指向下一地址
                   MOV         A,R5            ;扫描控制字放入A
                   JNB         ACC.5,ENDOUT    ;ACC.5=0时一次显示结束
                   RL         A               ;A中数据循环左移
                   MOV         R5,A            ;放回R5内
                   MOV         P0,#0FFH
                   AJMP     PLAY            ;跳回PLAY循环
           ENDOUT: MOV          P2,#0FFH            ;一次显示结束,P2口复位
                   MOV         P0,#0FFH       ;P0口复位
                   RET                      ;子程序返回
             TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共阳段码表          "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-”
;
;****************************
; SDISPLAY ,上电显示子程序
;****************************
;不带小数点显示,有“A”“-”显示功能
         SDISPLAY: MOV          R1,DISPFIRST
                   MOV         R5,#0FEH      ;扫描控制字初值
            SPLAY: MOV         A,R5          ;扫描字放入A
                   MOV         P2,A          ;从P2口输出
                   MOV         A,@R1         ;取显示数据到A
                   MOV         DPTR,#TABS     ;取段码表地址
                   MOVC        A,@A+DPTR     ;查显示数据对应段码
                   MOV         P0,A          ;段码放入P1口
                   MOV          A,R5          ;
                   LCALL     DL1MS         ;显示1MS
                   INC         R1            ;指向下一地址
                   MOV         A,R5            ;扫描控制字放入A
                   JNB         ACC.5,ENDOUTS    ;ACC.5=0时一次显示结束
                   RL         A               ;A中数据循环左移
                   MOV         R5,A            ;放回R5内
                   AJMP     SPLAY            ;跳回PLAY循环
          ENDOUTS: MOV          P2,#0FFH            ;一次显示结束,P2口复位
                   MOV         P0,#0FFH       ;P0口复位
                   RET                      ;子程序返回
             TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H
             ; 显示数  "0    1    2    3    4   5   6   7   8    9  不亮  C   -    A  "
             ; 内存数  "0    1    2    3    4   5   6   7   8    9  0AH   0BH 0CH  0DH "
;STAB表,启动时显示2006年12月23日、C04-2-28(学号)用
          STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,04H,00H,0BH,0AH,0AH
                DB 03H,02H,0CH,02H,01H,0CH,06H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
;          注:0A不亮,0B显示“A”,0C显示“-”
;
;***********************************************************
;ST,上电时显示年月班级用,采用移动显示,先右移,接着左移.
;***********************************************************
           ST:      MOV        R0,#40H      ;将显示内容移入40H-5FH单元
                    MOV        R2,#20H      ;
                    MOV        R3,#00H      ;
                    CLR        A            ;
                    MOV        DPTR,#STAB   ;
           SLOOP:   MOVC       A,@A+DPTR    ;
                    MOV        @R0,A        ;
                    MOV        A,R3         ;
                    INC        A            ;
                    MOV        R3,A         ;
                    INC        R0           ;
                    DJNZ       R2,SLOOP     ;移入完毕
                    MOV        DISPFIRST,#40H  ;以下程序从左往右移
          SSLOOP:   MOV        R2,#50          ;控制移动速度
          SSLOOP1:  LCALL      SDISPLAY        ;
                    DJNZ       R2,SSLOOP1      ;
                    INC        DISPFIRST
                    MOV        A,DISPFIRST
                    CJNE       A,#5AH, SSLOOP  ;
                    MOV        DISPFIRST,#5AH  ;以下程序从右往左移
                    MOV        R3,#1BH         ;显示27个单元
          SSLOOP2:  MOV        R2,#32H        ;控制移动速度
          SSLOOP12: LCALL      SDISPLAY       ;
                    DJNZ       R2,SSLOOP12     ;
                    DEC        DISPFIRST
                    DJNZ       R3,SSLOOP2      ;
                    RET
;*******************************************
;;           延时程序                     ;;
;*******************************************
;
;1MS延时程序,LED显示程序用
             DL1MS: MOV     R6,#14H
             DL1:   MOV     R7,#19H
             DL2:   DJNZ     R7,DL2
                    DJNZ     R6,DL1
                    RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
           DS20MS: CLR          BELL
                   LCALL      DISPLAY
                   LCALL     DISPLAY
                   LCALL     DISPLAY
                   SETB          BELL
                   RET
;延时程序,用作按键时间的长短判断
           DL1S:   LCALL      DL05S
                   LCALL      DL05S
                   RET
          DL05S:   MOV        R3,#20H      ;8毫秒*32=0.196秒
          DL05S1:  LCALL      DISPLAY
                   DJNZ       R3,DL05S1
                   RET
;*************************************
;以下是闹铃时间设定程序中的时调整程序
;*************************************
DSSFUNN:          LCALL DISPLAY         ;等待键释放
                  JNB   P1.3, DSSFUNN
                 MOV    50H,#0AH        ;时调整时显示为00:00:- .
                 MOV    51H,#0CH
        WAITSS:    SETB  EA
                  LCALL DISPLAY
                  JNB   P1.2,FFFF      ;时加1键
                  JNB   P1.0,DDDD      ;时减1
                  JNB   P1.3,OOOO      ;闹铃设定退出键
                  JNB   P1.1,ENA       ;闹铃设定有效或无效按键
                  AJMP  WAITSS
       OOOO:      LCALL DS20MS         ;消抖
                  JB   P1.3, WAITSS
     DSSFUNNM:    LCALL DISPLAY         ;键释放等待
                  JNB   P1.3, DSSFUNNM
                  MOV  DISPFIRST,#70H
                  LJMP START1
       ENA:       LCALL DS20MS         ;消抖        ;
                  JB   P1.1, WAITSS
     DSSFUNMMO:   LCALL DISPLAY         ;键释放等待
                  JNB   P1.1, DSSFUNMMO
                  CPL  05H
                  JNB  05H,WAITSS11
                  MOV  50H,#00H        ;05H=1,闹铃开,显示为 00:00: 0。
                  AJMP  WAITSS
          WAITSS11: MOV  50H,#0aH        ;闹铃不开,显示为00:00:- .
                  AJMP  WAITSS
       FFFF:      LCALL DS20MS            ;消抖        ;
                  JB   P1.2, WAITSS
     DSSFUNMM:    LCALL DISPLAY         ;键释放等待
                  JNB   P1.2, DSSFUNMM
                  CLR   EA
                  MOV   R0,#55H
                  LCALL ADD1
                  MOV      A,R3            ;

                  CLR   C                 ;
                  CJNE  A,#24H,ADDHH33N   ;
        ADDHH33N: JC     WAITSS    ;小于24点返回
                  ACALL CLR0              ;大于等于24点清零
                  AJMP  WAITSS
     DDDD  :      LCALL DS20MS            ;消抖        ;
                  JB   P1.0, WAITSS
     DSSFUNDD:    LCALL DISPLAY         ;键释放等待
                  JNB   P1.0, DSSFUNDD
                  CLR   EA
                  MOV   R0,#55H
                  LCALL SUBB1
                  LJMP  WAITSS
;*********************
;以下是闹铃判断子程序
;*********************
BAOJ:               JNB   05H,BBAO       ;05H=1,闹钟开,要比较数据
                    MOV    A,79H         ;从时十位、个位、分十位、分个位顺序比较
                    CJNE   A,55H,BBAO
                    MOV    A,78H
                    CLR    C
BB3:                CJNE   A,54H,BBAO
                    MOV    A,77H
                    CLR   C
                    CJNE   A,53H,BBAO
                    MOV    A,76H
                    CLR    C
BB2:                CJNE   A,52H,BBAO
                    JNB   07H,BBAO        ;07H在1秒到时会取反
                    CLR    BELL           ;时分相同时呜叫(1秒间隔叫)
                    RET
;
              BBAO: SETB  BELL            ;不相同或闹铃不开
                    RET
;********************************************************
                   END                     ;程序结束


关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:42,218.75000 毫秒