📄 音乐.lst
字号:
__text_start:
__start:
0094 E5CF LDI R28,0x5F
0095 E0D4 LDI R29,4
0096 BFCD OUT 0x3D,R28
0097 BFDE OUT 0x3E,R29
0098 51C0 SUBI R28,0x10
0099 40D0 SBCI R29,0
009A EA0A LDI R16,0xAA
009B 8308 STD Y+0,R16
009C 2400 CLR R0
009D E6E0 LDI R30,0x60
009E E0F0 LDI R31,0
009F E010 LDI R17,0
00A0 36E2 CPI R30,0x62
00A1 07F1 CPC R31,R17
00A2 F011 BEQ 0x00A5
00A3 9201 ST R0,Z+
00A4 CFFB RJMP 0x00A0
00A5 8300 STD Z+0,R16
00A6 E2E8 LDI R30,0x28
00A7 E0F1 LDI R31,1
00A8 E6A0 LDI R26,0x60
00A9 E0B0 LDI R27,0
00AA E011 LDI R17,1
00AB 32E8 CPI R30,0x28
00AC 07F1 CPC R31,R17
00AD F021 BEQ 0x00B2
00AE 95C8 LPM
00AF 9631 ADIW R30,1
00B0 920D ST R0,X+
00B1 CFF9 RJMP 0x00AB
00B2 940E0129 CALL _main
_exit:
00B4 CFFF RJMP _exit
FILE: 音乐.c
(0001) /*******************************************************************
(0002) 实验名称:音乐合成演示实验
(0003) 作者:王晓波
(0004) 晶振:内部 8M
(0005) 接线方法:
(0006) 1.PC0和PD7分别接扬声器的两个输入端子。
(0007) 2.PA0-PA3分别接I/O输出的O0-O3。
(0008) 使用说明:
(0009) 1.音乐数据存放于芯片的flash存贮器中。
(0010) 2.PA口显示不同的音阶变化。
(0011) 3.音乐数据的低四位选择音调频率,
(0012) 高四位*5后,为音调持续时间。
(0013) ********************************************************************/
(0014) #include <iom16v.h>
(0015) #include <macros.h>
(0016) #define DO 63622 //523
(0017) #define RE 63831 //587
(0018) #define MI 64017 //659
(0019) #define FA 64102 //698
(0020) #define SO 64259 //784
(0021) #define LA 64398 //880
(0022) #define TI 64522 //988
(0023) #define DO_H 64578 //1046
(0024) #define RE_H 64683 //1174
(0025) #define MI_H 64776 //1318
(0026) #define FA_H 64819 //1397
(0027) #define SO_H 64897 //1568
(0028) #define LA_H 64966 //1760
(0029) #define TI_H 65028 //1976
(0030) #define DO_HH 65057 //2093
(0031) void delay_us(int time)
(0032) {//微秒级延时程序
(0033) do
(0034) {
(0035) time--;
_delay_us:
time --> R16
00B5 5001 SUBI R16,1
00B6 4010 SBCI R17,0
(0036) }
(0037) while (time>1);
00B7 E081 LDI R24,1
00B8 E090 LDI R25,0
00B9 1780 CP R24,R16
00BA 0791 CPC R25,R17
00BB F3CC BLT 0x00B5
00BC 9508 RET
_delay_ms:
time --> R20
00BD 940E0140 CALL push_gset1
00BF 01A8 MOVW R20,R16
(0038) }
(0039) void delay_ms(unsigned int time)
(0040) {//毫秒级延时程序
00C0 C005 RJMP 0x00C6
(0041) while (time!=0)
(0042) {
(0043) delay_us(1000);
00C1 EE08 LDI R16,0xE8
00C2 E013 LDI R17,3
00C3 DFF1 RCALL _delay_us
(0044) time--;
00C4 5041 SUBI R20,1
00C5 4050 SBCI R21,0
00C6 3040 CPI R20,0
00C7 0745 CPC R20,R21
00C8 F7C1 BNE 0x00C1
00C9 940E0143 CALL pop_gset1
00CB 9508 RET
_timer1_ovf_isr:
00CC 922A ST R2,-Y
00CD 923A ST R3,-Y
00CE 938A ST R24,-Y
00CF B62F IN R2,0x3F
00D0 922A ST R2,-Y
(0045) }
(0046) }
(0047) const unsigned char sound[]={ //乐曲数据表
(0048) /*************梁祝****************/
(0049) 0x40,0x4c,0x4a,0x49,0xc8,0x49,0x47,0x46,
(0050) 0xe5,0x4e,0x4d,0x4e,0x6c,0x2d,0x4e,
(0051) 0x4d,0x2c,0x2d,0x2e,0x2d,0x6f,0x2d,
(0052) 0x2c,0x2d,0x2c,0x29,0x2a,0x2b,
(0053) 0x2a,0x29,0xc8,0x4c,0x4e,0x49,0x46,0x48,
(0054) 0xc5,0x26,0x28,0xe5,0x83,0x65,0x26,
(0055) 0x68,0x29,0x26,0x28,0x45,0x6c,0x2f,0x3d,
(0056) 0x1c,0x2a,0x2c,0xe9,0x69,0x2a,0x47,0x46,
(0057) 0x65,0x26,0x48,0x49,0x43,0x48,0x36,0x15,
(0058) 0x26,0x18,0xe5,0x6a,0x2c,0x47,0x49,0x26,
(0059) 0x28,0x85,0x33,0x15,0x43,0x25,0x26,0x27,
(0060) 0x29,0xc6,0x25,0x26,0x68,0x29,0x4c,0x4a,
(0061) 0x49,0x2a,0x29,0x49,0x26,0x25,0x83,0x88,
(0062) 0x26,0x28,0x26,0x25,0x23,0x25,0x26,0x28,
(0063) 0xc5,0x04,0x04,
(0064) /*************希望*****************/
(0065) 0x49,0x4a,0x4a,0x6a,0x29,0x48,0x46,0x68,
(0066) 0x29,0xc8,0x49,0x4a,0x4a,0x6a,0x2c,0x4a,
(0067) 0x4a,0x49,0x4a,0xca,0x4c,0x4d,0x4d,0x6d,
(0068) 0x2c,0x4a,0x4a,0x4c,0x4d,0xcc,0x49,0x4a,
(0069) 0x4a,0x69,0x2a,0x4a,0x49,0x4a,0x46,
(0070) 0x18,0xe6,0x29,0x29,0x29,0x28,0x46,
(0071) 0x29,0x29,0x29,0x28,0x46,0x49,0x4a,
(0072) 0x48,0x69,0x2a,0x4c,0x2d,0x2d,0x2d,
(0073) 0x2c,0x4a,0x29,0x29,0x29,0x28,0x46,
(0074) 0x46,0x45,0x46,0xe6,
(0075) 0x00};
(0076) /* 音阶表 */
(0077) const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
(0078) RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
(0079)
(0080) /* 音阶重装常数 */
(0081) unsigned int toneconst;
(0082) #pragma interrupt_handler timer1_ovf_isr:9
(0083) void timer1_ovf_isr(void)
(0084) {
(0085) TCNT1=toneconst;
00D1 90200060 LDS R2,toneconst
00D3 90300061 LDS R3,toneconst+1
00D5 BC3D OUT 0x2D,R3
00D6 BC2C OUT 0x2C,R2
(0086) PORTC^=1;
00D7 E081 LDI R24,1
00D8 B225 IN R2,0x15
00D9 2628 EOR R2,R24
00DA BA25 OUT 0x15,R2
00DB 9029 LD R2,Y+
00DC BE2F OUT 0x3F,R2
00DD 9189 LD R24,Y+
00DE 9039 LD R3,Y+
00DF 9029 LD R2,Y+
00E0 9518 RETI
_music:
sound_add --> R20
temp1 --> R22
temp --> R10
00E1 940E013C CALL push_gset3
(0087) }
(0088) void music(void)
(0089) {
(0090) unsigned char temp=0,temp1=0;
00E3 24AA CLR R10
00E4 2766 CLR R22
(0091) unsigned int sound_add=0;
00E5 2744 CLR R20
00E6 2755 CLR R21
(0092) TCCR1A = 0x00;
00E7 2422 CLR R2
00E8 BC2F OUT 0x2F,R2
(0093) TCCR1B =(1<<CS11);//8分频
00E9 E082 LDI R24,2
00EA BD8E OUT 0x2E,R24
(0094) temp1=sound[sound_add];
00EB E584 LDI R24,0x54
00EC E090 LDI R25,0
00ED 01FA MOVW R30,R20
00EE 0FE8 ADD R30,R24
00EF 1FF9 ADC R31,R25
00F0 9164 LPM R22,0(Z)
00F1 C030 RJMP 0x0122
(0095)
(0096) while(temp1!=0)
(0097) {
(0098) temp=temp1;
00F2 2EA6 MOV R10,R22
(0099) temp&=0x0f;
00F3 2D8A MOV R24,R10
00F4 708F ANDI R24,0xF
00F5 2EA8 MOV R10,R24
(0100) if(temp!=0)
00F6 2388 TST R24
00F7 F0A9 BEQ 0x010D
(0101) {
(0102) TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
00F8 B789 IN R24,0x39
00F9 6084 ORI R24,4
00FA BF89 OUT 0x39,R24
(0103) temp--;
00FB 94AA DEC R10
(0104) toneconst=TONETABLE[temp];
00FC E082 LDI R24,2
00FD 9D8A MUL R24,R10
00FE 01F0 MOVW R30,R0
00FF E08A LDI R24,0xA
0100 E091 LDI R25,1
0101 0FE8 ADD R30,R24
0102 1FF9 ADC R31,R25
0103 9005 LPM R0,Z+
0104 9014 LPM R1,0(Z)
0105 01F0 MOVW R30,R0
0106 93F00061 STS toneconst+1,R31
0108 93E00060 STS toneconst,R30
(0105) TCNT1=toneconst;
010A BDFD OUT 0x2D,R31
010B BDEC OUT 0x2C,R30
(0106) PORTA=toneconst;
010C BBEB OUT 0x1B,R30
(0107) }
(0108) temp=temp1;
010D 2EA6 MOV R10,R22
(0109) temp>>=4;
010E 2D8A MOV R24,R10
010F 9582 SWAP R24
0110 708F ANDI R24,0xF
(0110) temp&=0x0f;
0111 708F ANDI R24,0xF
0112 2EA8 MOV R10,R24
(0111) delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
0113 E881 LDI R24,0x81
0114 9D8A MUL R24,R10
0115 0180 MOVW R16,R0
0116 DFA6 RCALL _delay_ms
(0112) TIMSK&=~(1<<TOIE1);
0117 B789 IN R24,0x39
0118 7F8B ANDI R24,0xFB
0119 BF89 OUT 0x39,R24
(0113) sound_add++;
011A 5F4F SUBI R20,0xFF
011B 4F5F SBCI R21,0xFF
(0114) temp1=sound[sound_add];
011C E584 LDI R24,0x54
011D E090 LDI R25,0
011E 01FA MOVW R30,R20
011F 0FE8 ADD R30,R24
0120 1FF9 ADC R31,R25
0121 9164 LPM R22,0(Z)
0122 2366 TST R22
0123 F671 BNE 0x00F2
(0115)
(0116) }
(0117) PORTC = 0xFF;
0124 EF8F LDI R24,0xFF
0125 BB85 OUT 0x15,R24
0126 940E0135 CALL pop_gset3
0128 9508 RET
(0118) }
(0119) /* 主程序 */
(0120) void main(void)
(0121) {
(0122)
(0123) DDRC=0x01;
_main:
0129 E081 LDI R24,1
012A BB84 OUT 0x14,R24
(0124) DDRD=0x80;
012B E880 LDI R24,0x80
012C BB81 OUT 0x11,R24
(0125) DDRA=0x0f;
012D E08F LDI R24,0xF
012E BB8A OUT 0x1A,R24
(0126) SREG=0x80;
012F E880 LDI R24,0x80
0130 BF8F OUT 0x3F,R24
0131 C001 RJMP 0x0133
(0127) while(1)
(0128) {
(0129) music();
FILE: <library>
0132 DFAE RCALL _music
0133 CFFE RJMP 0x0132
0134 9508 RET
pop_gset3:
0135 E0E4 LDI R30,4
0136 940C0144 JMP pop
push_gset5:
0138 92FA ST R15,-Y
0139 92EA ST R14,-Y
push_gset4:
013A 92DA ST R13,-Y
013B 92CA ST R12,-Y
push_gset3:
013C 92BA ST R11,-Y
013D 92AA ST R10,-Y
push_gset2:
013E 937A ST R23,-Y
013F 936A ST R22,-Y
push_gset1:
0140 935A ST R21,-Y
0141 934A ST R20,-Y
0142 9508 RET
pop_gset1:
0143 E0E1 LDI R30,1
pop:
0144 9149 LD R20,Y+
0145 9159 LD R21,Y+
0146 FDE0 SBRC R30,0
0147 9508 RET
0148 9169 LD R22,Y+
0149 9179 LD R23,Y+
014A FDE1 SBRC R30,1
014B 9508 RET
014C 90A9 LD R10,Y+
014D 90B9 LD R11,Y+
014E FDE2 SBRC R30,2
014F 9508 RET
0150 90C9 LD R12,Y+
0151 90D9 LD R13,Y+
0152 FDE3 SBRC R30,3
0153 9508 RET
0154 90E9 LD R14,Y+
0155 90F9 LD R15,Y+
0156 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -