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

📄 succ.asm

📁 采用定时器中断的方法
💻 ASM
字号:
         ORG      0000H
         LJMP     MAIN
         ORG      000BH
         AJMP     IT0P
         ORG      0100H
MAIN:    MOV      TMOD,#01H           ;T0为方式一
         MOV      20H,#0AH            ;装入中断次数
         MOV      49H,#00H            ;存放整点的数
         CLR      P1.7
         lcall    chushi              ;调用初始化子程序
         SETB     ET0
         SETB     EA
         MOV      TH0,#3CH            ;T0装入计数初值
         MOV      TL0,#0B0H
         SETB     TR0
HERE:    LCALL    DISPLAY             ;调用显示子程序
         SJMP     HERE
IT0P:    PUSH     PSW
         PUSH     Acc
         mov      r5,#0ffh
         lcall    KEYI                ;调用键盘子程序
         cjne     r5,#0ffh,keyinput   ;有键输入
         Ljmp      nokey              ;无键输入跳
keyinput:cjne     r5,#0fh,nokey       ;对有键输入并且是最右下角的进行处理不是则转移
         clr     TR0                  ;关中断
         lcall    chushi              ;调用初始化程序,使40H-42H全为0,便于用户输入
         lcall    DISPLAY             ;显示
         lcall    DL1S                
         mov      r5,#0ffh
shu0:    lcall    KEYI                ;输入小时的高位
         cjne     r5,#0ffh,ok0
         lcall    DISPLAY
         jmp      shu0
ok0:     mov      43h,r5
         lcall    DISPLAY
         lcall    DL1S
         mov      r5,#0ffh
shu1:    lcall    KEYI                ;输入小时的低位
         cjne     r5,#0ffh,ok1
         lcall    DISPLAY
         jmp      shu1
ok1:     mov      44h,r5
         lcall    DISPLAY
         lcall    DL1S
         mov      r5,#0ffh
shu2:    lcall    KEYI                ;输入分的高位
         cjne     r5,#0ffh,ok2
         lcall    DISPLAY
         jmp      shu2
ok2:     mov      45h,r5
         lcall    DISPLAY
          jmp     goon
nokey:   jmp      nokey1
goon:    lcall    DL1S
         mov      r5,#0ffh
shu3:    lcall    KEYI                ;输入分的低位
         cjne     r5,#0ffh,ok3
         lcall    DISPLAY
         jmp      shu3
ok3:     mov      46h,a
         lcall    DISPLAY
         lcall    DL1S
         mov      r5,#0ffh
shu4:    lcall    KEYI                ;输入秒的高位
         cjne     r5,#0ffh,ok4
         lcall    DISPLAY
         jmp      shu4
ok4:     mov      47h,r5
         lcall    DISPLAY
          lcall    DL1S
         mov      r5,#0ffh
shu5:    lcall    KEYI                ;输入秒的低位
         cjne     r5,#0ffh,ok5
         lcall    DISPLAY
         jmp      shu5
ok5:     mov      48h,a
         lcall    DISPLAY
         mov      a,43h               ;对输入的转化存到40H,41H,43H里
         lcall    youyi
         mov      r4,44h
         orl      a,r4
         mov      40h,a
         mov      a,45h
         lcall    youyi
         mov      r4,46h
         orl      a,r4
         mov      41h,a
         mov      a,47h
         lcall    youyi
         mov      r4,48h
         orl      a,r4
         mov      42h,a
         SETB     TR0
         lcall    DISPLAY
nokey1:  DJNZ     20H,RETURN          ;1S未到
         MOV      A,49H               ;是否还需要响
         CJNE     A,#00H,XIANG        ;需要
         JMP      BUXIANG             ;不需要
XIANG:   LCALL    SOUND               ;调用响子程序
         DEC      A
         MOV      49H,A
BUXIANG: MOV      TH0,#3CH
         MOV      TL0,#0B0H
         MOV      20H,#0AH            ;重置
         MOV      A,#01H              ;秒加一
         ADD      A,42H
         DA       A                   ;秒的十进置调整
         MOV      42H,A
         CJNE     A,#60h,RETURN       ;判断是否到60秒
         MOV      42H,#00H            ;到了清零
         MOV      A,#01H
         ADD      A,41H
         DA       A
         MOV      41H,A
         CJNE     A,#60h,RETURN        ;判断是否到60分
         MOV      41H,#00H             ;到了清零
         MOV      A,#01H
         ADD      A,40H
         DA       A                    ;转换成10进制
         MOV      40H,A
         mov      a,#0f0h
         anl      a,40h
         lcall    youyi
         mov      43h,a
         mov      a,#0fh
         anl      a,40h
         mov      44h,a
         MOV      A,44H                ;转换成8421BCD
         MOV      R0,43H
         CJNE     R0,#01H,COUNT10 
         ADD      A,#10
         AJMP     OUT
COUNT10: JC       OUT
         ADD      A,#20
OUT:     MOV      49H,A                ;将整点数存入49H
         MOV      A,40H
         CJNE     A,#24h,RETURN        ;判断是否到24小时
         MOV      40H,#00H
RETURN:  lcall    shijin               ;转换
         POP      Acc
         POP      PSW
         RETI
DISPLAY: MOV    DPTR,#7f00H             ;显示程序
         MOV    A,#03H                  ;8155初始化
         MOVX   @DPTR,A
test:    MOV    R0,#43H                 ;置缓冲器指针初值
         MOV    R3,#20H
         MOV    A,R3
LD0:     MOV    DPTR,#7f01H
         MOVX   @DPTR,A
         INC    DPTR
         MOV    A,@R0
         ADD    A,#0DH
         MOVC   A,@A+PC
DIR1:    MOVX   @DPTR,A                 ;段码送至8155的PB口
         ACALL  DL1ms
         INC    R0
         MOV    A,R3
         JB     ACC.0,LD1
         Rr     A                       ;位选码右移一位
         MOV    R3,A
         AJMP   LD0
LD1:     RET
DSEG1:   DB 3FH,06H,5BH,4FH,66H,6DH
         DB 7DH,07H,7FH,6FH,77H,7CH
         DB 39H,5EH,79H,71H,73H,3EH
         DB 31H,6EH,1CH,23H,40H,03H
         DB 18H,00
DL1ms:   MOV      R7,#02H              ;延时1ms子程序
DL:      MOV      R6,#0FFH
DL6:     DJNZ     R6,DL6
         DJNZ     R7,DL
         RET
DL1S:    mov      r5,#02fh
DL61:    LCALL    DL1ms
         LCALL    DISPLAY
         DJNZ     r5,DL61
         RET
shijin:  mov      a,#0f0h    ;将时钟的数据转换成可显示的存于43H后6
         anl      a,40h
         lcall    youyi
         mov      43h,a
         mov      a,#0fh
         anl      a,40h
         mov      44h,a
         mov      a,#0f0h
         anl      a,41h
         lcall    youyi
         mov      45h,a
         mov      a,#0fh
         anl      a,41h
         mov      46h,a
         mov      a,#0f0h
         anl      a,42h
         lcall    youyi
         mov      47h,a
         mov      a,#0fh
         anl      a,42h
         mov      48h,a
         ret
youyi:   rr       a              ;A右移四位
         rr       a
         rr       a
         rr       a
         ret
SOUND:   MOV      R0,#6FH
LLL:     mov      r1,#20h
         SETB     P1.7
L1:      DJNZ     R0,L1
L2:      INC      R0
         CJNE     R0,#0FH,L2
         DJNZ     R1,L1
         CLR      P1.7
         RET
KEYI:    LCALL    KS1          ;键盘程序
         JZ       KEYEND       ;没有按下
LK1:     LCALL    DL1MS
         LCALL    DISPLAY
         LCALL    DL1MS
         LCALL    DISPLAY
         LCALL    KS1
         JZ       KEYEND       ;是抖动引起的
LK2:     MOV      R2,#0FEH     ;列选到R2
         MOV      R4,#00H      ;R4为列号计数器
LK4:     MOV      DPTR,#07f01H
         MOV      A,R2
         MOVX     @DPTR,A
         INC      DPTR
         INC      DPTR
         MOVX     A,@DPTR        ;读8155的C口
         JB       Acc.0,LONE     ;第0线为高,无键闭合,跳转判第一行
         MOV      A,#00H         ;第0行有键闭合,0到A
         AJMP     LKP            ;跳LKP,计算键号
LONE:    JB       Acc.1,LTW0
         MOV      A,#08H         ;1行有键闭合,8到A
         AJMP     LKP
LTW0:    JB       Acc.2,LTHR
         MOV      A,#10H         ;1行有键闭合,10到A
         AJMP     LKP
LTHR:    JB       Acc.3,NEXT
         MOV      A,#18H         ;1行有键闭合,18到A
         AJMP     LKP
NEXT:    INC      R4
         MOV      A,R2
         JNB      Acc.7,KEYEND
         RL       A
         MOV      R2,A
         AJMP     LK4
LKP:     ADD      A,R4            ;计算键号,即:行首键号+列号=键号
         PUSH     Acc            ;键号进栈保护
         MOV      DPTR,#KEYTAB
         POP      ACC
         MOVC     A,@A+DPTR       ;得到键值
         mov      r5,a
KEYEND:  RET
KEYTAB:  DB       00H,01H,02H,03H,04H,05H,0AH,0AH
         DB       06H,07H,08H,09H,0AH,0AH,0AH,0AH
         DB       0AH,0AH,0AH,0AH,0AH,0AH,0AH,0AH
         DB       0AH,0AH,0AH,0AH,0AH,0FH,0AH,0AH
KS1:     MOV      DPTR,#07f01H       ;判断有无键按下
         MOV      A,#00H             ;列线全为底电平
         MOVX     @DPTR,A
         INC      DPTR
         INC      DPTR
         MOVX     A,@DPTR            ;从PC口读取行线状态
         CPL      A                  ;行线状态取反,若无键按下则A中内容为零
         ANL      A,#0FH
         RET
chushi:  mov      A,#00H
         DA       A
         MOV      40H,A
         MOV	  41H,A
         MOV	  42H,A
         lcall    shijin              ;将时,分,秒转化成可显示的
         ret
end

⌨️ 快捷键说明

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