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

📄 zhonghe.asm

📁 Proteus实例集锦(包括电路图.仿真程序,各种各样的电路
💻 ASM
📖 第 1 页 / 共 2 页
字号:
    MOV   L3,#00H
    SETB  LED4
    MOV   DSPLYP,#L0       ; 指针指向显存
    SETB  LPLMOD           ; 设定显示方式不闪烁
    SETB  HPLMOD
    MOV   A,R4             ; 移入工作模式选择数
    RL    A                ;
    MOV   DPTR,#A_TAB
    JMP   @A+DPTR          ; 根据工作模式选择数跳转
A_TAB:  AJMP  ACTF1            ; 工作模式一
    AJMP  ACTF1            ; 工作模式二
    AJMP  ACTF3            ; 工作模式三
    AJMP  ACTF3            ; 工作模式四
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
ACTF1:  SETB  SWITCH           ; 工作模式一(或二): 开继电器
 LJMP AAA
    BBB: MOV   R_MOD,#82H       ; 响铃模式参数#82H
    MOV   R2,#96H          ; 响铃次数参数#96H
ACTF11: ACALL RING           ; 调用响铃子程序
    JNB   MKEY,ENDACT      ; 等待键按下
    JNB   FKEY,ENDACT      ; 有键按下则结束响铃
    DJNZ  R2, ACTF11       ; 次数未满继续响铃
    MOV   R_MOD,#0FFH      ; 参数#0FF使响铃无效
    AJMP  ACTF11           ; 无键按下返回
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
ACTF3:  CLR   SWITCH           ; 工作模式三(或四): 开继电器
    CLR   BELL             ; 蜂鸣器短鸣一声
    ACALL DL1S
    SETB  BELL
    MOV   R_MOD,#0FFH      ; 响铃模式参数#0FFH
    MOV   R2,#96H          ; 响铃时间参数#96H
ACTF31: ACALL RING        ; 调用响铃子程序
    JNB   MKEY,ENDACT      ; 等待键按下
    JNB   FKEY,ENDACT      ; 有键按下则结束
    DJNZ  R2,ACTF31        ; 次数未满继续
    MOV   R2,#96H          ; 重新赋值
    CLR   BELL             ; 短鸣一声(说明: 响铃模式参数#0FFH使
    ACALL DL100            ; 响铃程序无效,仅起延时作用,
    SETB  BELL             ; 每延时一段时间短鸣一声,以
    AJMP  ACTF31           ; 提醒使用者继电器仍在工作)
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
ENDACT: SETB  SWITCH           ; 关继电器
AWAITF: ACALL DISPLY           ; 调用显示
        JNB   FKEY,AWAITF      ; 等待键释放
AWAITM: ACALL DISPLY           ; 调用显示
    JNB   MKEY,AWAITM      ; 等待键释放
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;
;**************
;   响铃程序  ;
;**************
RING:   MOV   R5,#18H          ; R5为循环控制变量
RING1:  JNB   MKEY,R_EXIT      ; 键扫描
    JNB   FKEY,R_EXIT      ; 有键按下则退出
    MOV   A,R_MOD          ; 移入响铃模式参数
    MOV   C,ACC.7          ; 根据响铃模式参数改变响铃
    MOV   BELL,C
    RL    A
    MOV   R_MOD,A
    ACALL DL100            ; 延时
    DJNZ  R5,RING1         ; 循环次数控制
R_EXIT: SETB  BELL             ; 关闭响铃
    RET
    NOP
    NOP
    LJMP ERR               ; 软件陷阱
;
;**************
;   显示程序  ;
;**************
DISPLY: PUSH  ACC              ; 数据压栈保护
    PUSH  PSW
    MOV   PSW,#10H         ; 选用寄存器组2
    MOV   R0,DSPLYP        ; 移入显示指针
    MOV   R2,#0FDH         ; R2寄存的是数码管选通数
    MOV   A,PLYTS          ; 移入显示循环控制量
    JNZ   PLAY             ; 不为0则转PLAY
    MOV   PLYTS,#64H       ; 否则从新赋值
    CPL   BRIGHT           ; 亮灭指示位取反
PLAY:   DEC   PLYTS            ; 显示循环控制量减1
    JNB   LPLMOD,PLAYL     ; 低两位数码管不闪则"PLAYL"
    JB    BRIGHT,PLAYL     ; 亮灭指示为1也"PLAYL"
    ACALL NOPLAY           ; 否则灭灯延时
    AJMP  PLAY1            ; 转显示高位数码管
    NOP
    NOP
    LJMP ERR               ; 软件陷阱
;用来显示低位
PLAYL:  ORL   P1,#7FH          ; 清原显示数据
    ORL   P3,#3CH          ; 清原选通数据
    MOV   A,R2             ; 移入数码管位选数
    RL    A                ; 换一位
    ANL   P3,A             ; 选通低位的个位数码管
    MOV   R2,A             ; 暂存位选数
    MOV   A,@R0            ; 移入显示数值
    MOV   DPTR,#TABLE1     ; 移入表首地址
    MOVC  A,@A+DPTR        ; 查表
    ANL   P1,A             ; 送显示数据
    ACALL DL1MS            ; 延时
    INC   R0               ; 指向低位的十位数
    JB    P3.3,PLAYL       ; 显示低位的十位数
;
PLAY1:  JNB   HPLMOD,PLAYH     ; 高两位数码管不闪则"PLAYH"
    JB    BRIGHT,PLAYH     ; 亮灭指示为1也"PLAYH"
    ACALL NOPLAY           ; 否则灭灯延时
    AJMP  OUTPLY           ; 转结束
    NOP
    NOP
    LJMP ERR               ; 软件陷阱
;
;用来显示高位
PLAYH:  ORL   P1,#7FH          ; 清原显示数据
    ORL   P3,#3CH          ; 清原选通数据
    ANL   P3,#0EFH         ; 选通高位的个位数数码管
    MOV   A,@R0            ; 移入显示数值
    MOV   DPTR,#TABLE1     ; 移入表首地址
    MOVC  A,@A+DPTR        ; 查表
    ANL   P1,A             ; 送显示数据
    ACALL DL1MS            ; 延时
    INC   R0               ; 指向高位的十位数
    ;                      ; 显示高位的十位数
    ORL   P1,#7FH          ; 清原显示数据
    ORL   P3,#3CH          ; 清原选通数据
    ANL   P3,#0DFH         ; 选通高位的十位数
    MOV   A,@R0            ; 移入显示数值
    MOV   C,LED4          ; 指针放大+小灯状态
    RLC   A                ;
    MOV   DPTR,#TABLE2     ; 移入表首地址
    MOVC  A,@A+DPTR        ; 查表
    ANL   P1,A             ; 送显示数据
    ACALL DL1MS            ; 延时
;
OUTPLY: POP   PSW              ; 恢复数据
    POP   ACC
    RET
    NOP
    NOP
    LJMP ERR               ; 软件陷阱
;
TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
;           "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
;    "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
;
;
;
;**********************
;    无显示(灭灯)程序   ;
;**********************
NOPLAY: ORL   P1,#7FH          ; 清显示数据
    ORL   P3,#3CH          ; 清选通数据
    INC   R0               ; 指针自增2
    INC   R0
    ACALL DL1MS            ; 延时
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;
;******************
;     延时程序    ;
;******************
DL1MS:  MOV   R3,#0F9H         ; 延时 1250US  只为DISPLY所调用
DL1MS1: NOP
    NOP
    NOP
    DJNZ  R3,DL1MS1
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;
KEYDLY: CLR   BELL        ; 按键消抖动专用延时程序,
    ACALL DISPLY           ; 在消除抖动的同时发出按键提示音
    SETB  BELL
    RET
    NOP
    NOP
    LJMP ERR               ; 软件陷阱
;
DL50MS: MOV   R7,#0AH          ; 50毫秒延时程序
DL50M1: ACALL DISPLY         ; 每调用一次显示程序5MS
    DJNZ  R7,DL50M1        ; 调用10次
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
;
DL100:  ACALL DL50MS           ; 延时100毫秒
    ACALL DL50MS
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
;
DL05S:  ACALL DL100            ; 延时0.5秒
    ACALL DL100
    ACALL DL100
    ACALL DL100
    ACALL DL100
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;
DL1S:   ACALL DL05S            ; 延时1秒
    ACALL DL05S
    RET
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;
;****************************
;     ERR(出错处理) 程序    ;
;****************************
ERR:    CLR   EA               ; 关中断
    MOV   DPTR,#ERR1       ; 准备返回地址
    PUSH  DPL              ; 压栈
    PUSH  DPH              ;
    RETI                   ; 中断返回
ERR1:   MOV   56H,#0AAH        ; 建立上电标志(出错标志)
    MOV   57H,#55H
    MOV   A,#00H           ; 准备返回地址
    PUSH  ACC              ; 压栈
    PUSH  ACC
    RETI                   ; 中断返回
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
;
    ORG   07FAH
    NOP
    NOP
    NOP
    LJMP  ERR              ; 软件陷阱
    ;AAA:JNB P0.6,CCC
    ;CCC:LJMP YINYUE

                          ;LJMP DIANZIQIN
                  DIANZIQIN:;MOV P0,#00H
                         ;clr p3.6
                        ;setb P0.1
                         SETB EA
                         SETB ET1                       ;计数器0
                         MOV TMOD,#20H
                         MOV TH1,#09CH
                         MOV TL1,#09CH                 ;定时器初植
                         CLR TR1                        ;定时器不允许
                  SCAN:                                 ;键盘扫描
                         MOV A,P2                   ;判断键盘按下,跳到SCAN_1,若未按,继续扫描
                         CJNE A,#0FFH,SCAN_1
                         NOP

                         SJMP SCAN
                  SCAN_1:
                         ACALL DELAY ;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下?
                         MOV A,P2
                         CJNE A,#0FFH,SU_KEY
                         NOP
                         SJMP SCAN
                  SU_KEY:JNB P0.6,LOOP11
                         ;SJMP LOOP2
                   ;LOOP11:LJMP AAA
                         JNB P2.1,MU_1                  ;判断是哪个键按下?
                         JNB P2.2,MU_2
                         JNB P2.3,MU_3
                         JNB P2.4,MU_4
                         JNB P2.5,MU_5
                         JNB P2.6,MU_6
                         JNB P2.7,MU_7
                         SJMP SCAN
                  LOOP11:LJMP AAA
                                                           ;R1信号周期
                  MU_1:  MOV R1,#19                ;如果第一个按键按下,则R1=19,同时程序转NEXT
                         SJMP NEXT
                  MU_2:  MOV R1,#17
                         SJMP NEXT
                  MU_3:  MOV R1,#15
                         SJMP NEXT
                  MU_4:  MOV R1,#14
                         SJMP NEXT
                  MU_5:  MOV R1,#13
                         SJMP NEXT
                  MU_6:  MOV R1,#11
                         SJMP NEXT
                  MU_7:  MOV R1,#10
                         SJMP NEXT
                  NEXT:  MOV A,R1
                         MOV R0,A
                         SETB TR1                      ;启动定时器0

                  NEXT_1:MOV A,P2                     ; 没键按下继续执行,有键按下,返回读引脚
                         CJNE A,#0FFH,NEXT_1
                         ACALL DELAY
                         MOV A,P2                       ;真的没键按下?
                         CJNE A,#0FFH,NEXT_1
                         CLR TR1                        ;不响
                         AJMP SCAN                     ;扫描键盘去
                  INT_1:                                 ;中断程序
                        DJNZ R0,RE                      ;R0不等于0时,返回
                        CPL P0.0
                        MOV A,R1
                        MOV R0,A
                  RE:   RETI
                  DELAY:MOV R7,#100                    ;延长时间等待,键盘消抖
                  D1:   MOV R6,#10
                  D2:   DJNZ R6,D2
                        DJNZ R7,D1
                        ;LJMP BBB
                        RET


     AAA:
     SETB P3.6
 ;CLR P0.6
MOV SP,#50H
MOV TH1,#0D8H
MOV TL1,#0EFH
MOV TMOD,#10H
MOV IE,#88H
 LJMP TIAO
MUSIC0:;JB P0.6,QIN


;LJMP BBB
TIAO:
NOP
MOV DPTR,#DAT ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MOV B,#00H ;表序号清0
MUSIC1:
 ;JnB P0.1,duan
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
 duan:ljmp BBB
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR1 ;启动计数
MUSIC2:

 ;clr P3.6
NOP
CPL P0.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
 ;JB P0.6,QIN
;jb p0.6,QIN
;jnb p0.4,ting
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
  ;JB P0.6,QIN
; INC B
LJMP MUSIC1
;ting:ljmp BBB
;QIN:CLR TR1
 ;QIN:LJMP DIANZIQIN
;DIANZIQIN
MUSIC3:
NOP
CLR TR1 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END

⌨️ 快捷键说明

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