music.s
来自「单片机开发资料光盘-双龙-686M.zip」· S 代码 · 共 493 行
S
493 行
.module music.c
.area vector(rom, abs)
.org 36
jmp _timer0
.org 24
jmp _timer1
.area lit(rom, con, rel)
_music_data::
.word 440
.word 600
.word 494
.word 200
.word 523
.word 600
.word 440
.word 200
.word 523
.word 400
.word 494
.word 200
.word 440
.word 200
.word 494
.word 400
.word 330
.word 400
.word 494
.word 600
.word 523
.word 200
.word 578
.word 600
.word 494
.word 200
.word 578
.word 400
.word 523
.word 200
.word 494
.word 200
.word 440
.word 800
.word 659
.word 400
.word 880
.word 400
.word 784
.word 400
.word 880
.word 200
.word 784
.word 200
.word 698
.word 400
.word 659
.word 200
.word 578
.word 200
.word 659
.word 400
.word 440
.word 400
.word 0
.word 200
.word 698
.word 400
.word 578
.word 200
.word 659
.word 600
.word 523
.word 200
.word 494
.word 200
.word 330
.word 200
.word 523
.word 200
.word 494
.word 200
.word 440
.word 800
.word 659
.word 400
.word 880
.word 400
.word 784
.word 400
.word 880
.word 200
.word 784
.word 200
.word 698
.word 400
.word 659
.word 200
.word 578
.word 200
.word 659
.word 400
.word 440
.word 400
.word 0
.word 200
.word 698
.word 400
.word 578
.word 200
.word 659
.word 600
.word 523
.word 200
.word 494
.word 200
.word 330
.word 200
.word 523
.word 200
.word 494
.word 200
.word 440
.word 800
.word 0
.word 0
.dbfile F:\李鹏飞\sl-avrad-m16\music\music.c
.dbsym e music_data _music_data A[232:58:2]ki
.area data(ram, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\music\music.c
_delay::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\music\music.c
.dbsym e delay _delay i
.area text(rom, con, rel)
.dbfile F:\李鹏飞\sl-avrad-m16\music\music.c
.dbfunc e music_init _music_init fV
.even
_music_init::
.dbline -1
.dbline 42
; /**********************************************
; http://www.sl.com.cn
; 双龙电子公司----电脑音乐演示程序(ICCAVR)
; 作者:詹卫前
; 1、学习定时器T0溢出中断的使用
; 2、学习定时器T1比较中断的使用
; 3、学习电脑音乐的产生
; **********************************************/
; #include <iom16v.h>
; #include <macros.h>
; #pragma interrupt_handler timer0:10
; #pragma interrupt_handler timer1:7
; const unsigned int music_data[][2]=
; /*******************************************
; 卡秋莎音乐数据{x,y}
; x:对应音符音阶(频率),0表示休止符
; y:对应音符节拍
; ********************************************/
; {
; {440,600} ,{494,200} ,{523,600} ,{440,200},
; {523,400} ,{494,200} ,{440,200} ,{494,400},
; {330,400} ,{494,600} ,{523,200} ,{578,600},
; {494,200} ,{578,400} ,{523,200} ,{494,200},
; {440,800} ,{659,400} ,{880,400} ,{784,400},
; {880,200} ,{784,200} ,{698,400} ,{659,200},
; {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
; {698,400} ,{578,200} ,{659,600} ,{523,200},
; {494,200} ,{330,200} ,{523,200} ,{494,200},
; {440,800} ,{659,400} ,{880,400} ,{784,400},
; {880,200} ,{784,200} ,{698,400} ,{659,200},
; {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
; {698,400} ,{578,200}, {659,600} ,{523,200},
; {494,200} ,{330,200}, {523,200} ,{494,200},
; {440,800} ,
; {0,0}};
; #pragma data:data
; unsigned int delay=0;
; /*******************************
; MCU初始化
; *******************************/
; void music_init(void)
; {
.dbline 43
; MCUCR=0x00;
clr R2
out 0x35,R2
.dbline 44
; DDRC=0x01;
ldi R24,1
out 0x14,R24
.dbline 45
; TCCR1A=0x00;
out 0x2f,R2
.dbline 46
; TCCR1B=0x09;
ldi R24,9
out 0x2e,R24
.dbline 47
; TCCR0=0x03;
ldi R24,3
out 0x33,R24
.dbline 48
; TCNT0=0x19;
ldi R24,25
out 0x32,R24
.dbline 49
; TIMSK=(1<<OCIE1A)|(1<<TOIE0);
ldi R24,17
out 0x39,R24
.dbline -2
.dbline 50
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0 _timer0 fV
.even
_timer0::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 55
; /**************************************************
; T0中断程序,产生音乐节拍
; **************************************************/
; void timer0(void)
; {
.dbline 56
; delay++;
lds R24,_delay
lds R25,_delay+1
adiw R24,1
sts _delay+1,R25
sts _delay,R24
.dbline 57
; TCNT0=0x19;
ldi R24,25
out 0x32,R24
.dbline -2
.dbline 58
; }
L2:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e timer1 _timer1 fV
.even
_timer1::
st -y,R2
st -y,R24
in R2,0x3f
st -y,R2
.dbline -1
.dbline 63
; /**************************************************
; T1中断程序,根据SOUND函数输出一定频率的方波
; **************************************************/
; void timer1(void)
; {
.dbline 64
; PORTC^=0x01;
ldi R24,1
in R2,0x15
eor R2,R24
out 0x15,R2
.dbline -2
.dbline 65
; }
L3:
ld R2,y+
out 0x3f,R2
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e sound _sound fV
; y -> R10,R11
; x -> R12,R13
.even
_sound::
xcall push_gset4
movw R10,R18
movw R12,R16
.dbline -1
.dbline 72
; /*****************************************************
; SOUND程序,输出频率为 x HZ的方波,延时 y MS
; x:100~20000 HZ, 0表示不发声
; y:0~65536 MS
; *****************************************************/
; void sound(unsigned int x,unsigned int y)
; {
.dbline 73
; SEI();
sei
.dbline 74
; delay=0;
clr R2
clr R3
sts _delay+1,R3
sts _delay,R2
.dbline 75
; if (x!=0)
tst R12
brne X0
tst R13
breq L5
X0:
.dbline 76
; {
.dbline 77
; x=4000000/x;
movw R2,R12
clr R4
clr R5
ldi R20,0
ldi R21,9
ldi R22,61
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall div32s
movw R12,R16
.dbline 78
; OCR1A=x;
out 0x2b,R17
out 0x2a,R16
.dbline 79
; TCNT1=0x00;
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 80
; TIMSK|=(1<<OCIE1A);
in R24,0x39
ori R24,16
out 0x39,R24
L7:
.dbline 82
L8:
.dbline 81
; while(delay<y)
lds R2,_delay
lds R3,_delay+1
cp R2,R10
cpc R3,R11
brlo L7
.dbline 83
; ;
; TIMSK&=~(1<<OCIE1A);
in R24,0x39
andi R24,239
out 0x39,R24
.dbline 84
; }
xjmp L6
L5:
.dbline 86
; else
; {
.dbline 87
; TIMSK&=~(1<<OCIE1A);
in R24,0x39
andi R24,239
out 0x39,R24
L10:
.dbline 89
L11:
.dbline 88
; while(delay<y)
lds R2,_delay
lds R3,_delay+1
cp R2,R10
cpc R3,R11
brlo L10
.dbline 90
; ;
; }
L6:
.dbline 91
; CLI();
cli
.dbline -2
.dbline 93
;
; }
L4:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r y 10 i
.dbsym r x 12 i
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 98
; /*******************************
; 主程序
; *******************************/
; void main(void)
; {
.dbline 99
; unsigned char i=0;
clr R20
.dbline 100
; music_init();
xcall _music_init
xjmp L15
X1:
.dbline 102
; while(1)
; {
L17:
.dbline 104
.dbline 105
ldi R24,4
mul R24,R20
movw R2,R0
ldi R24,<_music_data+2
ldi R25,>_music_data+2
movw R30,R2
add R30,R24
adc R31,R25
lpm R18,Z+
lpm R19,Z
ldi R24,<_music_data
ldi R25,>_music_data
movw R30,R2
add R30,R24
adc R31,R25
lpm R16,Z+
lpm R17,Z
xcall _sound
.dbline 106
inc R20
.dbline 107
L18:
.dbline 103
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_music_data+2
ldi R25,>_music_data+2
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
cpi R30,0
cpc R30,R31
brne L17
X2:
.dbline 108
clr R20
.dbline 109
L15:
.dbline 101
xjmp L18
X3:
.dbline -2
.dbline 110
; while(music_data[i][1]!=0)
; {
; sound(music_data[i][0],music_data[i][1]);
; i++;
; }
; i=0;
; }
; }
L13:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?