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

📄 asmsy54.asm

📁 DS12887时钟程序
💻 ASM
字号:
 
/*硬件实验*/
/*实验名称:   时钟芯片控制实验
/*版本:TK DPJ-1
/*程序:
/*时间:2005年3月5日
/*修改:
/*版权:
实验说明:   */
 
 
SECOND       XDATA   8000H ; 秒寄存器
SECOND_ALARM XDATA   8001H ; 秒闹钟寄存器
MINUTE       XDATA   8002H ; 分寄存器
MINUTE_ALARM XDATA   8003H ; 分闹钟寄存器
HOUR         XDATA   8004H ; 时寄存器
HOUR_ALARM   XDATA   8005H ; 时闹钟寄存器
WEEK         XDATA   8006H ; 星期寄存器
DATE         XDATA   8007H ; 日寄存器
MONTH        XDATA   8008H ; 月寄存器
YEAR         XDATA   8009H ; 年寄存器
REG_A        XDATA   800AH ; 寄存器 A
REG_B        XDATA   800BH ; 寄存器 B
REG_C        XDATA   800CH ; 寄存器 C
REG_D        XDATA   800DH ; 寄存器 D
CENTURY      XDATA   8032H ; 世纪寄存器
;==================================================

;-------------------------------------------------------
SECOND_BUFFER   EQU   51H ;秒缓冲区
MINUTE_BUFFER   EQU   52H ;分缓冲区
HOUR_BUFFER     EQU   53H ;时缓冲区
WEEK_BUFFER     EQU   50H ;星期缓冲区
DATE_BUFFER     EQU   54H ;日缓冲区
MONTH_BUFFER    EQU   55H ;月缓冲区
YEAR_BUFFER     EQU   56H ;年缓冲区
CENTURY_BUFFER  EQU   57H ;世纪缓冲区

LEDDBUF  EQU  30H
LEDTEMP  EQU  40H
;=======================================================

;-------------------------------------------------------
;主程序
  ORG   0
  AJMP  START
  ORG   0018H
START:
      MOV 53H,#00H   ;时
      MOV 52H,#00H   ;分
      MOV 51H,#00H   ;秒
      MOV 54H,#00H   ;日
      MOV 55H,#00H   ;月

  MOV    SP,#60H
  CALL   WRITETIME       ;调用时钟写
MLOOP:
  CALL   READTIME        ;调用时钟读
  LCALL  DISPLAY
  LCALL  DELAY
  call   TestKey         ;检测键盘
  jz     MLoop           ;有键按下
  call   GetKey          ;读键值
  JNB     Acc.0 ,JIA1     ;A为偶数键转加一处理
  DEC    A               ;A为奇数键作减一处理
  RR     A               ;A减一除二
  MOV    R0,#SECOND_BUFFER ;取时间缓冲区首址
  ADD    A,R0
  MOV    R0,A
  DEC    @R0       ;设置减一  1——秒-1   3——分-1  5——时-1
  SJMP   NEXT

JIA1:
  RR     A               ;A除二
  MOV    R0,#SECOND_BUFFER ;取时间缓冲区首址
  ADD    A,R0
  MOV    R0,A
  INC    @R0              ;设置加一  0——秒+1   2——分+1  4——时+1

NEXT:
  CALL   WRITETIME        ;调用时钟写

  AJMP   MLOOP
;========================================================
WRITETIME:
  PUSH  DPH           ;写时间
  PUSH  DPL
  PUSH  ACC
  MOV   DPTR,#REG_A   ;开启振荡器和允许计时
  MOV   A,#00100000B
  MOVX  @DPTR,A
  MOV   DPTR,#REG_B   ;设定SET=1,禁止更新资料
  MOV   A,#10000000B
  MOVX  @DPTR,A
  MOV   DPTR,#SECOND  ;设定秒
  MOV   A,SECOND_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#MINUTE  ;设定分
  MOV   A,MINUTE_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#HOUR    ;设定时
  MOV   A,HOUR_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#WEEK    ;设定星期
  MOV   A,WEEK_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#DATE    ;设定日
  MOV   A,DATE_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#MONTH   ;设定月
  MOV   A,MONTH_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#YEAR    ;设定年
  MOV   A,YEAR_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#CENTURY ;设定世纪
  MOV   A,CENTURY_BUFFER
  MOVX  @DPTR,A
  MOV   DPTR,#REG_B   ;设定SET=0,BCD模式,24小时制
  MOV   A,#00000010B
  MOVX  @DPTR,A
  POP   ACC
  POP   DPL
  POP   DPH
  RET
;========================================================
READTIME:              ;读时间
  PUSH  DPL
  PUSH  DPH
  PUSH  ACC
  MOV   DPTR,#REG_A    ;读取寄存器 A
