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 + -
显示快捷键?