📄 dianziqing3.asm
字号:
RS BIT P3.5
RW BIT P3.4
E BIT P3.3
BF BIT 07H
COUNTER EQU 26H
COUNTER2 EQU 22H
COUNTER3 EQU 23H
ADDRESS EQU 24H
NUM EQU 25H
/*--------------------------*/
ORG 0000H
AJMP START
ORG 000BH
AJMP TIMI
ORG 001BH
AJMP TIM2
ORG 0003H
AJMP DUAN
ORG 0100H
START:CLR TR0
CLR TR1
SETB EX0
MOV SP,#60H
MOV 30H,#00H
MOV R0,#30H
MAIN:LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING5:
MOV ADDRESS,#80H
MOV DPTR,#HANG6
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
MOV R7,#01H
LCALL WRI
PING3:
MOV ADDRESS,#80H
MOV DPTR,#HANG3
MOV NUM,#7
LCALL DISP
MOV ADDRESS,#90H
MOV DPTR,#HANG5
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
KEY: MOV R5,#2
D2:MOV R4,#200
D3:MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R5,D2
MOV R7,#0FFH
LCALL WRI
MOV R7,#00H ;开始扫描键盘
MOV A,#0FH
MOV P2,A
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,KEYIN ;A不等于0FH则有键按下
AJMP KEY
KEYIN:MOV R3,#10 ;延时10ms防抖
Y1:MOV R4,#248
DJNZ R4,$
DJNZ R3,Y1
MOV A,#0EFH ;扫描按下的键值
MOV R1,A
MOV P2,A
MOV A,P2
D0:MOV R2,#4
SETB C ;将进位置1
D1:RRC A
JNC YOU ;c等于0则说明是该键值
INC R7 ;否则R7加1
DJNZ R2,D1
MOV A,R1
RLC A
JNC KEY
MOV R1,A
MOV P2,A
MOV A,P2
AJMP D0
YOU:MOV A,#0FH
MOV P2,A
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,YOU
MOV A,R7 ;将键值送给A
SUBB A,#12 ;当A等于0CH时,转SONG1
CJNE A,#00H,ZHUAN0
AJMP START1
H1:AJMP SONG1
ZHUAN0:MOV A,R7
SUBB A,#13 ;当A等于0DH时,转SONG2
CJNE A,#00H,ZHUAN1
AJMP START2
H2:AJMP SONG2
ZHUAN1:MOV A,R7
SUBB A,#14 ;当A等于0EH时,停止键入音符
CJNE A,#00H,ZHUAN2
CLR TR0
AJMP HUICHE
ZHUAN2:MOV A,R7
SUBB A,#15 ;当A等于0FH时,回放键入的音乐
CJNE A,#00H,ZHUAN3
CLR TR0
LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING4:
MOV ADDRESS,#80H
MOV DPTR,#HANG4
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
lJMP AGAIN
ZHUAN3:MOV A,R7
INC A
MOV @R0,A ;将键值存入内存
INC R0
DEC A
FAYIN:MOV TMOD,#01H ;设置定时器工作状态,两个都是16位定时状态
SETB ET0 ;开定时器0中断
SETB EA ;开中断
MOV DPTR,#TABLE1 ;查表获得音频节拍编码
RL A
MOVC A,@A+DPTR
MOV TH0,A
MOV 21H,A
MOV A,R7
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 28H,A
SETB TR0 ;启动定时器
MOV R5,#2
N2:MOV R4,#200
N3:MOV R3,#248
DJNZ R3,$
DJNZ R4,N3
DJNZ R5,N2
CLR TR0
AJMP KEY
TIMI: PUSH ACC
PUSH PSW
MOV TH0,21H
MOV TL0,28H
CPL P0.0
POP PSW
POP ACC
RETI
HUICHE:MOV A,#00H
MOV @R0,A
AJMP KEY
AGAIN:MOV R0,#30H ;将存储内存地址送R0
XUN:MOV A,@R0 ;取内存中存储的音频
CJNE A,#00H,GONG
AJMP MAIN
GONG:
MOV TMOD,#10H ;设置定时器工作状态,两个都是16位定时状态
SETB ET1 ;开定时器0中断
SETB EA ;开中断
MOV DPTR,#TABLE1 ;查表获得音频节拍编码
RL A
MOVC A,@A+DPTR
MOV TH1,A
MOV 21H,A
MOV A,@R0
RL A
INC A
MOVC A,@A+DPTR
MOV TL1,A
MOV 28H,A
SETB TR1
MOV R5,#5
M2:MOV R4,#09FH
M3:MOV R3,#0FFH
DJNZ R3,$
DJNZ R4,M3
DJNZ R5,M2
INC R0
CLR TR1
AJMP XUN
TIM2: PUSH ACC
PUSH PSW
MOV TH1,21H
MOV TL1,28H
CPL P0.0
POP PSW
POP ACC
RETI
START1:
CLR ET0
CLR ET1
CLR EA ;初始化液晶
LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING1:
MOV ADDRESS,#80H
MOV DPTR,#HANG1
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
AJMP H1
/*--------------------------*/
START2:
CLR ET0
CLR ET1
CLR EA
LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING2:
MOV ADDRESS,#80H
MOV DPTR,#HANG2
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
AJMP H2
/*--------------------------*/
/*--写指令 RS=0 RW=0 R7存指令--*/
WRI:
LCALL CXBF
CLR RS
CLR RS
CLR RW
CLR RW
MOV P1,R7
SETB E
SETB E
CLR E
CLR E
RET
/*--写数据 RS=1 RW=0 A存数据--*/
WRD:
LCALL CXBF
SETB RS
SETB RS
CLR RW
CLR RW
MOV P1,A
SETB E
SETB E
CLR E
CLR E
RET
/*-----查询BF RS=0 RW=1-------*/
CXBF:
CLR RS
CLR RS
SETB RW
SETB RW
SETB E
SETB E
LCALL DELAY
CXBF1:
MOV 20H,P1
JB BF,CXBF1
CLR E
CLR E
RET
/*----------显示程序----------*/
DISP:
MOV R7,ADDRESS
LCALL WRI
CLR A
MOVC A,@A+DPTR
LCALL WRD
INC DPTR
CLR A
MOVC A,@A+DPTR
LCALL WRD
INC DPTR
INC ADDRESS
DJNZ NUM,DISP
RET
/*----------延时程序----------*/
/*-------------563us----------*/
DELAY:
MOV COUNTER,#10H
DELAY01:
MOV COUNTER2,#10H
DJNZ COUNTER2,$
DJNZ COUNTER,DELAY01
RET
/*-------------0.52s---------*/
DELAY1:
MOV COUNTER3,#4
DELAY12:
MOV COUNTER,#00H
DELAY11:
MOV COUNTER2,#00H
DJNZ COUNTER2,$
DJNZ COUNTER,DELAY11
DJNZ COUNTER3,DELAY12
RET
SONG1: MOV TMOD,#01H
SETB ET0 ;允许中断
SETB EA
MAIN1: MOV 60H,#00H
NEXT1: MOV DPTR,#TABLE2
MOV A,60H
MOVC A,@A+DPTR
MOV R1,A
JZ STOP1
ANL A,#0FH ;取A低4位,表示节拍
MOV R6,A ;控制节拍数存R6
MOV A,R1
SWAP A
ANL A,#0FH ;交换再取地位,控制音调
JNZ SING1 ;不为休止符转SING
CLR TR0 ;清中断
AJMP DT1
SING1:
DEC A
MOV 22H,A
RL A ;乘2
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;查表
MOV TH0,A
MOV 21H,A
MOV A,22H
RL A
INC A ;加3
MOVC A,@A+DPTR ;再查表
MOV TL0,A
MOV 28H,A
SETB TR0
DT1: LCALL DELAY3
INC 60H
AJMP NEXT1
DELAY3: MOV R5,#2
L2: MOV R4,#100
L3: MOV R3,#248
DJNZ R3,$
DJNZ R4,L3
DJNZ R5,L2
DJNZ R6, DELAY3
RET
SONG2: MOV TMOD,#01H
SETB ET0 ;允许中断
SETB EA
MAIN2: MOV 60H,#00H
NEXT2: MOV DPTR,#TABLE3
MOV A,60H
MOVC A,@A+DPTR
MOV R1,A
JZ STOP1
ANL A,#0FH ;取A低4位,表示节拍
MOV R6,A ;控制节拍数存R6
MOV A,R1
SWAP A
ANL A,#0FH ;交换再取地位,控制音调
JNZ SING2 ;不为休止符转SING
CLR TR0 ;清中断
AJMP DT2
SING2:
DEC A
MOV 22H,A
RL A ;乘2
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;查表
MOV TH0,A
MOV 21H,A
MOV A,22H
RL A
INC A ;加3
MOVC A,@A+DPTR ;再查表
MOV TL0,A
MOV 28H,A
SETB TR0
DT2: LCALL DELAY3
INC 60H
AJMP NEXT2
STOP1: CLR TR0
CLR ET0
CLR ET1
CLR EA
LCALL DELAY1
MOV R7,#01H
LCALL WRI
AJMP MAIN
DUAN:MOV A,#00H
RETI
TABLE1: DW 64260,64400,64524,64580 ;音频
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
/*----------数据区-----------*/
/*两只老虎*/
HANG1:
DB 020H,020H,020H,020H
DB 0C1H,0BDH,0D6H,0BBH
DB 0C0H,0CFH,0BBH,0A2H
DB 020H,020H
/*----------数据区-----------*/
/*弯弯的月亮*/
HANG2:
DB 020H,020H,0CDH,0E4H
DB 0CDH,0E4H,0B5H,0C4H
DB 0D4H,0C2H,0C1H,0C1H
DB 020H,020H
HANG3: ;郭慧敏
DB 020H,020H,0D7H,0F7H
DB 0D5H,0DFH,020H,03AH
DB 0B9H,0F9H,0BBH,0DBH
DB 0C3H,0F4H
HANG4: ;回放
DB 020H,020H,020H,020H
DB 020H,020H,0BBH,0D8H
DB 0B7H,0C5H,020H,020H
DB 020H,020H
HANG5: ;老师:赵俊慧
DB 020H,020H,0C0H,0CFH
DB 0CAH,0A6H,03AH,020H
DB 0D5H,0D4H,0BFH,0A1H
DB 0BBH,0DBH
HANG6:
DB 020H,020H,0B1H,0B1H
DB 0BEH,0A9H,0BDH,0BBH
DB 0CDH,0A8H,0B4H,0F3H
DB 0D1H,0A7H
TABLE2: DB 44H,54H,64H,44H ;两只老虎
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 54H,14H,48H
DB 54H,14H,48H
DB 00H
TABLE3: DB 62H,82H,82H,62H,98H ;弯弯的月亮
DB 92H,0B2H,0B2H,82H,98H
DB 62H,82H,82H,52H,68H
DB 92H,0B2H,0B2H,82H,92H,92H,94H
DB 92H,0B2H,0B2H,92H,84H,94H
DB 0B8H,0B4H,04H
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -