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 + -
显示快捷键?