📄 zhonghe.asm
字号:
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 + -