RTCBUSY:
  MOVX  A,@DPTR
  JB    ACC.7,RTCBUSY ;测试UIP位,如果UIP=0;则执行以下程序
  MOV   DPTR,#SECOND  ;读取秒资料
  MOVX  A,@DPTR
  MOV   SECOND_BUFFER,A
  MOV   DPTR,#MINUTE  ;读取分数据
  MOVX  A,@DPTR
  MOV   MINUTE_BUFFER,A
  MOV   DPTR,#HOUR    ;读取时资料
  MOVX  A,@DPTR
  MOV   HOUR_BUFFER,A
  MOV   DPTR,#WEEK    ;读取星期资料
  MOVX  A,@DPTR
  MOV   WEEK_BUFFER,A
  MOV   DPTR,#DATE    ;读取日资料
  MOVX  A,@DPTR
  MOV   DATE_BUFFER,A
  MOV   DPTR,#MONTH   ;读取月资料
  MOVX  A,@DPTR
  MOV   MONTH_BUFFER,A
  MOV   DPTR,#YEAR    ;读取年资料
  MOVX  A,@DPTR
  MOV   YEAR_BUFFER,A
  MOV   DPTR,#CENTURY ;读取世纪资料
  MOVX  A,@DPTR
  MOV   CENTURY_BUFFER,A
  POP   ACC
  POP   DPH
  POP   DPL
  RET
;==========================================================
DISPLAY:                     ;10位LED串行静态显示
      LCALL TOLED
      MOV   R0,  #LEDDBUF
      MOV   R1,  #LEDTEMP
      MOV   R2,  #4          ;前8位
 DP10:MOV   DPTR,#SEGTAB1    ;小数点不亮
      MOV   A,   @R0
      MOVC  A,   @A+DPTR
      MOV   @R1, A
      INC   R0
      INC   R1
      MOV   DPTR,#SEGTAB2    ;小数点亮
      MOV   A,   @R0
      MOVC  A,   @A+DPTR
      MOV   @R1, A
      INC   R0
      INC   R1
      DJNZ  R2,  DP10
      MOV   R2,  #2           ;前2位
DP101:MOV   DPTR,#SEGTAB1     ;小数点不亮
      MOV   A,   @R0
      MOVC  A,   @A+DPTR
      MOV   @R1, A
      INC   R0
      INC   R1
      DJNZ  R2,  DP101
      MOV   R0,  #LEDTEMP
      MOV   R1,  #10
 DP12:MOV   R2,  #8
      MOV   A,   @R0
 DP13:RLC   A
      MOV   P3.0, C
      CLR   P3.1
      SETB  P3.1
      DJNZ  R2,  DP13
      INC   R0
      DJNZ  R1,  DP12

      RET

SEGTAB1: DB 3FH,06H,5BH,4FH,66H,6DH  ;小数点不亮的代码
         DB 7DH,07H,7FH,6FH,77H,7CH
         DB 39H,5EH,7BH,71H,00H,40H

SEGTAB2: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH  ;小数点亮的显示代码
         DB 0FDH,87H,0FFH,0EFH,0F7H,0FCH
         DB 0B9H,0DEH,0FBH,0F1H

ToLED:
       mov     a, MONTH_BUFFER   ;月
       mov     b, #16
       div     ab
       mov     LEDDBuf, a
       mov     LEDDBuf+1, B

       mov     a, DATE_BUFFER    ;日
       mov     b, #16
       div     ab
       mov     LEDDBuf+2, a
       mov     LEDDBuf+3, B

       mov     a, HOUR_BUFFER    ;时
       mov     b, #16
       div     ab
       mov     LEDDBuf+4, a
       mov     LEDDBuf+5, B

       mov     a, MINUTE_BUFFER  ;分
       mov     b, #16
       div     ab
       mov     LEDDBuf+6, a
       mov     LEDDBuf+7, B

       mov     a, SECOND_BUFFER ;秒
       mov     b, #16
       div     ab
       mov     LEDDBuf+8, a
       mov     LEDDBuf+9, B

       RET
;========================================================
DELAY: MOV   R4,#30            ;延时
AA1:   MOV   R5,#0FFH
AA:    NOP
       NOP
       DJNZ  R5,AA
       DJNZ  R4,AA1
       RET
;========================================================
;P1 键盘读入口
TestKey:                      ;检测键盘
        MOV   P1,  #0FH
        MOV   A,   P1         ; 读入键状态
        cpl   a
        anl   a, #0fh         ; 高四位不用
        ret

KeyTable:DB   0EEH,0DEH,0BEH,07EH
         DB   0EDH,0DDH,0BDH,07DH
         DB   0EBH,0DBH,0BBH,07BH
         DB   0E7H,0D7H,0B7H,077H      ; 键码定义


GetKey:                       ;读键值
      MOV   P1,  #0FH
      MOV   A,   P1
      CJNE  A,   #0FH, K12
      LJMP  MLOOP
K12:  MOV   B,A
      MOV   P1,  #0EFH ;
      MOV   A,   P1
      CJNE  A,   #0EFH,K13 ;
      MOV   P1,  #0DFH
      MOV   A,   P1
      CJNE  A,   #0DFH,K13 ;
      MOV   P1,  #0BFH
      MOV   A,   P1
      CJNE  A,   #0BFH,K13;
      MOV   P1,  #7FH
      MOV   A,   P1
      CJNE  A,   #7FH, K13;
      LJMP  MLOOP
K13:  ANL   A,   #0F0H;
      ORL   A,   B
      MOV   B,   A
      MOV   R1,  #16
      MOV   R2,  #0
      MOV   DPTR,#KEYTABLE
K14:  MOV       A,R2
      MOVC      A,@A+DPTR
      CJNE      A,B,K16
      MOV   P1,  #0FH;
K15:  MOV   A,   P1
      CJNE  A,   #0FH, K15;
      MOV       A,R2
      RET
K16:  INC       R2
      DJNZ      R1,K14
      LJMP      MLOOP

;========================================================
      END

⌨️ 快捷键说明

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