📄 music.s
字号:
.module music.c
.area lit(rom, con, rel)
_music_data::
.word 440
.word 600
.word 494
.word 200
.word 523
.word 600
.word 443
.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 E:\ICCAVR-M16学习板\基础实验\模拟音乐\卡秋莎\music.c
.dbsym e music_data _music_data A[232:58:2]ki
.area data(ram, con, rel)
.dbfile E:\ICCAVR-M16学习板\基础实验\模拟音乐\卡秋莎\music.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR-M16学习板\基础实验\模拟音乐\卡秋莎\music.c
.dbfunc e delay_ms _delay_ms fV
; a -> R20
; i -> R16,R17
.even
_delay_ms::
xcall push_gset1
.dbline -1
.dbline 46
; /*****************************************
; * 用M16单片机I/O口生成模拟音乐 *
; * 功 能:用I/O口生成模拟音乐 *
; * 时钟频率:内部1M *
; * 设 计:tonghe *
; * 修改日期:2007年04月13日 *
; * 编译环境:ICC-AVR6.31 *
; * 实验环境:本站M16学习板 *
; * 发 声:无源蜂鸣器 *
; * 结 果:试验通过 *
; * 要 求:插上JP1、JP2、LED_EN短路块 *
; *****************************************/
; #include <iom16v.h>
; #include <macros.h>
;
; #define uchar unsigned char
; #define uint unsigned int
;
; /****************************************
; * 定义音乐数据二维数组{x,y} *
; * x:对应音符音阶(频率),0表示休止符 *
; * y:对应音符节拍,0表示音乐结束 *
; * 此数据取自《ICC AVR应用实例》 *
; ****************************************/
; //以下音乐数据为《卡秋莎》,位于程序区
; flash uint music_data[][2]=
; {
; {440,600},{494,200},{523,600},{443,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 //设置回到数据存储器区
;
; /************************************
; * 延时函数:1M时钟时为MS *
; ************************************/
; void delay_ms(uint i)
; {
.dbline 48
; uchar a;
; for(;i;i--)
xjmp L5
L2:
.dbline 49
; {
.dbline 50
; for (a = 220; a; a--)
ldi R20,220
xjmp L9
L6:
.dbline 51
.dbline 52
.dbline 53
L7:
.dbline 50
dec R20
L9:
.dbline 50
tst R20
brne L6
.dbline 54
L3:
.dbline 48
subi R16,1
sbci R17,0
L5:
.dbline 48
cpi R16,0
cpc R16,R17
brne L2
X0:
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r i 16 i
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 61
; {
; ;
; }
; }
; }
;
; /************************************
; * 端口初始化函数 *
; ************************************/
; void port_init(void)
; {
.dbline 62
; DDRD=0xff; //D口配置为输出,驱动蜂鸣器
ldi R24,255
out 0x11,R24
.dbline 63
; DDRB=0xff; //B口配置为输出,驱动LED
out 0x17,R24
.dbline 64
; PORTB=0xff; //LED初值为灭
out 0x18,R24
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e sound _sound fV
; x -> R10,R11
; i -> R10
.even
_sound::
xcall push_gset3
mov R10,R16
.dbline -1
.dbline 74
; }
;
; /***********************************
; * 音乐产生函数 *
; * 功能:输出频率为x的方波,延时y MS*
; * 范围:x:100-20000Hz,0:不发声 *
; * y:0-65536 MS *
; ***********************************/
; void sound(uchar i)
; {
.dbline 76
; uint x;
; x=music_data[i][0]; //取音乐的频率数据
ldi R24,4
mul R24,R10
movw R30,R0
ldi R24,<_music_data
ldi R25,>_music_data
add R30,R24
adc R31,R25
lpm R10,Z+
lpm R11,Z
.dbline 77
; if(x!=0)
tst R10
brne X1
tst R11
breq L12
X1:
.dbline 78
; {
.dbline 79
; x=500000/x; //1M时钟数据计算
movw R2,R10
clr R4
clr R5
ldi R20,32
ldi R21,161
ldi R22,7
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall div32s
movw R10,R16
.dbline 80
; OCR1A=x; //比较值赋值
out 0x2b,R17
out 0x2a,R16
.dbline 81
; TCCR1A = 0x40; //允许比较反转输出
ldi R24,64
out 0x2f,R24
.dbline 82
; }
xjmp L13
L12:
.dbline 84
.dbline 85
clr R2
out 0x2f,R2
.dbline 86
L13:
.dbline -2
L11:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r x 10 i
.dbsym r i 10 c
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 92
; else
; {
; TCCR1A = 0x00; //频率为0,休止符,不发声
; }
; }
; /*******************************
; * 主函数 *
; *******************************/
; void main(void)
; {
.dbline 93
; uchar i=0;
clr R20
.dbline 94
; port_init(); //端口初始化
xcall _port_init
.dbline 95
; TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反
ldi R24,64
out 0x2f,R24
.dbline 96
; TCCR1B = 0x09;
ldi R24,9
out 0x2e,R24
xjmp L16
X2:
.dbline 98
; while(1)
; {
L18:
.dbline 100
.dbline 101
mov R16,R20
xcall _sound
.dbline 102
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 R16,Z+
lpm R17,Z
xcall _delay_ms
.dbline 103
clr R2
out 0x2f,R2
.dbline 104
ldi R24,32
in R2,0x18
eor R2,R24
out 0x18,R2
.dbline 105
sbi 0x12,5
.dbline 106
inc R20
.dbline 107
L19:
.dbline 99
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 L18
X3:
.dbline 108
ldi R16,1000
ldi R17,3
xcall _delay_ms
.dbline 109
clr R20
.dbline 110
L16:
.dbline 97
xjmp L19
X4:
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -