text1.lst

来自「AVR单片机应用开发指南及实例,包含许多实例,挺不错」· LST 代码 · 共 1,351 行 · 第 1/3 页

LST
1,351
字号
_mic_startup:
  mic_in               --> R16
    016C C004      RJMP	0x0171
(0236)  unsigned char mic_in;
(0237)  while(1)//等待PB2按键按下	
(0238)    {	  //无键按下等待
(0239)     mic_in=PINB & 0x04;     //pb2=0
    016D B306      IN	R16,0x16
    016E 7004      ANDI	R16,4
(0240)     if(mic_in==0){break;}
    016F F409      BNE	0x0171
    0170 C001      RJMP	0x0172
    0171 CFFB      RJMP	0x016D
    0172 9508      RET
(0241)    }//有键按下运行下面的程序
(0242) }
(0243) 
(0244) //                #       
(0245) //                #
(0246) //                #
(0247) //                #
(0248) //                #    //  delay_time1  转弯时间
(0249) //        # # # # #    //  delay_time2  直行时间
(0250) //      # X       #    //<A>  0x40  delay_time2-50
(0251) //      #   B  C  #    //<B>  0x20  delay_time1+50
(0252) //      #  D  A   #    //<C>  0x80  delay_time1-50
(0253) //      #         #    //<D>  0x10  delay_time2+50
(0254) //        # # # #      // max: 2000   min: 200 
(0255) 
(0256) unsigned int delay_time1,delay_time2;
(0257) 
(0258) void remote_auto_time()
(0259) {
(0260)  unsigned char remote_in;
(0261)  	  remote_in = PINB & 0xF0;
_remote_auto_time:
  remote_in            --> R16
    0173 B306      IN	R16,0x16
    0174 7F00      ANDI	R16,0xF0
(0262)       switch (remote_in)
    0175 2711      CLR	R17
    0176 3200      CPI	R16,0x20
    0177 E0E0      LDI	R30,0
    0178 071E      CPC	R17,R30
    0179 F119      BEQ	0x019D
    017A E280      LDI	R24,0x20
    017B E090      LDI	R25,0
    017C 1780      CP	R24,R16
    017D 0791      CPC	R25,R17
    017E F07C      BLT	0x018E
    017F 3000      CPI	R16,0
    0180 0701      CPC	R16,R17
    0181 F409      BNE	0x0183
    0182 C06A      RJMP	0x01ED
    0183 3000      CPI	R16,0
    0184 E0E0      LDI	R30,0
    0185 071E      CPC	R17,R30
    0186 F40C      BGE	0x0188
    0187 C065      RJMP	0x01ED
    0188 3100      CPI	R16,0x10
    0189 E0E0      LDI	R30,0
    018A 071E      CPC	R17,R30
    018B F409      BNE	0x018D
    018C C039      RJMP	0x01C6
    018D C05F      RJMP	0x01ED
    018E 3400      CPI	R16,0x40
    018F E0E0      LDI	R30,0
    0190 071E      CPC	R17,R30
    0191 F101      BEQ	0x01B2
    0192 3400      CPI	R16,0x40
    0193 E0E0      LDI	R30,0
    0194 071E      CPC	R17,R30
    0195 F40C      BGE	0x0197
    0196 C056      RJMP	0x01ED
    0197 3800      CPI	R16,0x80
    0198 E0E0      LDI	R30,0
    0199 071E      CPC	R17,R30
    019A F409      BNE	0x019C
    019B C03E      RJMP	0x01DA
    019C C050      RJMP	0x01ED
(0263)       	{//检测遥控器是否有键按下
(0264)       case 0x20:  // < A >
(0265) 		 delay_time2 = delay_time2 - 50;
    019D 91800063  LDS	R24,delay_time2
    019F 91900064  LDS	R25,delay_time2+1
    01A1 97C2      SBIW	R24,0x32
    01A2 93900064  STS	delay_time2+1,R25
    01A4 93800063  STS	delay_time2,R24
(0266) 	     if(delay_time2 == 50)
    01A6 3382      CPI	R24,0x32
    01A7 E0E0      LDI	R30,0
    01A8 079E      CPC	R25,R30
    01A9 F009      BEQ	0x01AB
    01AA C042      RJMP	0x01ED
(0267) 		   {delay_time2 = 100;}	 
    01AB E684      LDI	R24,0x64
    01AC E090      LDI	R25,0
    01AD 93900064  STS	delay_time2+1,R25
    01AF 93800063  STS	delay_time2,R24
(0268)       	break;
    01B1 C03B      RJMP	0x01ED
(0269)       case 0x40:  // < B >
(0270) 		 delay_time1 = delay_time1 + 50;
    01B2 91800065  LDS	R24,delay_time1
    01B4 91900066  LDS	R25,delay_time1+1
    01B6 96C2      ADIW	R24,0x32
    01B7 93900066  STS	delay_time1+1,R25
    01B9 93800065  STS	delay_time1,R24
(0271) 	     if(delay_time1 == 2050)
    01BB 3082      CPI	R24,2
    01BC E0E8      LDI	R30,0x8
    01BD 079E      CPC	R25,R30
    01BE F571      BNE	0x01ED
(0272) 		   {delay_time1 = 2000;}	 
    01BF ED80      LDI	R24,0xD0
    01C0 E097      LDI	R25,7
    01C1 93900066  STS	delay_time1+1,R25
    01C3 93800065  STS	delay_time1,R24
(0273)       	break;
    01C5 C027      RJMP	0x01ED
(0274)       case 0x10:  // < C >
(0275) 		 delay_time1 = delay_time1 - 50;
    01C6 91800065  LDS	R24,delay_time1
    01C8 91900066  LDS	R25,delay_time1+1
    01CA 97C2      SBIW	R24,0x32
    01CB 93900066  STS	delay_time1+1,R25
    01CD 93800065  STS	delay_time1,R24
(0276) 	     if(delay_time1 == 50)
    01CF 3382      CPI	R24,0x32
    01D0 E0E0      LDI	R30,0
    01D1 079E      CPC	R25,R30
    01D2 F4D1      BNE	0x01ED
(0277) 		   {delay_time1 = 100;}	 
    01D3 E684      LDI	R24,0x64
    01D4 E090      LDI	R25,0
    01D5 93900066  STS	delay_time1+1,R25
    01D7 93800065  STS	delay_time1,R24
(0278)       	break;
    01D9 C013      RJMP	0x01ED
(0279)       case 0x80:  // < D >
(0280)          delay_time2 = delay_time2 + 50;
    01DA 91800063  LDS	R24,delay_time2
    01DC 91900064  LDS	R25,delay_time2+1
    01DE 96C2      ADIW	R24,0x32
    01DF 93900064  STS	delay_time2+1,R25
    01E1 93800063  STS	delay_time2,R24
(0281) 	     if(delay_time2 == 2050)
    01E3 3082      CPI	R24,2
    01E4 E0E8      LDI	R30,0x8
    01E5 079E      CPC	R25,R30
    01E6 F431      BNE	0x01ED
(0282) 		   {delay_time2 = 2000;}	 
    01E7 ED80      LDI	R24,0xD0
    01E8 E097      LDI	R25,7
    01E9 93900064  STS	delay_time2+1,R25
    01EB 93800063  STS	delay_time2,R24
(0283)       	break;
(0284)       case 0x00:  // 无按键
(0285) 	     break;
    01ED 9508      RET
FILE: D:\afish\工作内容\DIY-08-16\M16\DIY-08-16\遥控音乐车\music.c
(0001) /*******************************************
(0002)            广州双龙电子           
(0003)                www.sl.com.cn  
(0004)  
(0005)    Chip type       : ATMEGA16  
(0006)    Clock frequency : 8MHz
(0007)                 
(0008) /**************************************************************    
(0009)  声控启动,分别按下A,B,C,D键,小车
(0010) 	  作前进,后退,左右转弯动作并演奏不同乐曲
(0011) 演奏过程中若有键按下,则即时切换到相应状态
(0012) ********************************************/
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015) #include <diy0206.c>
(0016) #pragma interrupt_handler timer0:10
(0017) #pragma interrupt_handler timer1:7
(0018) unsigned char remote_in;
(0019) const unsigned int music_data[][2]=
(0020) /*******************************************
(0021)        卡秋莎音乐数据{x,y}
(0022) 	   x:对应音符音阶(频率),0表示休止符
(0023) 	   y:对应音符节拍
(0024) ********************************************/
(0025) {
(0026) {440,600},{494,200},{523,600} ,{440,200},
(0027) {523,400},{494,200},{440,200} ,{494,400},
(0028) {330,400},{494,600},{523,200} ,{578,600},
(0029) {494,200},{578,400},{523,200} ,{0,0},
(0030) {494,200},{440,800},{659,400} ,{880,400},
(0031) {784,400},{880,200},{784,200} ,{698,400},
(0032) {659,200},{578,200},{659,400} ,{440,400},
(0033) {698,400},{578,200},{659,600} ,{0,0},
(0034) {523,200},{494,200},{330,200} ,{523,200},
(0035) {494,200},{440,800},{659,400} ,{880,400},
(0036) {784,400},{880,200},{784,200} ,{0,0},
(0037) {698,400},{659,200},{578,200} ,{659,400} ,
(0038) {440,400},{698,400},{578,200} , {659,600},
(0039) {523,200},{494,200},{330,200} , {523,200},
(0040) {494,200},{440,800},{0,0}};
(0041) #pragma data:data
(0042) unsigned int delay=0;
(0043) /*******************************
(0044)        MCU初始化
(0045) *******************************/
(0046) void music_init(void)
(0047)  {
(0048)   MCUCR=0x00;//低电平时产生中断
_music_init:
    01EE 2422      CLR	R2
    01EF BE25      OUT	0x35,R2
(0049)   DDRC=0x01;
    01F0 E081      LDI	R24,1
    01F1 BB84      OUT	0x14,R24
(0050)   TCCR1A=0x00;
    01F2 BC2F      OUT	0x2F,R2
(0051)   TCCR1B=0x09;//TIMER1无预分频
    01F3 E089      LDI	R24,0x9
    01F4 BD8E      OUT	0x2E,R24
(0052)   TCCR0=0x03;//CK/64
    01F5 E083      LDI	R24,3
    01F6 BF83      OUT	0x33,R24
(0053)   TCNT0=0x19;
    01F7 E189      LDI	R24,0x19
    01F8 BF82      OUT	0x32,R24
(0054)   TIMSK=(1<<OCIE1A)|(1<<TOIE0);
    01F9 E181      LDI	R24,0x11
    01FA BF89      OUT	0x39,R24
    01FB 9508      RET
_timer0:
    01FC 938A      ST	R24,-Y
    01FD 939A      ST	R25,-Y
    01FE B78F      IN	R24,0x3F
    01FF 938A      ST	R24,-Y
(0055)   }
(0056) /**************************************************
(0057)       T0中断程序,产生音乐节拍
(0058) **************************************************/  
(0059) void timer0(void) 
(0060)     {
(0061)      delay++;
    0200 91800060  LDS	R24,delay
    0202 91900061  LDS	R25,delay+1
    0204 9601      ADIW	R24,1
    0205 93900061  STS	delay+1,R25
    0207 93800060  STS	delay,R24
(0062)      TCNT0=0x19;
    0209 E189      LDI	R24,0x19
    020A BF82      OUT	0x32,R24
    020B 9189      LD	R24,Y+
    020C BF8F      OUT	0x3F,R24
    020D 9199      LD	R25,Y+
    020E 9189      LD	R24,Y+
    020F 9518      RETI
_timer1:
    0210 922A      ST	R2,-Y
    0211 938A      ST	R24,-Y
    0212 B62F      IN	R2,0x3F
    0213 922A      ST	R2,-Y
(0063)     }
(0064) /**************************************************
(0065)       T1中断程序,根据SOUND函数输出一定频率的方波
(0066) **************************************************/  
(0067) void timer1(void) 
(0068)     {
(0069)      PORTC^=0x01;
    0214 E081      LDI	R24,1
    0215 B225      IN	R2,0x15
    0216 2628      EOR	R2,R24
    0217 BA25      OUT	0x15,R2
    0218 9029      LD	R2,Y+
    0219 BE2F      OUT	0x3F,R2
    021A 9189      LD	R24,Y+
    021B 9029      LD	R2,Y+
    021C 9518      RETI
_sound:
  y                    --> R10
  x                    --> R12
    021D 940E03DC  CALL	push_gset4
    021F 0159      MOVW	R10,R18
    0220 0168      MOVW	R12,R16
(0070)     }
(0071) /*****************************************************
(0072)       SOUND程序,输出频率为 x HZ的方波,延时 y MS
(0073)        x:100~20000 HZ, 0表示不发声
(0074)        y:0~65536 MS
(0075) *****************************************************/     
(0076) void sound(unsigned int x,unsigned int y)
(0077)     {
(0078)        SEI(); //开总中断
    0221 9478      BSET	7
(0079)        delay=0; 
    0222 2422      CLR	R2
    0223 2433      CLR	R3
    0224 92300061  STS	delay+1,R3
    0226 92200060  STS	delay,R2
(0080)        if (x!=0)//不是休止符
    0228 20CC      TST	R12
    0229 F411      BNE	0x022C
    022A 20DD      TST	R13
    022B F121      BEQ	0x0250
(0081)         {         
(0082)          x=4000000/x; //计算发声频率
    022C 0116      MOVW	R2,R12
    022D 2444      CLR	R4
    022E 2455      CLR	R5
    022F E040      LDI	R20,0
    0230 E059      LDI	R21,0x9
    0231 E36D      LDI	R22,0x3D
    0232 E070      LDI	R23,0
    0233 925A      ST	R5,-Y
    0234 924A      ST	R4,-Y
    0235 923A      ST	R3,-Y
    0236 922A      ST	R2,-Y
    0237 018A      MOVW	R16,R20
    0238 019B      MOVW	R18,R22
    0239 940E0369  CALL	div32s
    023B 0168      MOVW	R12,R16
(0083)          OCR1A=x;   //放入输出比较寄存器
    023C BD1B      OUT	0x2B,R17
    023D BD0A      OUT	0x2A,R16
(0084)          TCNT1=0x00;
    023E 2422      CLR	R2
    023F 2433      CLR	R3
    0240 BC3D      OUT	0x2D,R3
    0241 BC2C      OUT	0x2C,R2
(0085)          TIMSK|=(1<<OCIE1A);   //T/C1输出比较匹配中断使能  
    0242 B789      IN	R24,0x39
    0243 6180      ORI	R24,0x10
    0244 BF89      OUT	0x39,R24
(0086)           while(delay<y)
    0245 90200060  LDS	R2,delay
    0247 90300061  LDS	R3,delay+1
    0249 142A      CP	R2,R10
    024A 043B      CPC	R3,R11
    024B F3C8      BCS	0x0245
(0087)           ;
(0088)           TIMSK&=~(1<<OCIE1A);    
    024C B789      IN	R24,0x39
    024D 7E8F      ANDI	R24,0xEF
    024E BF89      OUT	0x39,R24
(0089)          }
    024F C00A      RJMP	0x025A
(0090)       else
(0091)          {
(0092)           TIMSK&=~(1<<OCIE1A);
    0250 B789      IN	R24,0x39
    0251 7E8F      ANDI	R24,0xEF
    0252 BF89      OUT	0x39,R24
(0093)           while(delay<y)
    0253 90200060  LDS	R2,delay
    0255 90300061  LDS	R3,delay+1
    0257 142A      CP	R2,R10
    0258 043B      CPC	R3,R11
    0259 F3C8      BCS	0x0253
(0094)           ;
(0095)           }
(0096)       CLI(); 
    025A 94F8      BCLR	7
    025B 940E03D7  CALL	pop_gset4
    025D 9508      RET
_play_1:
  i                    --> R20
    025E 940E03E2  CALL	push_gset1
(0097)              
(0098)     }
(0099)  
(0100) void play_1(void)
(0101)   {
(0102)    unsigned char i=0;
    0260 2744      CLR	R20
(0103)    music_init();  //MCU初始化
    0261 DF8C      RCALL	_music_init
    0262 C01A      RJMP	0x027D
(0104)    
(0105)        while(music_data[i][1]!=0)//是否终止
(0106)            {
(0107)             sound(music_data[i][0],music_data[i][1]);
    0263 E084      LDI	R24,4
    0264 9F84      MUL	R24,R20
    0265 0110      MOVW	R2,R0
    0266 E586      LDI	R24,0x56
    0267 E090      LDI	R25,0
    0268 01F1      MOVW	R30,R2
    0269 0FE8      ADD	R30,R24
    026A 1FF9      ADC	R31,R25
    026B 9125      LPM	R18,Z+
    026C 9134      LPM	R19,0(Z)
    026D E584      LDI	R24,0x54
    026E E090      LDI	R25,0
    026F 01F1      MOVW	R30,R2
    0270 0FE8      ADD	R30,R24
    0271 1FF9      ADC	R31,R25
    0272 9105      LPM	R16,Z+
    0273 9114      LPM	R17,0(Z)
    0274 DFA8      RCALL	_sound
(0108)             i++;
    0275 9543      INC	R20
(0109) 			remote_in = PINB & 0xF0;      //再检测,若有键按下,中断播放并返回
    0276 B386      IN	R24,0x16
    0277 7F80      ANDI	R24,0xF0
    0278 93800062  STS	remote_in,R24
(0110) 			if(remote_in!=0)
    027A 2388      TST	R24
    027B F009      BEQ	0x027D
(0111) 			return;
    027C C00E      RJMP	0x028B
    027D E084      LDI	R24,4
    027E 9F84      MUL	R24,R20
    027F 01F0      MOVW	R30,R0
    0280 E586      LDI	R24,0x56
    0281 E090      LDI	R25,0
    0282 0FE8      ADD	R30,R24
    0283 1FF9      ADC	R31,R25
    0284 9005      LPM	R0,Z+
    0285 9014      LPM	R1,0(Z)
    0286 01F0      MOVW	R30,R0
    0287 30E0      CPI	R30,0
    0288 07EF      CPC	R30,R31
    0289 F6C9      BNE	0x0263
(0112)             }
(0113)        i=0;     
    028A 2744      CLR	R20
    028B 940E03E5  CALL	pop_gset1
    028D 9508      RET
_play_2:
  i                    --> R20
    028E 940E03E2  CALL	push_gset1
(0114)        
(0115)    }
(0116)    
(0117)    void play_2(void)
(0118)   {
(0119)    unsigned char i=17;
    0290 E141      LDI	R20,0x11
(0120)    music_init();  //MCU初始化
    0291 DF5C      RCALL	_music_init
    0292 C01A      RJMP	0x02AD
(0121)    
(0122)        while(music_data[i][1]!=0)//是否终止
(0123)            {
(0124)             sound(music_data[i][0],music_data[i][1]);
    0293 E084      LDI	R24,4
    0294 9F84      MUL	R24,R20
    0295 0110      MOVW	R2,R0
    0296 E586      LDI	R24,0x56
    0297 E090      LDI	R25,0
    0298 01F1      MOVW	R30,R2
    0299 0FE8      ADD	R30,R24
    029A 1FF9      ADC	R31,R25

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?