📄 乐曲.asm
字号:
;************* 应用笔记 乐曲.asm ************************
;*
;* 标题:AT90S8515 C口输出乐曲声
;* 版本: 1.0
;*最后更新日期: 2000.08.08
;*
;* 支援 E-mail: gzsl@sl.com.cn
;*
;* 描述
;* 用SL-AVR 万用下载开发实验器做样机,在C口接喇叭发出乐曲声
;* 请把你喜爰的乐曲送入单片机!
;* 作者: SL.
;* 程序适用于所有单片机,乐曲产生原理、方法请阅<< AVR单片机的乐曲输入方法>>
;* AVR单片机在儿童智能玩具中的应用--音乐玩具(电脑放音机)一文
;*
;***************************************************************************
.include"8515def.inc"
rjmp RESET ;
.def TEMPDH =r2
.def TEMPDL =r3
.def CNT =r10
.def SCNN =r11
.def KEYN =r12
.def SCNK =r13
.def SCNDP =r14
.def KSNI =r15
.def TEMP =r16
.def TEMP1 =r17
.def TEMP2 =r18
.def TEMP3 =r19
.def SCNTT =r26 ;
.def MUSN =r22
.def TONL =r21
.def TONH =r20
.def PLYTON =r25
.def TONSET =r24
.def TONLNG =r23
.cseg
.org 0x06 ;timerl
intt1: RJMP OUTPM ;
.cseg
.org 0x010 ;
;
OUTPM: OUT TCNT1H,TONH ;
OUT TCNT1L,TONL ;
SBIS PORTC,00 ;
RJMP SETOP1 ;
SETOP0: CBI PORTC,00 ;
LDI MUSN,$00 ;
RETI ;
SETOP1: SBI PORTC,00 ;
LDI MUSN,$01 ;
RETI ;
.cseg
.org 0x020 ;
RESET:
ldi temp,low(RAMEND) ;
out SPL,temp ;
;
ldi temp,high(RAMEND) ;
out SPL+1,temp ;
wdr ;
ldi temp,$0F ;
out WDTCR,temp ;
LDI MUSN,$00 ;
ldi temp,$00 ;
OUT TCCR1A,TEMP ;
OUT TCCR1B,TEMP ;
LDI TEMP,$02 ;
STS $0100,TEMP ;
LEDA: CLI ;
ldi r16,0b10000000 ;
out timsk,r16 ;
LDI TEMP,$FF ;
OUT DDRA,TEMP ;
OUT DDRB,TEMP
OUT DDRC,TEMP ;PC OUT,
; OUT DDRD,TEMP ;
LDI TEMP,0B11111111 ;
OUT PORTC,TEMP
OUT PORTA,TEMP
OUT PORTB,TEMP
OUT PORTD,TEMP
CLR TEMP2 ;
CLR TEMP1 ;
CLR KSNI
LDI SCNTT,$02
CLR TONLNG
STARTP: WDR ;
LDI ZH,HIGH(PLYTAB*2) ;
LDI ZL,LOW(PLYTAB*2) ;
NEXMUT: LPM
MOV PLYTON,R0 ;
LD R0,Z+ ;
LPM ;
MOV TONLNG,R0 ;
OR R0,PLYTON
LD R0,Z+
BRNE PLAYM
LDI TEMP,$00 ;
OUT TCCR1B,TEMP ;
CLI ;
SBI PORTD,00
RJMP STARTP ;
;
PLAYM: PUSH ZH ;
PUSH ZL ;
TST PLYTON ;
BREQ MUSTD ;
LDI ZH,HIGH(MUSTAB*2) ;
LDI ZL,LOW(MUSTAB*2) ;
MOV TEMP,PLYTON ;
DEC TEMP ;
LSL TEMP ;
ADD ZL,TEMP ;
LDI TEMP,$00 ;
ADC ZH,TEMP ;
LPM ;
MOV TONL,R0 ;
OUT TCNT1L,R0 ;
LD R0,Z+ ;
LPM
MOV TONH,R0
OUT TCNT1H,R0 ;
POP ZL ;
POP ZH
LDS TEMP,$0100 ;
OUT TCCR1B,TEMP ;
SEI
MUSTD: RCALL PLYDEL ;
DEC TONLNG ;
BRNE MUSTD ;
RJMP NEXMUT ;
;
PLYDEL: LDI TEMP,185 ;
DT3: LDI TEMP1,03 ;
DT2: LDI TEMP2,250
DT1: WDR ;1T
WDR ;2T
WDR ;3T
WDR ;4T
WDR ;5T
DEC TEMP2 ;
BRNE DT1 ;
DEC TEMP1 ;
BRNE DT2 ;
DEC TEMP ;
BRNE DT3 ;
RET ;
;约定:因为计算机不能表示简谱乐曲,低音为数字后一点表示,
; 高音为数字前一点表示,
; 半音为#号,'为隔开音符,
;乐曲节拍应对照简谱查看,音长为节拍,
;一拍为04,3/4拍为03,1/2(2/4)拍为02,1/4拍为01,
;00为表示休止符,
;#为升半度音
; 乐曲低八度音
; 曲码代号 1 2 3 4 5 6 7 8 9 10 11 12
; 音符代号 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
;******************************************************************
; 乐曲中音
; 曲码代号 13 14 15 16 17 18 19 20 21 22 23 24
; 音符代号 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
;
;******************************************************************
;; 乐曲高八度音
; 曲码代号 25 26 27 28 29 30 31 32 33 34 35 36
; 音符代号 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
;
;******************************************************************
;
.EQU PLYTAB=0X0100
.EQU MUSTAB=0X00A0
.cseg
.org PLYTAB ;"祝你生日快乐" 乐曲 1=C 4/4 乐曲存放起始地址,请查看对照简谱乐曲
;
;| 5 5, 6 5|
.DB 20,02,00,01,20,01,22,04,20,04
;| .1 7 -|
.DB 25,04,24,04,00,04
;| 5 5, 6 5|
.DB 20,02,00,01,20,01,22,04,20,04
;| .2 .1 -|
.DB 27,04,25,04,00,04
;| 5 5, .5 .3|
.DB 20,02,00,01,20,01,32,04,29,04
;| .1 7 6|
.DB 25,04,24,04,22,04
;| .4 .4 .3 .1|
.DB 30,02,00,01,30,01,29,04,25,04
;| .2 .1 - |
.DB 27,04,25,04,00,04
;REAGAIN
;| 5 5, 6 5|
.DB 20,02,00,01,20,01,22,04,20,04
;|.1 7 - |
.DB 25,04,24,04,00,04
;| 5 5, 6 5|
.DB 20,02,00,01,20,01,22,04,20,04
;| .2 .1 - |
.DB 27,04,25,04,00,04
;| 5 5, .5 .3|
.DB 20,02,00,01,20,01,32,04,29,04
;| .1 7 6|
.DB 25,04,24,04,22,04
;| .4 .4 .3 .1|
.DB 30,02,00,01,30,01,29,04,25,04
;| .2 .1 - |
.DB 27,04,25,04,00,04
; 万水千山总是情
.db 17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04 ;
.db 13,06,17,02,15,04,13,04,10,12,10,04,8,8,13,04 ;
.db 15,04,17,04,20,04,22,04,17,04,15,15,15,04,00,04 ;
.db 17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04 ;
.db 13,06,17,02,15,04,13,04,10,12,10,04,8,8,13,06 ;
.db 17,02,15,06,13,02,13,04,10,04,13,15,13,8,17,04 ;
.db 20,04,22,12,25,10,22,04,18,04,20,06,22,02,20,12 ;
.db 17,04,20,8,17,04,20,04,22,12,25,04,25,04,22,04 ;
; .db 20,04,17,04,15,15,15,08,17,04,18,04,20,06,20,02 ;
.db 22,04,20,04,17,12,15,04,13,06,17,02,15,04,13,04 ;
; .db 10,12,10,04,08,08,13,04,17,04,15,06,13,02,10,04
.db 12,04,13,15,13,15 ;
.DB 00,00 ;END
.cseg
.org MUSTAB ;
;约定:低音为数字后一点表示,高音为数字前一点表示,
; 半音为#号,'为隔开音符
;1 2 3 4 5 6 7 8 9
;1. '#1. '2. '#2. '3. '4. '#4. '5. '#5.
;10 11 12 13 14 15 16 17 18
;6. '#6. '7. '1 '#1 '2 '#2 '3 '4
.DW 63627,63730,63835,63927
.DW 64020,64102,64185,64259
.DW 64330,64399,64463,64523
.DW 64579,64632,64683,64731
.DW 64776,64819
;19 20 21 22 23 24 25 26 27
;#4 '5 '#5 '6 '#6 '7 '.1 '#.1 '.2
; 28 29 30 31 32 33 34 35 36
;'#.2 '.3 '.4 '#.4 '.5 '#.5 '.6 '#.6 '.7
.DW 64859,64897
.DW 64933,64967,64999,65029
.DW 65057,65084,65109,65133
.DW 65156,65177,65197,65216
.DW 65243,65251,65267,65282
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -