📄 音乐.s
字号:
.module _音乐.c
.area text(rom, con, rel)
.dbfile 音乐.c
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 32
; /*******************************************************************
; 实验名称:音乐合成演示实验
; 作者:王晓波
; 晶振:内部 8M
; 接线方法:
; 1.PC0和PD7分别接扬声器的两个输入端子。
; 2.PA0-PA3分别接I/O输出的O0-O3。
; 使用说明:
; 1.音乐数据存放于芯片的flash存贮器中。
; 2.PA口显示不同的音阶变化。
; 3.音乐数据的低四位选择音调频率,
; 高四位*5后,为音调持续时间。
; ********************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; #define DO 63622 //523
; #define RE 63831 //587
; #define MI 64017 //659
; #define FA 64102 //698
; #define SO 64259 //784
; #define LA 64398 //880
; #define TI 64522 //988
; #define DO_H 64578 //1046
; #define RE_H 64683 //1174
; #define MI_H 64776 //1318
; #define FA_H 64819 //1397
; #define SO_H 64897 //1568
; #define LA_H 64966 //1760
; #define TI_H 65028 //1976
; #define DO_HH 65057 //2093
; void delay_us(int time)
; {//微秒级延时程序
L2:
.dbline 34
; do
; {
.dbline 35
; time--;
subi R16,1
sbci R17,0
.dbline 36
; }
L3:
.dbline 37
; while (time>1);
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 40
; }
; void delay_ms(unsigned int time)
; {//毫秒级延时程序
xjmp L7
L6:
.dbline 42
.dbline 43
ldi R16,1000
ldi R17,3
xcall _delay_us
.dbline 44
subi R20,1
sbci R21,0
.dbline 45
L7:
.dbline 41
; while (time!=0)
cpi R20,0
cpc R20,R21
brne L6
X0:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.area lit(rom, con, rel)
_sound::
.byte 64,'L
.byte 'J,'I
.byte 200,'I
.byte 'G,'F
.byte 229,'N
.byte 'M,'N
.byte 'l,45
.byte 'N,'M
.byte 44,45
.byte 46,45
.byte 'o,45
.byte 44,45
.byte 44,41
.byte 42,43
.byte 42,41
.byte 200,'L
.byte 'N,'I
.byte 'F,'H
.byte 197,38
.byte 40,229
.byte 131,'e
.byte 38,'h
.byte 41,38
.byte 40,'E
.byte 'l,47
.byte 61,28
.byte 42,44
.byte 233,'i
.byte 42,'G
.byte 'F,'e
.byte 38,'H
.byte 'I,'C
.byte 'H,54
.byte 21,38
.byte 24,229
.byte 'j,44
.byte 'G,'I
.byte 38,40
.byte 133,51
.byte 21,'C
.byte 37,38
.byte 39,41
.byte 198,37
.byte 38,'h
.byte 41,'L
.byte 'J,'I
.byte 42,41
.byte 'I,38
.byte 37,131
.byte 136,38
.byte 40,38
.byte 37,35
.byte 37,38
.byte 40,197
.byte 4,4
.byte 'I,'J
.byte 'J,'j
.byte 41,'H
.byte 'F,'h
.byte 41,200
.byte 'I,'J
.byte 'J,'j
.byte 44,'J
.byte 'J,'I
.byte 'J,202
.byte 'L,'M
.byte 'M,'m
.byte 44,'J
.byte 'J,'L
.byte 'M,204
.byte 'I,'J
.byte 'J,'i
.byte 42,'J
.byte 'I,'J
.byte 'F,24
.byte 230,41
.byte 41,41
.byte 40,'F
.byte 41,41
.byte 41,40
.byte 'F,'I
.byte 'J,'H
.byte 'i,42
.byte 'L,45
.byte 45,45
.byte 44,'J
.byte 41,41
.byte 41,40
.byte 'F,'F
.byte 'E,'F
.byte 230,0
.dbsym e sound _sound A[182:182]kc
_TONETABLE::
.word 63622
.word 63831
.word 64017
.word 64102
.word 64259
.word 64398
.word 64522
.word 64578
.word 64683
.word 64776
.word 64819
.word 64897
.word 64966
.word 65028
.word 65057
.dbsym e TONETABLE _TONETABLE A[30:15]ki
.area vector(rom, abs)
.org 32
jmp _timer1_ovf_isr
.area lit(rom, con, rel)
.area text(rom, con, rel)
.dbfile 音乐.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R2
st -y,R3
st -y,R24
in R2,0x3f
st -y,R2
.dbline -1
.dbline 84
; {
; delay_us(1000);
; time--;
; }
; }
; const unsigned char sound[]={ //乐曲数据表
; /*************梁祝****************/
; 0x40,0x4c,0x4a,0x49,0xc8,0x49,0x47,0x46,
; 0xe5,0x4e,0x4d,0x4e,0x6c,0x2d,0x4e,
; 0x4d,0x2c,0x2d,0x2e,0x2d,0x6f,0x2d,
; 0x2c,0x2d,0x2c,0x29,0x2a,0x2b,
; 0x2a,0x29,0xc8,0x4c,0x4e,0x49,0x46,0x48,
; 0xc5,0x26,0x28,0xe5,0x83,0x65,0x26,
; 0x68,0x29,0x26,0x28,0x45,0x6c,0x2f,0x3d,
; 0x1c,0x2a,0x2c,0xe9,0x69,0x2a,0x47,0x46,
; 0x65,0x26,0x48,0x49,0x43,0x48,0x36,0x15,
; 0x26,0x18,0xe5,0x6a,0x2c,0x47,0x49,0x26,
; 0x28,0x85,0x33,0x15,0x43,0x25,0x26,0x27,
; 0x29,0xc6,0x25,0x26,0x68,0x29,0x4c,0x4a,
; 0x49,0x2a,0x29,0x49,0x26,0x25,0x83,0x88,
; 0x26,0x28,0x26,0x25,0x23,0x25,0x26,0x28,
; 0xc5,0x04,0x04,
; /*************希望*****************/
; 0x49,0x4a,0x4a,0x6a,0x29,0x48,0x46,0x68,
; 0x29,0xc8,0x49,0x4a,0x4a,0x6a,0x2c,0x4a,
; 0x4a,0x49,0x4a,0xca,0x4c,0x4d,0x4d,0x6d,
; 0x2c,0x4a,0x4a,0x4c,0x4d,0xcc,0x49,0x4a,
; 0x4a,0x69,0x2a,0x4a,0x49,0x4a,0x46,
; 0x18,0xe6,0x29,0x29,0x29,0x28,0x46,
; 0x29,0x29,0x29,0x28,0x46,0x49,0x4a,
; 0x48,0x69,0x2a,0x4c,0x2d,0x2d,0x2d,
; 0x2c,0x4a,0x29,0x29,0x29,0x28,0x46,
; 0x46,0x45,0x46,0xe6,
; 0x00};
; /* 音阶表 */
; const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
; RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
;
; /* 音阶重装常数 */
; unsigned int toneconst;
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
.dbline 85
; TCNT1=toneconst;
lds R2,_toneconst
lds R3,_toneconst+1
out 0x2d,R3
out 0x2c,R2
.dbline 86
; PORTC^=1;
ldi R24,1
in R2,0x15
eor R2,R24
out 0x15,R2
.dbline -2
L9:
ld R2,y+
out 0x3f,R2
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e music _music fV
; sound_add -> R20,R21
; temp1 -> R22
; temp -> R10
.even
_music::
xcall push_gset3
.dbline -1
.dbline 89
; }
; void music(void)
; {
.dbline 90
; unsigned char temp=0,temp1=0;
clr R10
.dbline 90
clr R22
.dbline 91
; unsigned int sound_add=0;
clr R20
clr R21
.dbline 92
; TCCR1A = 0x00;
clr R2
out 0x2f,R2
.dbline 93
; TCCR1B =(1<<CS11);//8分频
ldi R24,2
out 0x2e,R24
.dbline 94
; temp1=sound[sound_add];
ldi R24,<_sound
ldi R25,>_sound
movw R30,R20
add R30,R24
adc R31,R25
lpm R22,Z
xjmp L12
L11:
.dbline 97
;
; while(temp1!=0)
; {
.dbline 98
; temp=temp1;
mov R10,R22
.dbline 99
; temp&=0x0f;
mov R24,R10
andi R24,15
mov R10,R24
.dbline 100
; if(temp!=0)
tst R24
breq L14
.dbline 101
; {
.dbline 102
; TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
in R24,0x39
ori R24,4
out 0x39,R24
.dbline 103
; temp--;
dec R10
.dbline 104
; toneconst=TONETABLE[temp];
ldi R24,2
mul R24,R10
movw R30,R0
ldi R24,<_TONETABLE
ldi R25,>_TONETABLE
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
sts _toneconst+1,R31
sts _toneconst,R30
.dbline 105
; TCNT1=toneconst;
out 0x2d,R31
out 0x2c,R30
.dbline 106
; PORTA=toneconst;
out 0x1b,R30
.dbline 107
; }
L14:
.dbline 108
mov R10,R22
.dbline 109
mov R24,R10
swap R24
andi R24,#0x0F
.dbline 110
andi R24,15
mov R10,R24
.dbline 111
ldi R24,129
mul R24,R10
movw R16,R0
xcall _delay_ms
.dbline 112
in R24,0x39
andi R24,251
out 0x39,R24
.dbline 113
subi R20,255 ; offset = 1
sbci R21,255
.dbline 114
ldi R24,<_sound
ldi R25,>_sound
movw R30,R20
add R30,R24
adc R31,R25
lpm R22,Z
.dbline 116
L12:
.dbline 96
tst R22
brne L11
.dbline 117
; temp=temp1;
; temp>>=4;
; temp&=0x0f;
; delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
; TIMSK&=~(1<<TOIE1);
; sound_add++;
; temp1=sound[sound_add];
;
; }
; PORTC = 0xFF;
ldi R24,255
out 0x15,R24
.dbline -2
L10:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r sound_add 20 i
.dbsym r temp1 22 c
.dbsym r temp 10 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 121
; }
; /* 主程序 */
; void main(void)
; {
.dbline 123
;
; DDRC=0x01;
ldi R24,1
out 0x14,R24
.dbline 124
; DDRD=0x80;
ldi R24,128
out 0x11,R24
.dbline 125
; DDRA=0x0f;
ldi R24,15
out 0x1a,R24
.dbline 126
; SREG=0x80;
ldi R24,128
out 0x3f,R24
xjmp L18
L17:
.dbline 128
.dbline 129
xcall _music
.dbline 130
L18:
.dbline 127
xjmp L17
X1:
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile 音乐.c
_toneconst::
.blkb 2
.dbsym e toneconst _toneconst i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -