您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>汇编编程>

DS1302-制作的电子时钟程序分享

大小:0.1 MB 人气: 2017-09-06 需要积分:0

DS1302-制作的电子时钟程序分享

 ;8位数码管显示
 ;P0 为段码口、P2 为位码口
 ;晶振 11.0592M
 ;时钟芯片:DS1302
 ;************** DS1302 端口位定义 **************
          IO_DATA  BIT  P1.1     ; 数据传送总线
          SCLK     BIT  P1.0     ; 时钟控制总线
          RST      BIT  P1.2     ; 复位总线
          K1     EQU  P1.4       ;独立键
          K2     EQU  P1.5
          K3     EQU  P1.6
          K4     EQU  P1.7
          BEEP   EQU  P3.7       ;蜂鸣器
          RELAY  EQU  P1.3       ;继电器
          T_CONU  EQU  22H       ;中断计数
          TIME_L  EQU  23H       ;定时初值
          TIME_H  EQU  24H
          TIME_DATA   EQU  50H   ;显示时间单元首地址
          DATE_DATA   EQU  60H   ;显示日期单元首地址
          DS_DATA     EQU  58H   ;显示定时时间单元首地址
;------------------------------------------------
          ORG 0000H
          AJMP MAIN
          ORG  000BH
          AJMP  INT_T0
          ORG  0100H
;------------------------------------------------
MAIN:
          MOV  TMOD,#01H        ;T0,方式1
          MOV  TIME_L,#00H      ;50MS定时值
          MOV  TIME_H,#4CH
          MOV  T_CONU,#00H      ;中断次数
          MOV  IE,#82H          ;EA=1,ET0=1
          MOV  A,#00H
          MOV  R0,#40H          ;从40H单元开始
          MOV  R1,#40H          ;清64个单元
M_CLEAR:  MOV  @R0,A
          INC  R0
          DJNZ  R1,M_CLEAR
          MOV  7FH,#0AH         ;送熄灭符
          SETB   BEEP
          LCALL  TIME_DELAY     ;调显示延时
          LCALL  PROSET         ;DS1302初始化
MAIN1:
          LCALL  GET_TIME       ;从DS1302读数据程序
          LCALL  CHULI          ;实时时间数据处理
          MOV  R0,#TIME_DATA    ;显示时、分、秒
          LCALL  DISP
          MOV  R0,#TIME_DATA
          LCALL  TIME_DISPLAY
          LCALL  SET_KEY        ;键功能程序
          LCALL  COMP           ;实时时间与定时时间比较
          JB  K1,MAIN1
          CALL  BEEP_BL
MAIN2:
          LCALL  CHULI          ;日期数据处理
          MOV  R0,#DATE_DATA
          LCALL  DISP           ;显示年、月、日
          MOV  R0,#DATE_DATA
          LCALL  TIME_DISPLAY
          JB  K1,MAIN2
          CALL  BEEP_BL
MAIN3:
          LCALL  DS_CHULI        ;定时时间数据处理
          MOV  R0,#DS_DATA
          LCALL  DS_SP           ;显示定时时间
          MOV  R0,#DS_DATA
          LCALL  DS_DISPLAY
          JB  K1,MAIN3
          CALL  BEEP_BL
          AJMP  MAIN1
;--------------------------------------------
;中断服务子程序
;300MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
          PUSH  ACC
          PUSH  PSW
          MOV  TL0,TIME_L
          MOV  TH0,TIME_H
          INC  T_CONU
          MOV  A,T_CONU
          CJNE  A,#06H,INT_END
          MOV  T_CONU,#00H
          CPL  0AH
INT_END:
          POP  PSW
          POP  ACC
          RETI
;--------------------------------------------
;DS1302 初始化子程序
; (R0)=数据  (R1)=地址
;--------------------------------------------
PROSET:
           CLR   RST            ;DS1302复位
           CLR   SCLK
           NOP
           NOP
           SETB  RST
          ;MOV  R1,#80H          ;写秒寄存器
          ;MOV  R0,#00H          ;启动振荡器
          ;LCALL WRITE
          ;MOV  R1,#82H          ;写分寄存器
          ;MOV  R0,#58H
          ;LCALL WRITE
          ;MOV  R1,#84H          ;写时寄存器
          ;MOV  R0,#80H
          ;LCALL WRITE
          MOV  R1,#90H          ;写充电寄存器
          MOV  R0,#0ABH
          LCALL WRITE
          RET
