📄 电子琴.asm
字号:
;********** 数码管的显示控制---固定数值显示123456**********
; 显示代码 0 =77 H; 1=41H; 2=3BH;3=5BH ; 4=4DH ;5=5EH ;6=7EH
; 如果显示代码不是上面的值,请先用实验6测试
ORG 0000H
AJMP START
ORG 000BH
AJMP T0_INT
START: MOV SP,#60H
MOV IE,#82H
MOV TH0,#0DBH
MOV TL0,#00H
SETB TR0
MAIN: MOV P0,#48H ; 显示1
MOV P2,#10001100B ; 送控制公共端的I/O线
MOV P3,#0FEH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0ADH ; 显示2
MOV P2,#01001100B ; 送控制公共端的I/O线
MOV P3,#0FDH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0CDH ; 显示3
MOV P2,#00100000B ; 送控制公共端的I/O线
MOV P3,#0FBH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#4BH ; 显示4
MOV P2,#00010000B ; 送控制公共端的I/O线
MOV P3,#0F7H
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0C7H ; 显示5
MOV P2,#00011100B ; 送控制公共端的I/O线
MOV P3,#0EFH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0E7H ; 显示6
MOV P2,#10001100B ; 送控制公共端的I/O线
MOV P3,#0DFH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#4CH ; 显示7
MOV P2,#01000000B ; 送控制公共端的I/O线
MOV P3,#0BFH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0EFH ; 显示8
MOV P2,#00100000B ; 送控制公共端的I/O线
MOV P3,#07FH
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#04FH ; 显示9
MOV P2,#00011100B ; 送控制公共端的I/O线
MOV R5,#1; 延时20MS
ACALl DELAY20MS
MOV P0,#0EEH ; 显示0
MOV P2,#10001100B ; 送控制公共端的I/O线
MOV R5,#1; 延时20MS
ACALl DELAY20MS
AJMP MAIN
T0_INT: PUSH PSW
SETB RS0
MOV TH0,#0DBH
MOV TL0,#00H
MOV P1,#0F0H ;检查有没有按键
MOV A,P1
CJNE A,#0F0H,SCAN_KEY
T0_RET: POP PSW
RETI
SCAN_KEY: MOV P1,#0FEH
MOV A,P1
CJNE A,#0EEH,SCAN_KEY1
MOV 30H,#1
SCAN_KEY1: CJNE A,#0DEH,SCAN_KEY2
MOV 30H,#2
SCAN_KEY2: CJNE A,#0BEH,SCAN_KEY3
MOV 30H,#3
SCAN_KEY3: CJNE A,#7EH,SCAN_KEY4
MOV 30H,#4
AJMP SCAN_KEY16
SCAN_KEY4: MOV P1,#0FDH
MOV A,P1
CJNE A,#0EDH,SCAN_KEY5
MOV 30H,#5
SCAN_KEY5: CJNE A,#0DDH,SCAN_KEY6
MOV 30H,#6
SCAN_KEY6: CJNE A,#0BDH,SCAN_KEY7
MOV 30H,#7
SCAN_KEY7: CJNE A,#07DH,SCAN_KEY8
MOV 30H,#8
AJMP SCAN_KEY16
SCAN_KEY8: MOV P1,#0FBH
MOV A,P1
CJNE A,#0EBH,SCAN_KEY9
MOV 30H,#9
SCAN_KEY9: CJNE A,#0DBH,SCAN_KEY10
MOV 30H,#10
SCAN_KEY10: CJNE A,#0BBH,SCAN_KEY11
MOV 30H,#11
SCAN_KEY11: CJNE A,#7BH,SCAN_KEY12
MOV 30H,#12
AJMP SCAN_KEY16
SCAN_KEY12: MOV P1,#0F7H
MOV A,P1
CJNE A,#0E7H,SCAN_KEY13
MOV 30H,#13
SCAN_KEY13: CJNE A,#0D7H,SCAN_KEY14
MOV 30H,#14
SCAN_KEY14: CJNE A,#0B7H,SCAN_KEY15
MOV 30H,#15
SCAN_KEY15: CJNE A,#77H,SCAN_KEY16
MOV 30H,#16
SCAN_KEY16: mov 31H,#70
ACALL AVOID ;调用键音作延时
AJMP T0_RET
AVOID: MOV R6,30H ; 0.25秒
SETB p2.1 ;喇叭控制脚高
TT11: MOV R7,#100
DJNZ R7,$ ; 延时250*2*1US=500US
DJNZ R6,TT11
CLR p2.1 ;喇叭控制脚低
MOV R6,30H
TT22: MOV R7,#100
DJNZ R7, $ ; 延时250*2*1US=500US
DJNZ R6,TT22 ;高500+低500=1000US
DJNZ 31H,AVOID
CLR p2.1 ;关喇叭
RET
;********** DLY20MS SUB_PROGRAM *************;
DELAY20MS: MOV R6,#210 ; R5 次
LOOP: MOV R7,#248 ;R5*R6=R5*40 次
loop1: DJNZ R7,loop1 ;R5*R6*R7 =R5*40*248=9920*R5次
DJNZ R6,LOOP ;R6*R5 =40*R5 次
DJNZ R5,DELAY20MS ;R5 =1 次
DEL_RET: RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -