⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.lst

📁 这是用atmega16芯片的一个音乐程序
💻 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 + -