;===============================================
;读时间、日期数据子程序
;存放单元 40H - 46H
;===============================================
GET_TIME:
          MOV  R1,#81H          ;读秒
          LCALL  READ
          MOV 40H,R0
          MOV  R1,#83H          ;读分
          LCALL  READ
          MOV 41H,R0
          MOV  R1,#85H          ;读时
          LCALL  READ
          MOV 42H,R0
          MOV  R1,#87H          ;读出日期
          LCALL  READ
          MOV 43H,R0
          MOV  R1,#89H          ;读出月份
          LCALL  READ
          MOV 44H,R0
          MOV  R1,#8BH          ;读出星期
          LCALL  READ
          MOV 46H,R0
          MOV  R1,#8DH          ;读出年
          LCALL  READ
          MOV 45H,R0
          RET
;================================================
;写 DS1302 子程序
;================================================
WRITE:
          CLR  SCLK
          NOP
          NOP
          SETB  RST
          NOP
          MOV  A,R1
          MOV  R2,#08H
WRI_01:
          RRC  A                ;传输地址到DS1302
          NOP
          NOP
          CLR  SCLK
          NOP
          NOP          
          MOV  IO_DATA,C
          NOP
          NOP         
          SETB  SCLK
          NOP
          NOP
          DJNZ  R2,WRI_01
          CLR  SCLK
          NOP
          NOP
          MOV  A,R0
          MOV  R2,#08H
WRI_02:
          RRC  A           ;传输数据到DS1302
          NOP
          CLR  SCLK
          NOP
          NOP
          MOV  IO_DATA,C
          NOP
          NOP
          SETB  SCLK
          NOP
          NOP
          DJNZ  R2,WRI_02
          CLR  SCLK
          NOP
          NOP
          CLR  RST
          NOP
          NOP
          RET
;=================================================
;读 DS1302 子程序
;=================================================
READ:
          CLR   SCLK
          NOP
          NOP
          SETB  RST
          NOP
          NOP
          MOV  A,R1
          MOV  R2,#08H
READ_01:
          RRC  A
          NOP               ;先传输地址到DS1302
          MOV  IO_DATA,C
          NOP
          NOP
          SETB  SCLK
          NOP
          NOP
          CLR  SCLK
          NOP
          NOP
          DJNZ  R2,READ_01
          NOP
          NOP
          SETB  IO_DATA
          CLR  A
          CLR  C
          MOV  R2,#08H
READ_02:
          CLR  SCLK
          NOP
          NOP         
          MOV  C,IO_DATA
          NOP
          NOP         
          RRC  A                ;再从DS1302接收数据
          NOP
          NOP          
          SETB  SCLK
          NOP
          NOP          
          DJNZ  R2,READ_02
          MOV  R0,A
          CLR  RST
          RET
;==============================================
;实时时间、日期数据处理子程序
;==============================================
 CHULI:
          MOV A,40H               ;处理秒数据
          ANL A,#0FH
          MOV 50H,A
          MOV 70H,A
          MOV A,40H
          ANL A,#11110000B
          SWAP A
          MOV 51H,A
          MOV 71H,A
;---------------------------------------------
          MOV A,41H               ;处理分数据
          ANL A,#0FH
          MOV 52H,A
          MOV 72H,A
          MOV A,41H
          ANL A,#11110000B
          SWAP A
          MOV 53H,A
          MOV 73H,A
;---------------------------------------------
          MOV A,42H               ;处理时数据
          ANL A,#0FH
          MOV 54H,A
          MOV 74H,A
          MOV A,42H
          ANL A,#11110000B
          SWAP A
          MOV 55H,A
          MOV 75H,A
;----------------------------------------------
          MOV A,43H               ;处理日数据
          ANL A,#0FH
          MOV 60H,A
          MOV 76H,A
          MOV A,43H
          ANL A,#11110000B
          SWAP A
          MOV 61H,A
          MOV 77H,A
;---------------------------------------------
          MOV A,44H               ;处理月数据
          ANL A,#0FH
          MOV 62H,A
          MOV 78H,A
          MOV A,44H
          ANL A,#11110000B
          SWAP A
          MOV 63H,A
          MOV 79H,A
;---------------------------------------------
          MOV A,45H               ;处理年数据
          ANL A,#0FH
          MOV 64H,A
          MOV  7AH,A
          MOV A,45H
          ANL A,#11110000B
          SWAP A
          MOV 65H,A
          MOV 7BH,A
;----------------------------------------------
          MOV A,46H               ;处理周数据
          MOV 66H,A
          MOV 7CH,A
          RET
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP:     ;MOV  R0,#TIME_DATA
          MOV R3,#06H
DISP1:    MOV A,@R0
          MOV DPTR,#TAB_NU
          MOVC A,@A+DPTR
          MOV @R0,A
          INC R0
          DJNZ R3,DISP1
          RET
;====================================================
;时间、日期显示子程序
;====================================================
TIME_DISPLAY:
          ;MOV  R0,#TIME_DATA      ;取得显示单元首地址
          MOV  R1,#07FH          ;从第一个数码管开始
          MOV  R2,#08H           ;共8个数码管
DISLP:    MOV  P0,@R0            ;获得当前单元数据
          MOV  A,R1
          MOV  P2,A             ;数码显示
          JB  ACC.5,DISLP1      ;第三位数码管显示 -
          MOV  P0,#0BFH
          JMP  DISLP3
DISLP1:   JB  ACC.2,DISLP2      ;第六位数码管显示 -
          MOV  P0,#0BFH
          JMP  DISLP3
DISLP2:   INC  R0
DISLP3:   MOV  A,R1              ;为下一个数准备
          RR  A                  ;下一个单元
          MOV  R1,A              ;保存
          LCALL  DELAY           ;为了保证数码管亮度,延时
          DJNZ  R2,DISLP        ;重复显示,直到全部数据刷新过
          RET                   ;返回
DELAY:
          MOV  R4,#0AH
  L15:    MOV  R5,#64H
  L16:    DJNZ  R5,L16
          DJNZ  R4,L15
          RET
;******************************************************
SET_KEY:
         SETB  K1             ;增加键
         SETB  K2             ;减少键
         SETB  K3             ;选择键
         SETB  K4             ;定时设定功能键
         NOP
         JB  K4,KEY01
         LCALL  BEEP_BL
         JMP  DS_KEY          ;进入定时值设定子程序
KEY01:   JB  K2,KEY02
         LCALL  BEEP_BL
         JMP  SET_TIME        ;进入时间设定子程序
KEY02:   JB  K3,KEY03
         LCALL  BEEP_BL
         CPL  20H.0          ;止闹标记取反
KEY03:   RET
;-----------------------------------------------------
DS_KEY:
         CALL  DS_DELAY
         JNB  K4,$          
         LCALL  DSSET
         CALL  DS_DELAY
         RET
;==============================================
;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;==============================================
SET_TIME:
         MOV  R1,#8EH          ;写保护寄存器
         MOV  R0,#00H          ;允许写入
         LCALL WRITE
         MOV  R1,#80H          ;写秒寄存器
         MOV  R0,#80H          ;停止振荡器工作
         LCALL WRITE
         SETB  TR0
K001:    CALL TIME_DELAY       ;校时
         JNB K3,K001           ;K3为位移键
K010:
         CALL  CHULI
         JNB  0AH,KH01
         MOV  54H,7FH          ;送入熄灭符
         MOV  55H,7FH
         JMP  KH02
 KH01:   MOV  54H,74H          ;送实时值
         MOV  55H,75H          ;送实时值
 KH02:   MOV  R0,#TIME_DATA
         CALL  DISP
         MOV  R0,#TIME_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K011A
         JNB  K2,K011B
         JNB  K3,K002
         JMP  K010
K011A:
         MOV  A,42H
         ADD A,#01H
         DA A
         MOV 42H,A
         XRL  A,#24H
         JNZ K012A
         MOV  42H,#00H
K012A:   MOV  R1,#84H           ;写时寄存器
         MOV  R0,42H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K010
K011B:
         MOV  A,42H
         XRL  A,#00H
         JZ  K012B
         SETB  C              ;求补运算
         CLR  A
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,42H          ;加被减数
         DA A                 ;十进制调整
         MOV 42H,A            ;
         XRL  A,#00H
         JNZ K012C
K012B:   MOV  42H,#23H
K012C:   MOV  R1,#84H           ;写时寄存器
         MOV  R0,42H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K010
;-------------------------------------------------
K002:    CALL TIME_DELAY       ;校分
         JNB K3,K002            ;K3为位移键
K020:    CALL  CHULI
         JNB  0AH,KM01
         MOV  52H,7FH          ;送入熄灭符
         MOV  53H,7FH
         JMP  KM02
 KM01:   MOV  52H,72H          ;送实时值
         MOV  53H,73H          ;送实时值
 KM02:   MOV  R0,#TIME_DATA
         CALL  DISP
         MOV  R0,#TIME_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K021A
         JNB  K2,K021B
         JNB  K3,K003
         JMP  K020
K021A:
         MOV  A,41H
         ADD  A,#01H
         DA A
         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
 

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!