📄 音乐.lst
字号:
__text_start:
__start:
00C4 E5CF LDI R28,0x5F
00C5 E0D4 LDI R29,4
00C6 BFCD OUT 0x3D,R28
00C7 BFDE OUT 0x3E,R29
00C8 51C0 SUBI R28,0x10
00C9 40D0 SBCI R29,0
00CA EA0A LDI R16,0xAA
00CB 8308 STD Y+0,R16
00CC 2400 CLR R0
00CD E6E0 LDI R30,0x60
00CE E0F0 LDI R31,0
00CF E010 LDI R17,0
00D0 36E2 CPI R30,0x62
00D1 07F1 CPC R31,R17
00D2 F011 BEQ 0x00D5
00D3 9201 ST R0,Z+
00D4 CFFB RJMP 0x00D0
00D5 8300 STD Z+0,R16
00D6 E8E8 LDI R30,0x88
00D7 E0F1 LDI R31,1
00D8 E6A0 LDI R26,0x60
00D9 E0B0 LDI R27,0
00DA E011 LDI R17,1
00DB 38E8 CPI R30,0x88
00DC 07F1 CPC R31,R17
00DD F021 BEQ 0x00E2
00DE 95C8 LPM
00DF 9631 ADIW R30,1
00E0 920D ST R0,X+
00E1 CFF9 RJMP 0x00DB
00E2 940E0177 CALL _main
_exit:
00E4 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\音乐\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
00E5 C002 RJMP 0x00E8
(0010) while(time>1)
(0011) time--;
00E6 5001 SUBI R16,1
00E7 4010 SBCI R17,0
00E8 E081 LDI R24,1
00E9 E090 LDI R25,0
00EA 1780 CP R24,R16
00EB 0791 CPC R25,R17
00EC F3C8 BCS 0x00E6
00ED 9508 RET
_DelayMS:
i --> R20
time --> R16
00EE 940E0187 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
00F0 C009 RJMP 0x00FA
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
00F1 E041 LDI R20,1
00F2 E050 LDI R21,0
00F3 C002 RJMP 0x00F6
00F4 5F4F SUBI R20,0xFF
00F5 4F5F SBCI R21,0xFF
00F6 3746 CPI R20,0x76
00F7 E0E4 LDI R30,4
00F8 075E CPC R21,R30
00F9 F3D0 BCS 0x00F4
00FA 0118 MOVW R2,R16
00FB 5001 SUBI R16,1
00FC 4010 SBCI R17,0
00FD 2022 TST R2
00FE F791 BNE 0x00F1
00FF 2033 TST R3
0100 F781 BNE 0x00F1
0101 940E018A CALL pop_gset1
0103 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\音乐\音乐.c
(0001) //内部晶振 8M
(0002) #include <iom16v.h>
(0003) #include <macros.h>
(0004) #include"delay.h"
(0005)
(0006) /*------宏定义------*/
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) #define DO 64580 //523
(0010) #define RE 64684 //587
(0011) #define MI 64777 //659
(0012) #define FA 64820 //698
(0013) #define SO 64898 //784
(0014) #define LA 64968 //880
(0015) #define XI 65030 //988
(0016) #define DO_H 65058 //1046
(0017) #define RE_H 65110 //1174
(0018) #define MI_H 65157 //1318
(0019) #define FA_H 65178 //1397
(0020) #define SO_H 65217 //1568
(0021) #define LA_H 65252 //1760
(0022) #define XI_H 65283 //1976
(0023) #define DO_HH 65297 //2093
(0024)
(0025) const unsigned char sound[]={ //乐曲数据表
(0026) /****************两只老虎**********************/
(0027) 0x48,0x49,0x4a,0x48,0x48,0x49,0x4a,0x48,0x4a,0x4b,0x8c,
(0028) 0x4a,0x4b,0x8c,0x2c,0x2d,0x2c,0x2b,0x4a,0x48,
(0029) 0x2c,0x2d,0x2c,0x2b,0x4a,0x48,0x48,0x45,0x88,0x48,0x45,0x88,
(0030) /*************梁祝****************/
(0031) 0x40,0x4c,0x4a,0x49,0xc8,0x49,0x47,0x46,
(0032) 0xe5,0x4e,0x4d,0x4e,0x6c,0x2d,0x4e,
(0033) 0x4d,0x2c,0x2d,0x2e,0x2d,0x6f,0x2d,
(0034) 0x2c,0x2d,0x2c,0x29,0x2a,0x2b,
(0035) 0x2a,0x29,0xc8,0x4c,0x4e,0x49,0x46,0x48,
(0036) 0xc5,0x26,0x28,0xe5,0x83,0x65,0x26,
(0037) 0x68,0x29,0x26,0x28,0x45,0x6c,0x2f,0x3d,
(0038) 0x1c,0x2a,0x2c,0xe9,0x69,0x2a,0x47,0x46,
(0039) 0x65,0x26,0x48,0x49,0x43,0x48,0x36,0x15,
(0040) 0x26,0x18,0xe5,0x6a,0x2c,0x47,0x49,0x26,
(0041) 0x28,0x85,0x33,0x15,0x43,0x25,0x26,0x27,
(0042) 0x29,0xc6,0x25,0x26,0x68,0x29,0x4c,0x4a,
(0043) 0x49,0x2a,0x29,0x49,0x26,0x25,0x83,0x88,
(0044) 0x26,0x28,0x26,0x25,0x23,0x25,0x26,0x28,
(0045) 0xc5,0x04,0x04,
(0046) /*************希望*****************/
(0047) 0x49,0x4a,0x4a,0x6a,0x29,0x48,0x46,0x68,
(0048) 0x29,0xc8,0x49,0x4a,0x4a,0x6a,0x2c,0x4a,
(0049) 0x4a,0x49,0x4a,0xca,0x4c,0x4d,0x4d,0x6d,
(0050) 0x2c,0x4a,0x4a,0x4c,0x4d,0xcc,0x49,0x4a,
(0051) 0x4a,0x69,0x2a,0x4a,0x49,0x4a,0x46,
(0052) 0x18,0xe6,0x29,0x29,0x29,0x28,0x46,
(0053) 0x29,0x29,0x29,0x28,0x46,0x49,0x4a,
(0054) 0x48,0x69,0x2a,0x4c,0x2d,0x2d,0x2d,
(0055) 0x2c,0x4a,0x29,0x29,0x29,0x28,0x46,
(0056) 0x46,0x45,0x46,0xe6,
(0057) /***************喀秋莎********************/
(0058) 0x66,0x27,0x68,0x26,0x28,0x28,0x27,0x26,0x47,0x43,
(0059) 0x67,0x28,0x69,0x27,0x29,0x29,0x28,0x27,0x46,0x46,
(0060) 0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,0x29,0x4a,
(0061) 0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,0x28,0x27,
(0062) 0x46,0x46,0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,
(0063) 0x29,0x4a,0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,
(0064) 0x28,0x27,0x46,0x46,
(0065)
(0066) 0x00};
(0067) /* 音阶表 */
(0068) const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,XI,DO_H,
(0069) RE_H,MI_H,FA_H,SO_H,LA_H,XI_H,DO_HH};
(0070)
(0071) /* 音阶重装常数 */
(0072) unsigned int toneconst;
(0073) //端口初始化
(0074) void port_init(void)
(0075) {
(0076) PORTA = 0x00;//设置端口方向、数据
_port_init:
0104 2422 CLR R2
0105 BA2B OUT 0x1B,R2
(0077) DDRA = 0x03;
0106 E083 LDI R24,3
0107 BB8A OUT 0x1A,R24
(0078) PORTB = 0x00;
0108 BA28 OUT 0x18,R2
(0079) DDRB = 0x00;
0109 BA27 OUT 0x17,R2
(0080) PORTC = 0x00;
010A BA25 OUT 0x15,R2
(0081) DDRC = 0x00;
010B BA24 OUT 0x14,R2
(0082) PORTD = 0x00;
010C BA22 OUT 0x12,R2
(0083) DDRD = 0x00;
010D BA21 OUT 0x11,R2
010E 9508 RET
(0084) }
(0085)
(0086)
(0087) //定时器T0初始化
(0088) void timer0_init(void)
(0089) {
(0090) TCCR0 = 0x00;//停止定时器
_timer0_init:
010F 2422 CLR R2
0110 BE23 OUT 0x33,R2
(0091) TCNT0 = 0xFF;//初始值
0111 EF8F LDI R24,0xFF
0112 BF82 OUT 0x32,R24
(0092) OCR0 = 0xFE;//匹配值
0113 EF8E LDI R24,0xFE
0114 BF8C OUT 0x3C,R24
(0093) TIMSK |= 0x00;//溢出中断不允许
0115 B629 IN R2,0x39
0116 BE29 OUT 0x39,R2
(0094) TCCR0 = 0x02;//启动定时器
0117 E082 LDI R24,2
0118 BF83 OUT 0x33,R24
0119 9508 RET
(0095) }
(0096)
(0097) void init_devices(void)
(0098) {
(0099) CLI(); //禁止所有中断
_init_devices:
011A 94F8 BCLR 7
(0100) MCUCR = 0x00;//外部中断触发方式
011B 2422 CLR R2
011C BE25 OUT 0x35,R2
(0101) MCUCSR = 0x80;//禁止JTAG
011D E880 LDI R24,0x80
011E BF84 OUT 0x34,R24
(0102) GICR = 0x00;//外部中断使能
011F BE2B OUT 0x3B,R2
(0103) port_init();
0120 DFE3 RCALL _port_init
(0104) timer0_init();
0121 DFED RCALL _timer0_init
(0105) SEI();//开全局中断
0122 9478 BSET 7
0123 9508 RET
_timer0_ovf_isr:
0124 922A ST R2,-Y
0125 923A ST R3,-Y
0126 938A ST R24,-Y
0127 B62F IN R2,0x3F
0128 922A ST R2,-Y
(0106) }
(0107) //T0溢出中断服务程序
(0108) #pragma interrupt_handler timer0_ovf_isr:10
(0109) void timer0_ovf_isr(void)
(0110) {
(0111) TCNT0=toneconst;
0129 90200060 LDS R2,toneconst
012B 90300061 LDS R3,toneconst+1
012D BE22 OUT 0x32,R2
(0112) PORTA^=BIT(PA0);
012E E081 LDI R24,1
012F B22B IN R2,0x1B
0130 2628 EOR R2,R24
0131 BA2B OUT 0x1B,R2
0132 9029 LD R2,Y+
0133 BE2F OUT 0x3F,R2
0134 9189 LD R24,Y+
0135 9039 LD R3,Y+
0136 9029 LD R2,Y+
0137 9518 RETI
_music:
sound_add --> R20
temp1 --> R22
temp --> R10
0138 940E0183 CALL push_gset3
(0113) }
(0114) void music(void)
(0115) {
(0116) unsigned char temp=0,temp1=0;
013A 24AA CLR R10
013B 2766 CLR R22
(0117) unsigned int sound_add=0;
013C 2744 CLR R20
013D 2755 CLR R21
(0118) temp1=sound[sound_add];
013E E584 LDI R24,0x54
013F E090 LDI R25,0
0140 01FA MOVW R30,R20
0141 0FE8 ADD R30,R24
0142 1FF9 ADC R31,R25
0143 9164 LPM R22,0(Z)
0144 C02D RJMP 0x0172
(0119) while(temp1!=0)
(0120) {
(0121) temp=temp1;
0145 2EA6 MOV R10,R22
(0122) temp&=0x0f;
0146 2D8A MOV R24,R10
0147 708F ANDI R24,0xF
0148 2EA8 MOV R10,R24
(0123) if(temp!=0)
0149 2388 TST R24
014A F099 BEQ 0x015E
(0124) {
(0125) TIMSK|=(1<<TOIE0);//根据SOUNDTABLE中数据的低四位选择音调频率
014B B789 IN R24,0x39
014C 6081 ORI R24,1
014D BF89 OUT 0x39,R24
(0126) temp--;
014E 94AA DEC R10
(0127) toneconst=TONETABLE[temp];
014F E082 LDI R24,2
0150 9D8A MUL R24,R10
0151 01F0 MOVW R30,R0
0152 E68A LDI R24,0x6A
0153 E091 LDI R25,1
0154 0FE8 ADD R30,R24
0155 1FF9 ADC R31,R25
0156 9005 LPM R0,Z+
0157 9014 LPM R1,0(Z)
0158 01F0 MOVW R30,R0
0159 93F00061 STS toneconst+1,R31
015B 93E00060 STS toneconst,R30
(0128) TCNT0=toneconst;
015D BFE2 OUT 0x32,R30
(0129) }
(0130) temp=temp1;
015E 2EA6 MOV R10,R22
(0131) temp>>=4;
015F 2D8A MOV R24,R10
0160 9582 SWAP R24
0161 708F ANDI R24,0xF
(0132) temp&=0x0f;
0162 708F ANDI R24,0xF
0163 2EA8 MOV R10,R24
(0133) DelayMS(temp);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
0164 2F08 MOV R16,R24
0165 2711 CLR R17
0166 DF87 RCALL _DelayMS
(0134) TIMSK&=~(1<<TOIE0);
0167 B789 IN R24,0x39
0168 7F8E ANDI R24,0xFE
0169 BF89 OUT 0x39,R24
(0135) sound_add++;
016A 5F4F SUBI R20,0xFF
016B 4F5F SBCI R21,0xFF
(0136) temp1=sound[sound_add];
016C E584 LDI R24,0x54
016D E090 LDI R25,0
016E 01FA MOVW R30,R20
016F 0FE8 ADD R30,R24
0170 1FF9 ADC R31,R25
0171 9164 LPM R22,0(Z)
0172 2366 TST R22
0173 F689 BNE 0x0145
0174 940E017C CALL pop_gset3
0176 9508 RET
(0137)
(0138) }
(0139) }
(0140)
(0141)
(0142)
(0143)
(0144)
(0145) //主函数
(0146) void main(void)
(0147) {
(0148) init_devices();
_main:
0177 DFA2 RCALL _init_devices
0178 C001 RJMP 0x017A
(0149) //在这继续添加你的代码
(0150) while(1)
(0151) {
(0152) music();
FILE: <library>
0179 DFBE RCALL _music
017A CFFE RJMP 0x0179
017B 9508 RET
pop_gset3:
017C E0E4 LDI R30,4
017D 940C018B JMP pop
push_gset5:
017F 92FA ST R15,-Y
0180 92EA ST R14,-Y
push_gset4:
0181 92DA ST R13,-Y
0182 92CA ST R12,-Y
push_gset3:
0183 92BA ST R11,-Y
0184 92AA ST R10,-Y
push_gset2:
0185 937A ST R23,-Y
0186 936A ST R22,-Y
push_gset1:
0187 935A ST R21,-Y
0188 934A ST R20,-Y
0189 9508 RET
pop_gset1:
018A E0E1 LDI R30,1
pop:
018B 9149 LD R20,Y+
018C 9159 LD R21,Y+
018D FDE0 SBRC R30,0
018E 9508 RET
018F 9169 LD R22,Y+
0190 9179 LD R23,Y+
0191 FDE1 SBRC R30,1
0192 9508 RET
0193 90A9 LD R10,Y+
0194 90B9 LD R11,Y+
0195 FDE2 SBRC R30,2
0196 9508 RET
0197 90C9 LD R12,Y+
0198 90D9 LD R13,Y+
0199 FDE3 SBRC R30,3
019A 9508 RET
019B 90E9 LD R14,Y+
019C 90F9 LD R15,Y+
019D 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -