📄 蜂鸣器之兰花草.asm
字号:
;蜂鸣器之兰花草
;P1.0接蜂鸣器
SPK EQU P1.0 ;蜂鸣器所在端口
ORG 0000H
JMP START
START:MOV R3,#00H ;R3清零
NEXT:MOV A,R3 ;A清零,R3为表的偏移量
MOV DPTR,#TABLE ;取歌曲表的首地址
MOVC A,@A+DPTR ;查表
JZ START ;A=0时,跳转至START
MOV R7,A ;A的内容给R7,R7存放低地址数据
INC R3 ;R3加1
MOV A,R3
MOVC A,@A+DPTR
MOV R2,A ;R2存放高地址数据
ACALL SONG ;调用歌曲播放子程序
INC R3
SJMP NEXT
;=== 歌曲播放子程序 ===
SONG:MOV A,R2 ;取出节拍
RL A ;左移
JNZ KEEP ;A不为0时,跳转至KEEP
MOV A,#01H
KEEP:MOV R2,A
REPEAT:ACALL EIGHTH
DJNZ R2,REPEAT
RET
;=== 产生1/8拍延时子程序 ===
EIGHTH:MOV A,R7 ;查表取出廷时参数,保存到R4
MOV DPTR,#DELAY_T
MOVC A,@A+DPTR
MOV R4,A
MOV A,R7 ;查表取出1/8拍周期数,保存到R5
MOV DPTR,#S_PARA
MOVC A,@A+DPTR
MOV R5,A
NEXTCYC:ACALL SOUND
DJNZ R5,NEXTCYC
RET
;=== 发声子程序 ===
SOUND:SETB SPK
ACALL SDELAY
CLR SPK
ACALL SDELAY
RET
;=== 延时子程序 ===
SDELAY:MOV A,R4 ;延时值在R4内
MOV R0,A
XL2:MOV R1,#03H
DL1:NOP
DJNZ R1,DL1
DJNZ R0,XL2
RET
;=== 1/8拍周期表 ===
S_PARA:DS 1DH ;定义1DH个程序存储器空间
DB 15H,16H,00
DB 19H,00H,1CH,00H,1FH,21H,00H,25H
DB 00H,29H,2CH,00H,31H,34H,37H,00H
DB 3EH,41H,00H,49H,00H,52H,57H,00H
DB 62H
;=== 延时参数表 ===
DELAY_T:DS 1DH ;定义1DH个程序存储器空间
DB 7EH,77H,00H
DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
DB 1AH
;=== 歌曲表 ===
TABLE:DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来
DW 2502H,2702H,2502H,2402H,2208H ;带着兰花草
DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;种在小园中
DW 2902H,2C02H,2D02H,2A02H,2908H ;祈祷花开早
DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回
DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过
DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然
DW 2702H,2502H,2402H,2002H,2208H ;苞也无一个
DW 0000H ;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -