📄 music.lst
字号:
__start:
__text_start:
00BA EFCF LDI R28,0xFF
00BB E1D0 LDI R29,0x10
00BC BFCD OUT 0x3D,R28
00BD BFDE OUT 0x3E,R29
00BE 51CE SUBI R28,0x1E
00BF 40D0 SBCI R29,0
00C0 EA0A LDI R16,0xAA
00C1 8308 STD Y+0,R16
00C2 2400 CLR R0
00C3 E0E0 LDI R30,0
00C4 E0F1 LDI R31,1
00C5 E011 LDI R17,1
00C6 30E0 CPI R30,0
00C7 07F1 CPC R31,R17
00C8 F011 BEQ 0x00CB
00C9 9201 ST R0,Z+
00CA CFFB RJMP 0x00C6
00CB 8300 STD Z+0,R16
00CC E7E4 LDI R30,0x74
00CD E0F1 LDI R31,1
00CE E0A0 LDI R26,0
00CF E0B1 LDI R27,1
00D0 E011 LDI R17,1
00D1 37E4 CPI R30,0x74
00D2 07F1 CPC R31,R17
00D3 F021 BEQ 0x00D8
00D4 95C8 LPM
00D5 9631 ADIW R30,1
00D6 920D ST R0,X+
00D7 CFF9 RJMP 0x00D1
00D8 940E011B CALL _main
_exit:
00DA CFFF RJMP _exit
_delay_ms:
a --> R20
i --> R16
00DB 940E01C1 CALL push_gset1
FILE: F:\AVR学习板\复件实~1\MUSIC\MUSIC.c
(0001) /*****************************************
(0002) * 用M16单片机I/O口生成模拟音乐 *
(0003) * 功 能:用I/O口生成模拟音乐 *
(0004) * 时钟频率:内部1M *
(0005) * 设 计:tonghe *
(0006) * 修改日期:2007年04月13日 *
(0007) * 编译环境:ICC-AVR6.31 *
(0008) * 实验环境:本站M16学习板 *
(0009) * 发 声:无源蜂鸣器 *
(0010) * 结 果:试验通过 *
(0011) * 要 求:插上JP1、JP2、LED_EN短路块 *
(0012) *****************************************/
(0013) #include <iom128v.h>
(0014) #include <macros.h>
(0015)
(0016) #define uchar unsigned char
(0017) #define uint unsigned int
(0018)
(0019) /****************************************
(0020) * 定义音乐数据二维数组{x,y} *
(0021) * x:对应音符音阶(频率),0表示休止符 *
(0022) * y:对应音符节拍,0表示音乐结束 *
(0023) * 此数据取自《ICC AVR应用实例》 *
(0024) ****************************************/
(0025) //以下音乐数据为《卡秋莎》,位于程序区
(0026) flash uint music_data[][2]=
(0027) {
(0028) {440,600},{494,200},{523,600},{443,200},{523,400},{494,200},
(0029) {440,200},{494,400},{330,400},{494,600},{523,200},{578,600},
(0030) {494,200},{578,400},{523,200},{494,200},{440,800},{659,400},
(0031) {880,400},{784,400},{880,200},{784,200},{698,400},{659,200},
(0032) {578,200},{659,400},{440,400},{ 0,200},{698,400},{578,200},
(0033) {659,600},{523,200},{494,200},{330,200},{523,200},{494,200},
(0034) {440,800},{659,400},{880,400},{784,400},{880,200},{784,200},
(0035) {698,400},{659,200},{578,200},{659,400},{440,400},{ 0,200},
(0036) {698,400},{578,200},{659,600},{523,200},{494,200},{330,200},
(0037) {523,200},{494,200},{440,800},{ 0, 0}
(0038) };
(0039)
(0040) #pragma data:data //设置回到数据存储器区
(0041)
(0042) /************************************
(0043) * 延时函数:1M时钟时为MS *
(0044) ************************************/
(0045) void delay_ms(uint i)
(0046) {
(0047) uchar a;
(0048) for(;i;i--)
00DD C007 RJMP 0x00E5
(0049) {
(0050) for (a = 220; a; a--)
00DE ED4C LDI R20,0xDC
00DF C001 RJMP 0x00E1
00E0 954A DEC R20
00E1 2344 TST R20
00E2 F7E9 BNE 0x00E0
00E3 5001 SUBI R16,1
00E4 4010 SBCI R17,0
00E5 3000 CPI R16,0
00E6 0701 CPC R16,R17
00E7 F7B1 BNE 0x00DE
(0051) {
(0052) ;
(0053) }
(0054) }
(0055) }
00E8 940E01C4 CALL pop_gset1
00EA 9508 RET
(0056)
(0057) /************************************
(0058) * 端口初始化函数 *
(0059) ************************************/
(0060) void port_init(void)
(0061) {
(0062) DDRG=0xff; //D口配置为输出,驱动蜂鸣器
_port_init:
00EB EF8F LDI R24,0xFF
00EC 93800064 STS 0x64,R24
(0063) DDRA=0xff; //B口配置为输出,驱动LED
00EE BB8A OUT 0x1A,R24
(0064) PORTA=0xff; //LED初值为灭
00EF BB8B OUT 0x1B,R24
(0065) }
00F0 9508 RET
_sound:
x --> R10
i --> R10
00F1 940E01DC CALL push_gset3
00F3 2EA0 MOV R10,R16
(0066)
(0067) /***********************************
(0068) * 音乐产生函数 *
(0069) * 功能:输出频率为x的方波,延时y MS*
(0070) * 范围:x:100-20000Hz,0:不发声 *
(0071) * y:0-65536 MS *
(0072) ***********************************/
(0073) void sound(uchar i)
(0074) {
(0075) uint x;
(0076) x=music_data[i][0]; //取音乐的频率数据
00F4 E084 LDI R24,4
00F5 9D8A MUL R24,R10
00F6 01F0 MOVW R30,R0
00F7 E88C LDI R24,0x8C
00F8 E090 LDI R25,0
00F9 0FE8 ADD R30,R24
00FA 1FF9 ADC R31,R25
00FB 90A5 LPM R10,Z+
00FC 90B4 LPM R11,0(Z)
(0077) if(x!=0)
00FD 20AA TST R10
00FE F411 BNE 0x0101
00FF 20BB TST R11
0100 F0A9 BEQ 0x0116
(0078) {
(0079) x=500000/x; //1M时钟数据计算
0101 0115 MOVW R2,R10
0102 2444 CLR R4
0103 2455 CLR R5
0104 E240 LDI R20,0x20
0105 EA51 LDI R21,0xA1
0106 E067 LDI R22,7
0107 E070 LDI R23,0
0108 925A ST R5,-Y
0109 924A ST R4,-Y
010A 923A ST R3,-Y
010B 922A ST R2,-Y
010C 018A MOVW R16,R20
010D 019B MOVW R18,R22
010E 940E0153 CALL div32s
0110 0158 MOVW R10,R16
(0080) OCR1A=x; //比较值赋值
0111 BD1B OUT 0x2B,R17
0112 BD0A OUT 0x2A,R16
(0081) TCCR1A = 0x40; //允许比较反转输出
0113 E480 LDI R24,0x40
0114 BD8F OUT 0x2F,R24
(0082) }
0115 C002 RJMP 0x0118
(0083) else
(0084) {
(0085) TCCR1A = 0x00; //频率为0,休止符,不发声
0116 2422 CLR R2
0117 BC2F OUT 0x2F,R2
(0086) }
(0087) }
0118 940E01BE CALL pop_gset3
011A 9508 RET
(0088) /*******************************
(0089) * 主函数 *
(0090) *******************************/
(0091) void main(void)
(0092) {
(0093) uchar i=0;
_main:
i --> R20
011B 2744 CLR R20
(0094) port_init(); //端口初始化
011C DFCE RCALL _port_init
(0095) TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反
011D E480 LDI R24,0x40
011E BD8F OUT 0x2F,R24
(0096) TCCR1B = 0x09;
011F E089 LDI R24,0x9
0120 BD8E OUT 0x2E,R24
0121 C029 RJMP 0x014B
(0097) while(1)
(0098) {
(0099) while(music_data[i][1]!=0) //等待最后一个音符到来
(0100) {
(0101) sound(i); //输出音符
0122 2F04 MOV R16,R20
0123 DFCD RCALL _sound
(0102) delay_ms(music_data[i][1]);//节拍延时
0124 E084 LDI R24,4
0125 9F84 MUL R24,R20
0126 01F0 MOVW R30,R0
0127 E88E LDI R24,0x8E
0128 E090 LDI R25,0
0129 0FE8 ADD R30,R24
012A 1FF9 ADC R31,R25
012B 9105 LPM R16,Z+
012C 9114 LPM R17,0(Z)
012D DFAD RCALL _delay_ms
(0103) TCCR1A = 0x00; //奏完一个音符停止
012E 2422 CLR R2
012F BC2F OUT 0x2F,R2
(0104) PORTA^=1<<5; //音符节拍由LD5闪亮显示
0130 E280 LDI R24,0x20
0131 B22B IN R2,0x1B
0132 2628 EOR R2,R24
0133 BA2B OUT 0x1B,R2
(0105) PORTG|=1<<5;
0134 91800065 LDS R24,0x65
0136 6280 ORI R24,0x20
0137 93800065 STS 0x65,R24
(0106) i++; //准备一下个音符
0139 9543 INC R20
013A E084 LDI R24,4
013B 9F84 MUL R24,R20
013C 01F0 MOVW R30,R0
013D E88E LDI R24,0x8E
013E E090 LDI R25,0
013F 0FE8 ADD R30,R24
0140 1FF9 ADC R31,R25
0141 9005 LPM R0,Z+
0142 9014 LPM R1,0(Z)
0143 01F0 MOVW R30,R0
0144 30E0 CPI R30,0
0145 07EF CPC R30,R31
0146 F6D9 BNE 0x0122
(0107) }
(0108) delay_ms(16000);
0147 E800 LDI R16,0x80
0148 E31E LDI R17,0x3E
0149 DF91 RCALL _delay_ms
(0109) i=0; //一遍结束,停1秒,从头开始
014A 2744 CLR R20
014B CFEE RJMP 0x013A
(0110) }
(0111) }
FILE: <library>
014C 9508 RET
div32u:
014D 94E8 BCLR 6
014E C001 RJMP 0x0150
mod32u:
014F 9468 BSET 6
0150 D02F RCALL long_div_prolog
0151 24CC CLR R12
0152 C008 RJMP 0x015B
div32s:
0153 94E8 BCLR 6
0154 C001 RJMP 0x0156
mod32s:
0155 9468 BSET 6
0156 D029 RCALL long_div_prolog
0157 FD37 SBRC R19,7
0158 D053 RCALL neg_R16_R19
0159 FDB7 SBRC R27,7
015A D05A RCALL neg_R24_R27
015B 2477 CLR R7
015C 2488 CLR R8
015D 2499 CLR R9
015E 24AA CLR R10
015F 24BB CLR R11
0160 D041 RCALL tst_R16_R19
0161 F0C1 BEQ 0x017A
0162 D044 RCALL tst_R24_R27
0163 F0B1 BEQ 0x017A
0164 E2E8 LDI R30,0x28
0165 0F00 LSL R16
0166 1F11 ROL R17
0167 1F22 ROL R18
0168 1F33 ROL R19
0169 1C77 ROL R7
016A 1C88 ROL R8
016B 1C99 ROL R9
016C 1CAA ROL R10
016D 1CBB ROL R11
016E 1688 CP R8,R24
016F 0699 CPC R9,R25
0170 06AA CPC R10,R26
0171 06BB CPC R11,R27
0172 F028 BCS 0x0178
0173 1A88 SUB R8,R24
0174 0A99 SBC R9,R25
0175 0AAA SBC R10,R26
0176 0ABB SBC R11,R27
0177 9503 INC R16
0178 95EA DEC R30
0179 F759 BNE 0x0165
017A F426 BRTC 0x017F
017B 2D08 MOV R16,R8
017C 2D19 MOV R17,R9
017D 2D2A MOV R18,R10
017E 2D3B MOV R19,R11
017F C013 RJMP long_div_epilog
long_div_prolog:
0180 927A ST R7,-Y
0181 928A ST R8,-Y
0182 929A ST R9,-Y
0183 92AA ST R10,-Y
0184 92BA ST R11,-Y
0185 92CA ST R12,-Y
0186 93EA ST R30,-Y
0187 938A ST R24,-Y
0188 939A ST R25,-Y
0189 93AA ST R26,-Y
018A 93BA ST R27,-Y
018B 858B LDD R24,Y+11
018C 859C LDD R25,Y+12
018D 85AD LDD R26,Y+13
018E 85BE LDD R27,Y+14
018F 2EC3 MOV R12,R19
0190 F00E BRTS 0x0192
0191 26CB EOR R12,R27
0192 9508 RET
long_div_epilog:
0193 FCC7 SBRC R12,7
0194 D017 RCALL neg_R16_R19
0195 91B9 LD R27,Y+
0196 91A9 LD R26,Y+
0197 9199 LD R25,Y+
0198 9189 LD R24,Y+
0199 91E9 LD R30,Y+
019A 90C9 LD R12,Y+
019B 90B9 LD R11,Y+
019C 90A9 LD R10,Y+
019D 9099 LD R9,Y+
019E 9089 LD R8,Y+
019F 9079 LD R7,Y+
01A0 9624 ADIW R28,4
01A1 9508 RET
tst_R16_R19:
01A2 2FE0 MOV R30,R16
01A3 2BE1 OR R30,R17
01A4 2BE2 OR R30,R18
01A5 2BE3 OR R30,R19
01A6 9508 RET
tst_R24_R27:
01A7 2FE8 MOV R30,R24
01A8 2BE9 OR R30,R25
01A9 2BEA OR R30,R26
01AA 2BEB OR R30,R27
01AB 9508 RET
neg_R16_R19:
01AC 9500 COM R16
01AD 9510 COM R17
01AE 9520 COM R18
01AF 9530 COM R19
01B0 5F0F SUBI R16,0xFF
01B1 4F1F SBCI R17,0xFF
01B2 4F2F SBCI R18,0xFF
01B3 4F3F SBCI R19,0xFF
01B4 9508 RET
neg_R24_R27:
01B5 9580 COM R24
01B6 9590 COM R25
01B7 95A0 COM R26
01B8 95B0 COM R27
01B9 5F8F SUBI R24,0xFF
01BA 4F9F SBCI R25,0xFF
01BB 4FAF SBCI R26,0xFF
01BC 4FBF SBCI R27,0xFF
01BD 9508 RET
pop_gset3:
01BE E0E4 LDI R30,4
01BF 940C01C5 JMP pop
push_gset1:
01C1 935A ST R21,-Y
01C2 934A ST R20,-Y
01C3 9508 RET
pop_gset1:
01C4 E0E1 LDI R30,1
pop:
01C5 9149 LD R20,Y+
01C6 9159 LD R21,Y+
01C7 FDE0 SBRC R30,0
01C8 9508 RET
01C9 9169 LD R22,Y+
01CA 9179 LD R23,Y+
01CB FDE1 SBRC R30,1
01CC 9508 RET
01CD 90A9 LD R10,Y+
01CE 90B9 LD R11,Y+
01CF FDE2 SBRC R30,2
01D0 9508 RET
01D1 90C9 LD R12,Y+
01D2 90D9 LD R13,Y+
01D3 FDE3 SBRC R30,3
01D4 9508 RET
01D5 90E9 LD R14,Y+
01D6 90F9 LD R15,Y+
01D7 9508 RET
push_gset2:
01D8 937A ST R23,-Y
01D9 936A ST R22,-Y
01DA 940C01C1 JMP push_gset1
push_gset3:
01DC 92BA ST R11,-Y
01DD 92AA ST R10,-Y
01DE 940C01D8 JMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -