📄 music.lst
字号:
__text_start:
__start:
009F E5CF LDI R28,0x5F
00A0 E0D4 LDI R29,4
00A1 BFCD OUT 0x3D,R28
00A2 BFDE OUT 0x3E,R29
00A3 51C0 SUBI R28,0x10
00A4 40D0 SBCI R29,0
00A5 EA0A LDI R16,0xAA
00A6 8308 STD Y+0,R16
00A7 2400 CLR R0
00A8 E6E2 LDI R30,0x62
00A9 E0F0 LDI R31,0
00AA E010 LDI R17,0
00AB 36E2 CPI R30,0x62
00AC 07F1 CPC R31,R17
00AD F011 BEQ 0x00B0
00AE 9201 ST R0,Z+
00AF CFFB RJMP 0x00AB
00B0 8300 STD Z+0,R16
00B1 E3EC LDI R30,0x3C
00B2 E0F1 LDI R31,1
00B3 E6A0 LDI R26,0x60
00B4 E0B0 LDI R27,0
00B5 E011 LDI R17,1
00B6 33EE CPI R30,0x3E
00B7 07F1 CPC R31,R17
00B8 F021 BEQ 0x00BD
00B9 95C8 LPM
00BA 9631 ADIW R30,1
00BB 920D ST R0,X+
00BC CFF9 RJMP 0x00B6
00BD 940E0130 CALL _main
_exit:
00BF CFFF RJMP _exit
FILE: F:\李鹏飞\sl-avrad-m16\music\music.c
(0001) /**********************************************
(0002) http://www.sl.com.cn
(0003) 双龙电子公司----电脑音乐演示程序(ICCAVR)
(0004) 作者:詹卫前
(0005) 1、学习定时器T0溢出中断的使用
(0006) 2、学习定时器T1比较中断的使用
(0007) 3、学习电脑音乐的产生
(0008) **********************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #pragma interrupt_handler timer0:10
(0012) #pragma interrupt_handler timer1:7
(0013) const unsigned int music_data[][2]=
(0014) /*******************************************
(0015) 卡秋莎音乐数据{x,y}
(0016) x:对应音符音阶(频率),0表示休止符
(0017) y:对应音符节拍
(0018) ********************************************/
(0019) {
(0020) {440,600} ,{494,200} ,{523,600} ,{440,200},
(0021) {523,400} ,{494,200} ,{440,200} ,{494,400},
(0022) {330,400} ,{494,600} ,{523,200} ,{578,600},
(0023) {494,200} ,{578,400} ,{523,200} ,{494,200},
(0024) {440,800} ,{659,400} ,{880,400} ,{784,400},
(0025) {880,200} ,{784,200} ,{698,400} ,{659,200},
(0026) {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
(0027) {698,400} ,{578,200} ,{659,600} ,{523,200},
(0028) {494,200} ,{330,200} ,{523,200} ,{494,200},
(0029) {440,800} ,{659,400} ,{880,400} ,{784,400},
(0030) {880,200} ,{784,200} ,{698,400} ,{659,200},
(0031) {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
(0032) {698,400} ,{578,200}, {659,600} ,{523,200},
(0033) {494,200} ,{330,200}, {523,200} ,{494,200},
(0034) {440,800} ,
(0035) {0,0}};
(0036) #pragma data:data
(0037) unsigned int delay=0;
(0038) /*******************************
(0039) MCU初始化
(0040) *******************************/
(0041) void music_init(void)
(0042) {
(0043) MCUCR=0x00;
_music_init:
00C0 2422 CLR R2
00C1 BE25 OUT 0x35,R2
(0044) DDRC=0x01;
00C2 E081 LDI R24,1
00C3 BB84 OUT 0x14,R24
(0045) TCCR1A=0x00;
00C4 BC2F OUT 0x2F,R2
(0046) TCCR1B=0x09;
00C5 E089 LDI R24,0x9
00C6 BD8E OUT 0x2E,R24
(0047) TCCR0=0x03;
00C7 E083 LDI R24,3
00C8 BF83 OUT 0x33,R24
(0048) TCNT0=0x19;
00C9 E189 LDI R24,0x19
00CA BF82 OUT 0x32,R24
(0049) TIMSK=(1<<OCIE1A)|(1<<TOIE0);
00CB E181 LDI R24,0x11
00CC BF89 OUT 0x39,R24
(0050) }
00CD 9508 RET
_timer0:
00CE 938A ST R24,-Y
00CF 939A ST R25,-Y
00D0 B78F IN R24,0x3F
00D1 938A ST R24,-Y
(0051) /**************************************************
(0052) T0中断程序,产生音乐节拍
(0053) **************************************************/
(0054) void timer0(void)
(0055) {
(0056) delay++;
00D2 91800060 LDS R24,0x60
00D4 91900061 LDS R25,0x61
00D6 9601 ADIW R24,1
00D7 93900061 STS 0x61,R25
00D9 93800060 STS 0x60,R24
(0057) TCNT0=0x19;
00DB E189 LDI R24,0x19
00DC BF82 OUT 0x32,R24
(0058) }
00DD 9189 LD R24,Y+
00DE BF8F OUT 0x3F,R24
00DF 9199 LD R25,Y+
00E0 9189 LD R24,Y+
00E1 9518 RETI
_timer1:
00E2 922A ST R2,-Y
00E3 938A ST R24,-Y
00E4 B62F IN R2,0x3F
00E5 922A ST R2,-Y
(0059) /**************************************************
(0060) T1中断程序,根据SOUND函数输出一定频率的方波
(0061) **************************************************/
(0062) void timer1(void)
(0063) {
(0064) PORTC^=0x01;
00E6 E081 LDI R24,1
00E7 B225 IN R2,0x15
00E8 2628 EOR R2,R24
00E9 BA25 OUT 0x15,R2
(0065) }
00EA 9029 LD R2,Y+
00EB BE2F OUT 0x3F,R2
00EC 9189 LD R24,Y+
00ED 9029 LD R2,Y+
00EE 9518 RETI
_sound:
y --> R10
x --> R12
00EF 940E01E9 CALL push_gset4
00F1 0159 MOVW R10,R18
00F2 0168 MOVW R12,R16
(0066) /*****************************************************
(0067) SOUND程序,输出频率为 x HZ的方波,延时 y MS
(0068) x:100~20000 HZ, 0表示不发声
(0069) y:0~65536 MS
(0070) *****************************************************/
(0071) void sound(unsigned int x,unsigned int y)
(0072) {
(0073) SEI();
00F3 9478 BSET 7
(0074) delay=0;
00F4 2422 CLR R2
00F5 2433 CLR R3
00F6 92300061 STS 0x61,R3
00F8 92200060 STS 0x60,R2
(0075) if (x!=0)
00FA 20CC TST R12
00FB F411 BNE 0x00FE
00FC 20DD TST R13
00FD F121 BEQ 0x0122
(0076) {
(0077) x=4000000/x;
00FE 0116 MOVW R2,R12
00FF 2444 CLR R4
0100 2455 CLR R5
0101 E040 LDI R20,0
0102 E059 LDI R21,0x9
0103 E36D LDI R22,0x3D
0104 E070 LDI R23,0
0105 925A ST R5,-Y
0106 924A ST R4,-Y
0107 923A ST R3,-Y
0108 922A ST R2,-Y
0109 018A MOVW R16,R20
010A 019B MOVW R18,R22
010B 940E015C CALL div32s
010D 0168 MOVW R12,R16
(0078) OCR1A=x;
010E BD1B OUT 0x2B,R17
010F BD0A OUT 0x2A,R16
(0079) TCNT1=0x00;
0110 2422 CLR R2
0111 2433 CLR R3
0112 BC3D OUT 0x2D,R3
0113 BC2C OUT 0x2C,R2
(0080) TIMSK|=(1<<OCIE1A);
0114 B789 IN R24,0x39
0115 6180 ORI R24,0x10
0116 BF89 OUT 0x39,R24
(0081) while(delay<y)
0117 90200060 LDS R2,0x60
0119 90300061 LDS R3,0x61
011B 142A CP R2,R10
011C 043B CPC R3,R11
011D F3C8 BCS 0x0117
(0082) ;
(0083) TIMSK&=~(1<<OCIE1A);
011E B789 IN R24,0x39
011F 7E8F ANDI R24,0xEF
0120 BF89 OUT 0x39,R24
(0084) }
0121 C00A RJMP 0x012C
(0085) else
(0086) {
(0087) TIMSK&=~(1<<OCIE1A);
0122 B789 IN R24,0x39
0123 7E8F ANDI R24,0xEF
0124 BF89 OUT 0x39,R24
(0088) while(delay<y)
0125 90200060 LDS R2,0x60
0127 90300061 LDS R3,0x61
0129 142A CP R2,R10
012A 043B CPC R3,R11
012B F3C8 BCS 0x0125
(0089) ;
(0090) }
(0091) CLI();
012C 94F8 BCLR 7
(0092)
(0093) }
012D 940E01C7 CALL pop_gset4
012F 9508 RET
(0094) /*******************************
(0095) 主程序
(0096) *******************************/
(0097) void main(void)
(0098) {
(0099) unsigned char i=0;
_main:
i --> R20
0130 2744 CLR R20
(0100) music_init();
0131 DF8E RCALL _music_init
0132 C021 RJMP 0x0154
(0101) while(1)
(0102) {
(0103) while(music_data[i][1]!=0)
(0104) {
(0105) sound(music_data[i][0],music_data[i][1]);
0133 E084 LDI R24,4
0134 9F84 MUL R24,R20
0135 0110 MOVW R2,R0
0136 E586 LDI R24,0x56
0137 E090 LDI R25,0
0138 01F1 MOVW R30,R2
0139 0FE8 ADD R30,R24
013A 1FF9 ADC R31,R25
013B 9125 LPM R18,Z+
013C 9134 LPM R19,0(Z)
013D E584 LDI R24,0x54
013E E090 LDI R25,0
013F 01F1 MOVW R30,R2
0140 0FE8 ADD R30,R24
0141 1FF9 ADC R31,R25
0142 9105 LPM R16,Z+
0143 9114 LPM R17,0(Z)
0144 DFAA RCALL _sound
(0106) i++;
0145 9543 INC R20
0146 E084 LDI R24,4
0147 9F84 MUL R24,R20
0148 01F0 MOVW R30,R0
0149 E586 LDI R24,0x56
014A E090 LDI R25,0
014B 0FE8 ADD R30,R24
014C 1FF9 ADC R31,R25
014D 9005 LPM R0,Z+
014E 9014 LPM R1,0(Z)
014F 01F0 MOVW R30,R0
0150 30E0 CPI R30,0
0151 07EF CPC R30,R31
0152 F701 BNE 0x0133
(0107) }
(0108) i=0;
0153 2744 CLR R20
0154 CFF1 RJMP 0x0146
(0109) }
(0110) }
FILE: <library>
0155 9508 RET
div32u:
0156 94E8 BCLR 6
0157 C001 RJMP 0x0159
mod32u:
0158 9468 BSET 6
0159 D02F RCALL long_div_prolog
015A 24CC CLR R12
015B C008 RJMP 0x0164
div32s:
015C 94E8 BCLR 6
015D C001 RJMP 0x015F
mod32s:
015E 9468 BSET 6
015F D029 RCALL long_div_prolog
0160 FD37 SBRC R19,7
0161 D053 RCALL neg_R16_R19
0162 FDB7 SBRC R27,7
0163 D05A RCALL neg_R24_R27
0164 2477 CLR R7
0165 2488 CLR R8
0166 2499 CLR R9
0167 24AA CLR R10
0168 24BB CLR R11
0169 D041 RCALL tst_R16_R19
016A F0C1 BEQ 0x0183
016B D044 RCALL tst_R24_R27
016C F0B1 BEQ 0x0183
016D E2E8 LDI R30,0x28
016E 0F00 LSL R16
016F 1F11 ROL R17
0170 1F22 ROL R18
0171 1F33 ROL R19
0172 1C77 ROL R7
0173 1C88 ROL R8
0174 1C99 ROL R9
0175 1CAA ROL R10
0176 1CBB ROL R11
0177 1688 CP R8,R24
0178 0699 CPC R9,R25
0179 06AA CPC R10,R26
017A 06BB CPC R11,R27
017B F028 BCS 0x0181
017C 1A88 SUB R8,R24
017D 0A99 SBC R9,R25
017E 0AAA SBC R10,R26
017F 0ABB SBC R11,R27
0180 9503 INC R16
0181 95EA DEC R30
0182 F759 BNE 0x016E
0183 F426 BRTC 0x0188
0184 2D08 MOV R16,R8
0185 2D19 MOV R17,R9
0186 2D2A MOV R18,R10
0187 2D3B MOV R19,R11
0188 C013 RJMP long_div_epilog
long_div_prolog:
0189 927A ST R7,-Y
018A 928A ST R8,-Y
018B 929A ST R9,-Y
018C 92AA ST R10,-Y
018D 92BA ST R11,-Y
018E 92CA ST R12,-Y
018F 93EA ST R30,-Y
0190 938A ST R24,-Y
0191 939A ST R25,-Y
0192 93AA ST R26,-Y
0193 93BA ST R27,-Y
0194 858B LDD R24,Y+11
0195 859C LDD R25,Y+12
0196 85AD LDD R26,Y+13
0197 85BE LDD R27,Y+14
0198 2EC3 MOV R12,R19
0199 F00E BRTS 0x019B
019A 26CB EOR R12,R27
019B 9508 RET
long_div_epilog:
019C FCC7 SBRC R12,7
019D D017 RCALL neg_R16_R19
019E 91B9 LD R27,Y+
019F 91A9 LD R26,Y+
01A0 9199 LD R25,Y+
01A1 9189 LD R24,Y+
01A2 91E9 LD R30,Y+
01A3 90C9 LD R12,Y+
01A4 90B9 LD R11,Y+
01A5 90A9 LD R10,Y+
01A6 9099 LD R9,Y+
01A7 9089 LD R8,Y+
01A8 9079 LD R7,Y+
01A9 9624 ADIW R28,4
01AA 9508 RET
tst_R16_R19:
01AB 2FE0 MOV R30,R16
01AC 2BE1 OR R30,R17
01AD 2BE2 OR R30,R18
01AE 2BE3 OR R30,R19
01AF 9508 RET
tst_R24_R27:
01B0 2FE8 MOV R30,R24
01B1 2BE9 OR R30,R25
01B2 2BEA OR R30,R26
01B3 2BEB OR R30,R27
01B4 9508 RET
neg_R16_R19:
01B5 9500 COM R16
01B6 9510 COM R17
01B7 9520 COM R18
01B8 9530 COM R19
01B9 5F0F SUBI R16,0xFF
01BA 4F1F SBCI R17,0xFF
01BB 4F2F SBCI R18,0xFF
01BC 4F3F SBCI R19,0xFF
01BD 9508 RET
neg_R24_R27:
01BE 9580 COM R24
01BF 9590 COM R25
01C0 95A0 COM R26
01C1 95B0 COM R27
01C2 5F8F SUBI R24,0xFF
01C3 4F9F SBCI R25,0xFF
01C4 4FAF SBCI R26,0xFF
01C5 4FBF SBCI R27,0xFF
01C6 9508 RET
pop_gset4:
01C7 E0E8 LDI R30,0x8
01C8 940C01CE JMP pop
push_gset1:
01CA 935A ST R21,-Y
01CB 934A ST R20,-Y
01CC 9508 RET
pop_gset1:
01CD E0E1 LDI R30,1
pop:
01CE 9149 LD R20,Y+
01CF 9159 LD R21,Y+
01D0 FDE0 SBRC R30,0
01D1 9508 RET
01D2 9169 LD R22,Y+
01D3 9179 LD R23,Y+
01D4 FDE1 SBRC R30,1
01D5 9508 RET
01D6 90A9 LD R10,Y+
01D7 90B9 LD R11,Y+
01D8 FDE2 SBRC R30,2
01D9 9508 RET
01DA 90C9 LD R12,Y+
01DB 90D9 LD R13,Y+
01DC FDE3 SBRC R30,3
01DD 9508 RET
01DE 90E9 LD R14,Y+
01DF 90F9 LD R15,Y+
01E0 9508 RET
push_gset2:
01E1 937A ST R23,-Y
01E2 936A ST R22,-Y
01E3 940C01CA JMP push_gset1
push_gset3:
01E5 92BA ST R11,-Y
01E6 92AA ST R10,-Y
01E7 940C01E1 JMP push_gset2
push_gset4:
01E9 92DA ST R13,-Y
01EA 92CA ST R12,-Y
01EB 940C01E5 JMP push_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -