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

📄 boat.lis

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 026A                   .dbsym r i 22 c
 026A                   .dbend
 026A                   .dbfunc e init_devices _init_devices fV
                        .even
 026A           _init_devices::
 026A                   .dbline -1
 026A                   .dbline 203
 026A           ; 
 026A           ; //call this routine to initialise all peripherals
 026A           ; void init_devices(void)
 026A           ; {
 026A                   .dbline 205
 026A           ;       //stop errant interrupts until set up
 026A           ;       CLI(); //disable all interrupts
 026A F894              cli
 026C                   .dbline 206
 026C           ;       port_init();
 026C 20DF              xcall _port_init
 026E                   .dbline 207
 026E           ;       timer1_init();
 026E 2DDF              xcall _timer1_init
 0270                   .dbline 208
 0270           ;       timer2_init();
 0270 3BDF              xcall _timer2_init
 0272                   .dbline 209
 0272           ;       uart0_init();
 0272 44DF              xcall _uart0_init
 0274                   .dbline 211
 0274           ; 
 0274           ;       MCUCR = 0x00;
 0274 2224              clr R2
 0276 25BE              out 0x35,R2
 0278                   .dbline 212
 0278           ;       GICR  = 0x00;
 0278 2BBE              out 0x3b,R2
 027A                   .dbline 213
 027A           ;       TIMSK = 0x40; //timer interrupt sources
 027A 80E4              ldi R24,64
 027C 89BF              out 0x39,R24
 027E                   .dbline 214
 027E           ;       SEI(); //re-enable interrupts
 027E 7894              sei
 0280                   .dbline -2
 0280                   .dbline 216
 0280           ;       //all peripherals are now initialised
 0280           ; }
 0280           L64:
 0280                   .dbline 0 ; func end
 0280 0895              ret
 0282                   .dbend
 0282                   .dbfunc e pwm_ctrler _pwm_ctrler fV
 0282                   .dbstruct 0 12 _trap
 0282                   .dbfield 0 des_speed I
 0282                   .dbfield 2 real_speed I
 0282                   .dbfield 4 acce_count i
 0282                   .dbfield 6 dece_count i
 0282                   .dbfield 8 counter i
 0282                   .dbfield 10 step I
 0282                   .dbend
 0282           ;           pt_r -> R18,R19
 0282           ;           pt_l -> R16,R17
                        .even
 0282           _pwm_ctrler::
 0282                   .dbline -1
 0282                   .dbline 222
 0282           ; 
 0282           ; /**************************** PWM调速控制模块 ********************************/
 0282           ; 
 0282           ; //PWM控制器,电机控制的底层操作代码
 0282           ; void pwm_ctrler( trap *pt_l, trap *pt_r )
 0282           ; {
 0282                   .dbline 224
 0282           ;       //左电机加减速梯形图控制器
 0282           ;       if ( OCR1A <= pt_l->step )                      //当速度减少到一定值时
 0282 F801              movw R30,R16
 0284 2284              ldd R2,z+10
 0286 3384              ldd R3,z+11
 0288 4AB4              in R4,0x2a
 028A 5BB4              in R5,0x2b
 028C 2414              cp R2,R4
 028E 3504              cpc R3,R5
 0290 08F4              brsh X5
 0292 4FC0              xjmp L66
 0294           X5:
 0294                   .dbline 225
 0294           ;       {
 0294                   .dbline 226
 0294           ;               OCR1A = pt_l->step;                             //保持,高频润滑
 0294 F801              movw R30,R16
 0296 2284              ldd R2,z+10
 0298 3384              ldd R3,z+11
 029A 3BBC              out 0x2b,R3
 029C 2ABC              out 0x2a,R2
 029E                   .dbline 227
 029E           ;               if ( pt_l->des_speed == 0 ){    //当期望值为0时的处理
 029E F801              movw R30,R16
 02A0 2080              ldd R2,z+0
 02A2 3180              ldd R3,z+1
 02A4 2220              tst R2
 02A6 49F4              brne L68
 02A8 3320              tst R3
 02AA 39F4              brne L68
 02AC           X3:
 02AC                   .dbline 227
 02AC                   .dbline 228
 02AC           ;                       pt_l->real_speed = 0;
 02AC 2224              clr R2
 02AE 3324              clr R3
 02B0 F801              movw R30,R16
 02B2 3382              std z+3,R3
 02B4 2282              std z+2,R2
 02B6                   .dbline 229
 02B6           ;                       SET_L_DIR;
 02B6 C09A              sbi 0x18,0
 02B8                   .dbline 230
 02B8 BDC0              xjmp L67
 02BA           L68:
 02BA                   .dbline 230
 02BA           ;               } else{
 02BA                   .dbline 231
 02BA           ;                       if ( pt_l->des_speed > 0 )      SET_L_DIR;
 02BA 2224              clr R2
 02BC 3324              clr R3
 02BE F801              movw R30,R16
 02C0 4080              ldd R4,z+0
 02C2 5180              ldd R5,z+1
 02C4 2414              cp R2,R4
 02C6 3504              cpc R3,R5
 02C8 14F4              brge L70
 02CA                   .dbline 231
 02CA C09A              sbi 0x18,0
 02CC 01C0              xjmp L71
 02CE           L70:
 02CE                   .dbline 232
 02CE           ;                       else    RST_L_DIR;
 02CE C098              cbi 0x18,0
 02D0           L71:
 02D0                   .dbline 233
 02D0           ;                       if ( ++ pt_l->counter >= 400 ){
 02D0 C801              movw R24,R16
 02D2 0896              adiw R24,8
 02D4 FC01              movw R30,R24
 02D6 8081              ldd R24,z+0
 02D8 9181              ldd R25,z+1
 02DA 0196              adiw R24,1
 02DC 2C01              movw R4,R24
 02DE 5182              std z+1,R5
 02E0 4082              std z+0,R4
 02E2 8039              cpi R24,144
 02E4 E1E0              ldi R30,1
 02E6 9E07              cpc R25,R30
 02E8 08F4              brsh X6
 02EA A4C0              xjmp L67
 02EC           X6:
 02EC                   .dbline 233
 02EC                   .dbline 234
 02EC           ;                               DDRD |= BIT(PD5);               //刷新PD5为输出
 02EC 8D9A              sbi 0x11,5
 02EE                   .dbline 235
 02EE           ;                               OCR1A = pt_l->step + 1;
 02EE F801              movw R30,R16
 02F0 8285              ldd R24,z+10
 02F2 9385              ldd R25,z+11
 02F4 0196              adiw R24,1
 02F6 9BBD              out 0x2b,R25
 02F8 8ABD              out 0x2a,R24
 02FA                   .dbline 236
 02FA           ;                               if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A);      //需要强制类型转换吗?
 02FA 2224              clr R2
 02FC 3324              clr R3
 02FE F801              movw R30,R16
 0300 4080              ldd R4,z+0
 0302 5180              ldd R5,z+1
 0304 2414              cp R2,R4
 0306 3504              cpc R3,R5
 0308 2CF4              brge L74
 030A                   .dbline 236
 030A 2AB4              in R2,0x2a
 030C 3BB4              in R3,0x2b
 030E 3382              std z+3,R3
 0310 2282              std z+2,R2
 0312 09C0              xjmp L75
 0314           L74:
 0314                   .dbline 237
 0314           ;                               else pt_l->real_speed = -(int)(OCR1A);
 0314 8AB5              in R24,0x2a
 0316 9BB5              in R25,0x2b
 0318 8095              com R24
 031A 9095              com R25
 031C 8F5F              subi R24,0xFF
 031E 9F4F              sbci R25,0xFF
 0320 F801              movw R30,R16
 0322 9383              std z+3,R25
 0324 8283              std z+2,R24
 0326           L75:
 0326                   .dbline 238
 0326           ;                               pt_l->counter = 0;              //定时计数器清零
 0326 2224              clr R2
 0328 3324              clr R3
 032A F801              movw R30,R16
 032C 3186              std z+9,R3
 032E 2086              std z+8,R2
 0330                   .dbline 239
 0330           ;                       }
 0330                   .dbline 240
 0330           ;               }
 0330                   .dbline 241
 0330 81C0              xjmp L67
 0332           L66:
 0332                   .dbline 241
 0332           ;       } else if ( pt_l->real_speed < pt_l->des_speed ){
 0332 F801              movw R30,R16
 0334 2080              ldd R2,z+0
 0336 3180              ldd R3,z+1
 0338 4280              ldd R4,z+2
 033A 5380              ldd R5,z+3
 033C 4214              cp R4,R2
 033E 5304              cpc R5,R3
 0340 0CF0              brlt X7
 0342 38C0              xjmp L76
 0344           X7:
 0344                   .dbline 241
 0344                   .dbline 242
 0344           ;               if ( ++ pt_l->counter == pt_l->acce_count ){
 0344 C801              movw R24,R16
 0346 0896              adiw R24,8
 0348 FC01              movw R30,R24
 034A 8081              ldd R24,z+0
 034C 9181              ldd R25,z+1
 034E 0196              adiw R24,1
 0350 2C01              movw R4,R24
 0352 5182              std z+1,R5
 0354 4082              std z+0,R4
 0356 F801              movw R30,R16
 0358 2480              ldd R2,z+4
 035A 3580              ldd R3,z+5
 035C 8215              cp R24,R2
 035E 9305              cpc R25,R3
 0360 09F0              breq X8
 0362 68C0              xjmp L77
 0364           X8:
 0364                   .dbline 242
 0364                   .dbline 243
 0364           ;                       pt_l->real_speed += pt_l->step; //加速梯形图
 0364 C801              movw R24,R16
 0366 0296              adiw R24,2
 0368 F801              movw R30,R16
 036A 4284              ldd R4,z+10
 036C 5384              ldd R5,z+11
 036E FC01              movw R30,R24
 0370 6080              ldd R6,z+0
 0372 7180              ldd R7,z+1
 0374 640C              add R6,R4
 0376 751C              adc R7,R5
 0378 7182              std z+1,R7
 037A 6082              std z+0,R6
 037C                   .dbline 244
 037C           ;                       if ( pt_l->real_speed < 0 ){    //取绝对值
 037C F801              movw R30,R16
 037E 8281              ldd R24,z+2
 0380 9381              ldd R25,z+3
 0382 8030              cpi R24,0
 0384 E0E0              ldi R30,0
 0386 9E07              cpc R25,R30
 0388 54F4              brge L80
 038A                   .dbline 244
 038A                   .dbline 245
 038A           ;                               OCR1A = (uint)(-pt_l->real_speed);
 038A F801              movw R30,R16
 038C 8281              ldd R24,z+2
 038E 9381              ldd R25,z+3
 0390 8095              com R24
 0392 9095              com R25
 0394 8F5F              subi R24,0xFF
 0396 9F4F              sbci R25,0xFF
 0398 9BBD              out 0x2b,R25
 039A 8ABD              out 0x2a,R24
 039C                   .dbline 246
 039C 05C0              xjmp L81
 039E           L80:
 039E                   .dbline 246
 039E           ;                       } else {
 039E                   .dbline 247
 039E           ;                               OCR1A = (uint)(pt_l->real_speed);
 039E F801              movw R30,R16
 03A0 2280              ldd R2,z+2
 03A2 3380              ldd R3,z+3
 03A4 3BBC              out 0x2b,R3
 03A6 2ABC              out 0x2a,R2
 03A8                   .dbline 248
 03A8           ;                       }
 03A8           L81:
 03A8                   .dbline 249
 03A8           ;                       pt_l->counter = 0;                              //计数器清零
 03A8 2224              clr R2
 03AA 3324              clr R3
 03AC F801              movw R30,R16
 03AE 3186              std z+9,R3
 03B0 2086              std z+8,R2
 03B2                   .dbline 250
 03B2           ;               }
 03B2                   .dbline 251
 03B2 40C0              xjmp L77
 03B4           L76:
 03B4                   .dbline 251
 03B4           ;       } else if( pt_l->real_speed > pt_l->des_speed ){
 03B4 F801              movw R30,R16
 03B6 2080              ldd R2,z+0
 03B8 3180              ldd R3,z+1
 03BA 4280              ldd R4,z+2
 03BC 5380              ldd R5,z+3
 03BE 2414              cp R2,R4
 03C0 3504              cpc R3,R5
 03C2 0CF0              brlt X9
 03C4 37C0              xjmp L82
 03C6           X9:
 03C6                   .dbline 251
 03C6                   .dbline 252
 03C6           ;               if ( ++ pt_l->counter == pt_l->dece_count ){
 03C6 C801              movw R24,R16
 03C8 0896              adiw R24,8
 03CA FC01              movw R30,R24
 03CC 8081              ldd R24,z+0
 03CE 9181              ldd R25,z+1
 03D0 0196              adiw R24,1
 03D2 2C01              movw R4,R24

⌨️ 快捷键说明

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