📄 niao.asm
字号:
ORG 0000H
SJMP MAIN
MAIN: MOV P1,#01H
MOV A,#01H
NEXT: MOV P1,A ;循环显示
MOV R3,#0
LOOP: MOV R4,#0
NOP
NOP
DJNZ R4,$
DJNZ R3,LOOP
ACALL DAY
MOV R5,A ;检查有无键入
DO: SETB C
MOV R0,#0
MOV P0,#0FFH
MOV A,P0
ROR: RRC A
JNC OUT
INC R0
CJNE R0,#06,ROR
MOV A,R5
RL A
SJMP NEXT
OUT: MOV A,#01H ;显示字符
MOV P1,A
MOV A,R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
MOV A,R5
MUSIC: SPK EQU P1.0 ; 蜂鸣器所在端口
START:
MOV R3,#00H
NEXT1:
MOV A,R3
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;把表中内容的地址给A
JZ START ;A=0则跳转
MOV R7,A
INC R3 ;偏移量加一
MOV A,R3 ;后半字节地址
MOVC A,@A+DPTR
MOV R2,A ;R7,R2中分别存有半个字
ACALL SONG ;播放该音节
INC R3 ;偏移量加一
CJNE R3,#50,GOO
SJMP MAIN
GOO: SJMP NEXT1
;===============================================================================
;=== 歌曲播放子程序 ===
SONG:
MOV A,R2 ; 取出节拍
RL A
JNZ KEEP ;A不等于零跳转
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
DL11:
NOP
DJNZ R1,DL11
DJNZ R0,XL2
RET
;===============================================================================
;=== 1/8拍周期表 ===
S_PARA: ;拍子
DS 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
DB 7EH,77H,00H
DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
DB 00H,3FH,3BH,38H,35H,32H,2FH,00H
DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
DB 1AH
;===============================================================================
;=== 歌曲表 ===
TABLE: DW 2704H,2702H,2904H,2704H,2C04H,2B01H
DW 2704H,2702H,2904H,2704H,2E04H,2C06H
DW 2704H,2702H,3104H,2E04H,2C04H,2A04H,2904H
DW 3004H,3002H,2E04H,2A04H,2C04H,2A04H
RETI
DAY: MOV R2,#0F0H
DL2: MOV R3,#0F0H
DL1: NOP
NOP
DJNZ R3,DL1
DJNZ R2,DL2
RET
TAB:DB 06H,5BH,4FH,66H,6DH,7DH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -