📄 music1.lst
字号:
__text_start:
__start:
009E E5CF LDI R28,0x5F
009F E0D4 LDI R29,4
00A0 BFCD OUT 0x3D,R28
00A1 BFDE OUT 0x3E,R29
00A2 51C0 SUBI R28,0x10
00A3 40D0 SBCI R29,0
00A4 EA0A LDI R16,0xAA
00A5 8308 STD Y+0,R16
00A6 2400 CLR R0
00A7 E6E0 LDI R30,0x60
00A8 E0F0 LDI R31,0
00A9 E010 LDI R17,0
00AA 36E0 CPI R30,0x60
00AB 07F1 CPC R31,R17
00AC F011 BEQ 0x00AF
00AD 9201 ST R0,Z+
00AE CFFB RJMP 0x00AA
00AF 8300 STD Z+0,R16
00B0 E3EC LDI R30,0x3C
00B1 E0F1 LDI R31,1
00B2 E6A0 LDI R26,0x60
00B3 E0B0 LDI R27,0
00B4 E011 LDI R17,1
00B5 33EC CPI R30,0x3C
00B6 07F1 CPC R31,R17
00B7 F021 BEQ 0x00BC
00B8 95C8 LPM
00B9 9631 ADIW R30,1
00BA 920D ST R0,X+
00BB CFF9 RJMP 0x00B5
00BC 940E00FE CALL _main
_exit:
00BE CFFF RJMP _exit
_delay_ms:
a --> R20
i --> R16
00BF 940E01A8 CALL push_gset1
FILE: E:\ICCAVR-M16学习板\基础实验\模拟音乐\卡秋莎\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 <iom16v.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--)
00C1 C007 RJMP 0x00C9
(0049) {
(0050) for (a = 220; a; a--)
00C2 ED4C LDI R20,0xDC
00C3 C001 RJMP 0x00C5
00C4 954A DEC R20
00C5 2344 TST R20
00C6 F7E9 BNE 0x00C4
00C7 5001 SUBI R16,1
00C8 4010 SBCI R17,0
00C9 3000 CPI R16,0
00CA 0701 CPC R16,R17
00CB F7B1 BNE 0x00C2
00CC 940E01AB CALL pop_gset1
00CE 9508 RET
(0051) {
(0052) ;
(0053) }
(0054) }
(0055) }
(0056)
(0057) /************************************
(0058) * 端口初始化函数 *
(0059) ************************************/
(0060) void port_init(void)
(0061) {
(0062) DDRD=0xff; //D口配置为输出,驱动蜂鸣器
_port_init:
00CF EF8F LDI R24,0xFF
00D0 BB81 OUT 0x11,R24
(0063) DDRB=0xff; //B口配置为输出,驱动LED
00D1 BB87 OUT 0x17,R24
(0064) PORTB=0xff; //LED初值为灭
00D2 BB88 OUT 0x18,R24
00D3 9508 RET
_sound:
x --> R10
i --> R10
00D4 940E01A4 CALL push_gset3
00D6 2EA0 MOV R10,R16
(0065) }
(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]; //取音乐的频率数据
00D7 E084 LDI R24,4
00D8 9D8A MUL R24,R10
00D9 01F0 MOVW R30,R0
00DA E584 LDI R24,0x54
00DB E090 LDI R25,0
00DC 0FE8 ADD R30,R24
00DD 1FF9 ADC R31,R25
00DE 90A5 LPM R10,Z+
00DF 90B4 LPM R11,0(Z)
(0077) if(x!=0)
00E0 20AA TST R10
00E1 F411 BNE 0x00E4
00E2 20BB TST R11
00E3 F0A9 BEQ 0x00F9
(0078) {
(0079) x=500000/x; //1M时钟数据计算
00E4 0115 MOVW R2,R10
00E5 2444 CLR R4
00E6 2455 CLR R5
00E7 E240 LDI R20,0x20
00E8 EA51 LDI R21,0xA1
00E9 E067 LDI R22,7
00EA E070 LDI R23,0
00EB 925A ST R5,-Y
00EC 924A ST R4,-Y
00ED 923A ST R3,-Y
00EE 922A ST R2,-Y
00EF 018A MOVW R16,R20
00F0 019B MOVW R18,R22
00F1 940E0132 CALL div32s
00F3 0158 MOVW R10,R16
(0080) OCR1A=x; //比较值赋值
00F4 BD1B OUT 0x2B,R17
00F5 BD0A OUT 0x2A,R16
(0081) TCCR1A = 0x40; //允许比较反转输出
00F6 E480 LDI R24,0x40
00F7 BD8F OUT 0x2F,R24
(0082) }
00F8 C002 RJMP 0x00FB
(0083) else
(0084) {
(0085) TCCR1A = 0x00; //频率为0,休止符,不发声
00F9 2422 CLR R2
00FA BC2F OUT 0x2F,R2
(0086) }
00FB 940E019D CALL pop_gset3
00FD 9508 RET
(0087) }
(0088) /*******************************
(0089) * 主函数 *
(0090) *******************************/
(0091) void main(void)
(0092) {
(0093) uchar i=0;
_main:
i --> R20
00FE 2744 CLR R20
(0094) port_init(); //端口初始化
00FF DFCF RCALL _port_init
(0095) TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反
0100 E480 LDI R24,0x40
0101 BD8F OUT 0x2F,R24
(0096) TCCR1B = 0x09;
0102 E089 LDI R24,0x9
0103 BD8E OUT 0x2E,R24
0104 C025 RJMP 0x012A
(0097) while(1)
(0098) {
(0099) while(music_data[i][1]!=0) //等待最后一个音符到来
(0100) {
(0101) sound(i); //输出音符
0105 2F04 MOV R16,R20
0106 DFCD RCALL _sound
(0102) delay_ms(music_data[i][1]);//节拍延时
0107 E084 LDI R24,4
0108 9F84 MUL R24,R20
0109 01F0 MOVW R30,R0
010A E586 LDI R24,0x56
010B E090 LDI R25,0
010C 0FE8 ADD R30,R24
010D 1FF9 ADC R31,R25
010E 9105 LPM R16,Z+
010F 9114 LPM R17,0(Z)
0110 DFAE RCALL _delay_ms
(0103) TCCR1A = 0x00; //奏完一个音符停止
0111 2422 CLR R2
0112 BC2F OUT 0x2F,R2
(0104) PORTB^=1<<5; //音符节拍由LD5闪亮显示
0113 E280 LDI R24,0x20
0114 B228 IN R2,0x18
0115 2628 EOR R2,R24
0116 BA28 OUT 0x18,R2
(0105) PORTD|=1<<5;
0117 9A95 SBI 0x12,5
(0106) i++; //准备一下个音符
0118 9543 INC R20
0119 E084 LDI R24,4
011A 9F84 MUL R24,R20
011B 01F0 MOVW R30,R0
011C E586 LDI R24,0x56
011D E090 LDI R25,0
011E 0FE8 ADD R30,R24
011F 1FF9 ADC R31,R25
0120 9005 LPM R0,Z+
0121 9014 LPM R1,0(Z)
0122 01F0 MOVW R30,R0
0123 30E0 CPI R30,0
0124 07EF CPC R30,R31
0125 F6F9 BNE 0x0105
(0107) }
(0108) delay_ms(1000);
0126 EE08 LDI R16,0xE8
0127 E013 LDI R17,3
0128 DF96 RCALL _delay_ms
(0109) i=0; //一遍结束,停1秒,从头开始
FILE: <library>
0129 2744 CLR R20
012A CFEE RJMP 0x0119
012B 9508 RET
div32u:
012C 94E8 BCLR 6
012D C001 RJMP 0x012F
mod32u:
012E 9468 BSET 6
012F D02F RCALL long_div_prolog
0130 24CC CLR R12
0131 C008 RJMP 0x013A
div32s:
0132 94E8 BCLR 6
0133 C001 RJMP 0x0135
mod32s:
0134 9468 BSET 6
0135 D029 RCALL long_div_prolog
0136 FD37 SBRC R19,7
0137 D053 RCALL neg_R16_R19
0138 FDB7 SBRC R27,7
0139 D05A RCALL neg_R24_R27
013A 2477 CLR R7
013B 2488 CLR R8
013C 2499 CLR R9
013D 24AA CLR R10
013E 24BB CLR R11
013F D041 RCALL tst_R16_R19
0140 F0C1 BEQ 0x0159
0141 D044 RCALL tst_R24_R27
0142 F0B1 BEQ 0x0159
0143 E2E8 LDI R30,0x28
0144 0F00 LSL R16
0145 1F11 ROL R17
0146 1F22 ROL R18
0147 1F33 ROL R19
0148 1C77 ROL R7
0149 1C88 ROL R8
014A 1C99 ROL R9
014B 1CAA ROL R10
014C 1CBB ROL R11
014D 1688 CP R8,R24
014E 0699 CPC R9,R25
014F 06AA CPC R10,R26
0150 06BB CPC R11,R27
0151 F028 BCS 0x0157
0152 1A88 SUB R8,R24
0153 0A99 SBC R9,R25
0154 0AAA SBC R10,R26
0155 0ABB SBC R11,R27
0156 9503 INC R16
0157 95EA DEC R30
0158 F759 BNE 0x0144
0159 F426 BRTC 0x015E
015A 2D08 MOV R16,R8
015B 2D19 MOV R17,R9
015C 2D2A MOV R18,R10
015D 2D3B MOV R19,R11
015E C013 RJMP long_div_epilog
long_div_prolog:
015F 927A ST R7,-Y
0160 928A ST R8,-Y
0161 929A ST R9,-Y
0162 92AA ST R10,-Y
0163 92BA ST R11,-Y
0164 92CA ST R12,-Y
0165 93EA ST R30,-Y
0166 938A ST R24,-Y
0167 939A ST R25,-Y
0168 93AA ST R26,-Y
0169 93BA ST R27,-Y
016A 858B LDD R24,Y+11
016B 859C LDD R25,Y+12
016C 85AD LDD R26,Y+13
016D 85BE LDD R27,Y+14
016E 2EC3 MOV R12,R19
016F F00E BRTS 0x0171
0170 26CB EOR R12,R27
0171 9508 RET
long_div_epilog:
0172 FCC7 SBRC R12,7
0173 D017 RCALL neg_R16_R19
0174 91B9 LD R27,Y+
0175 91A9 LD R26,Y+
0176 9199 LD R25,Y+
0177 9189 LD R24,Y+
0178 91E9 LD R30,Y+
0179 90C9 LD R12,Y+
017A 90B9 LD R11,Y+
017B 90A9 LD R10,Y+
017C 9099 LD R9,Y+
017D 9089 LD R8,Y+
017E 9079 LD R7,Y+
017F 9624 ADIW R28,4
0180 9508 RET
tst_R16_R19:
0181 2FE0 MOV R30,R16
0182 2BE1 OR R30,R17
0183 2BE2 OR R30,R18
0184 2BE3 OR R30,R19
0185 9508 RET
tst_R24_R27:
0186 2FE8 MOV R30,R24
0187 2BE9 OR R30,R25
0188 2BEA OR R30,R26
0189 2BEB OR R30,R27
018A 9508 RET
neg_R16_R19:
018B 9500 COM R16
018C 9510 COM R17
018D 9520 COM R18
018E 9530 COM R19
018F 5F0F SUBI R16,0xFF
0190 4F1F SBCI R17,0xFF
0191 4F2F SBCI R18,0xFF
0192 4F3F SBCI R19,0xFF
0193 9508 RET
neg_R24_R27:
0194 9580 COM R24
0195 9590 COM R25
0196 95A0 COM R26
0197 95B0 COM R27
0198 5F8F SUBI R24,0xFF
0199 4F9F SBCI R25,0xFF
019A 4FAF SBCI R26,0xFF
019B 4FBF SBCI R27,0xFF
019C 9508 RET
pop_gset3:
019D E0E4 LDI R30,4
019E 940C01AC JMP pop
push_gset5:
01A0 92FA ST R15,-Y
01A1 92EA ST R14,-Y
push_gset4:
01A2 92DA ST R13,-Y
01A3 92CA ST R12,-Y
push_gset3:
01A4 92BA ST R11,-Y
01A5 92AA ST R10,-Y
push_gset2:
01A6 937A ST R23,-Y
01A7 936A ST R22,-Y
push_gset1:
01A8 935A ST R21,-Y
01A9 934A ST R20,-Y
01AA 9508 RET
pop_gset1:
01AB E0E1 LDI R30,1
pop:
01AC 9149 LD R20,Y+
01AD 9159 LD R21,Y+
01AE FDE0 SBRC R30,0
01AF 9508 RET
01B0 9169 LD R22,Y+
01B1 9179 LD R23,Y+
01B2 FDE1 SBRC R30,1
01B3 9508 RET
01B4 90A9 LD R10,Y+
01B5 90B9 LD R11,Y+
01B6 FDE2 SBRC R30,2
01B7 9508 RET
01B8 90C9 LD R12,Y+
01B9 90D9 LD R13,Y+
01BA FDE3 SBRC R30,3
01BB 9508 RET
01BC 90E9 LD R14,Y+
01BD 90F9 LD R15,Y+
01BE 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -