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

📄 ex_support.lis

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0144 8E63              ori R24,62
 0146 85BB              out 0x15,R24
 0148                   .dbline 275
 0148           ;                    BIT(4) | BIT(5);                                                   //全部端口拉高
 0148           ;    NOP();
 0148 0000              nop
 014A                   .dbline 276
 014A           ;    NOP();
 014A 0000              nop
 014C                   .dbline 279
 014C           ;    
 014C           ;    
 014C           ;    if (!(PINC & (BIT(1))))                    //读取pc1端口,如果返回值是0则表明按键被按下,
 014C 9999              sbic 0x13,1
 014E 02C0              rjmp L45
 0150           X17:
 0150                   .dbline 281
 0150           ;                                               //则返回按键的值                              
 0150           ;    {
 0150                   .dbline 282
 0150           ;        chTempKeyCode = 21;
 0150                   .dbline 283
 0150           ;          return chTempKeyCode;
 0150 05E1              ldi R16,21
 0152 B1C0              rjmp L44
 0154           L45:
 0154                   .dbline 285
 0154           ;    }
 0154           ;    else if (!(PINC & (BIT(2))))       //读取pc2端口,如果返回值是0则表明按键被按下,
 0154 9A99              sbic 0x13,2
 0156 02C0              rjmp L47
 0158           X18:
 0158                   .dbline 287
 0158           ;                                       //则返回按键的值,下面以此类推。              
 0158           ;    {
 0158                   .dbline 288
 0158           ;        chTempKeyCode = 22;
 0158                   .dbline 289
 0158           ;          return chTempKeyCode;
 0158 06E1              ldi R16,22
 015A ADC0              rjmp L44
 015C           L47:
 015C                   .dbline 291
 015C           ;    }
 015C           ;    else if (!(PINC & (BIT(3))))
 015C 9B99              sbic 0x13,3
 015E 02C0              rjmp L49
 0160           X19:
 0160                   .dbline 292
 0160           ;    {
 0160                   .dbline 293
 0160           ;        chTempKeyCode = 23;
 0160                   .dbline 294
 0160           ;          return chTempKeyCode;
 0160 07E1              ldi R16,23
 0162 A9C0              rjmp L44
 0164           L49:
 0164                   .dbline 296
 0164           ;    }
 0164           ;    else if (!(PINC & (BIT(4))))
 0164 9C99              sbic 0x13,4
 0166 02C0              rjmp L51
 0168           X20:
 0168                   .dbline 297
 0168           ;    {
 0168                   .dbline 298
 0168           ;        chTempKeyCode = 24;
 0168                   .dbline 299
 0168           ;          return chTempKeyCode;
 0168 08E1              ldi R16,24
 016A A5C0              rjmp L44
 016C           L51:
 016C                   .dbline 301
 016C           ;    }
 016C           ;    else if (!(PINC & (BIT(5))))
 016C 9D99              sbic 0x13,5
 016E 02C0              rjmp L53
 0170           X21:
 0170                   .dbline 302
 0170           ;    {
 0170                   .dbline 303
 0170           ;        chTempKeyCode = 25;
 0170                   .dbline 304
 0170           ;          return chTempKeyCode;
 0170 09E1              ldi R16,25
 0172 A1C0              rjmp L44
 0174           L53:
 0174                   .dbline 309
 0174           ;    }
 0174           ;    
 0174           ;  //////////////////////////////////////////////////////////////
 0174           ;    //对1-4按钮进行扫描   
 0174           ;    DDRC &= ~(BIT(2) | BIT(3) | 
 0174 84B3              in R24,0x14
 0176 837C              andi R24,195
 0178 84BB              out 0x14,R24
 017A                   .dbline 311
 017A           ;                        BIT(4) | BIT(5));      //把端口pc2-pc5设置为输入
 017A           ;    DDRC  |=  BIT(1);                  //把pc1端口设为输出
 017A A19A              sbi 0x14,1
 017C                   .dbline 313
 017C           ;    
 017C           ;    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
 017C 85B3              in R24,0x15
 017E 8E63              ori R24,62
 0180 85BB              out 0x15,R24
 0182                   .dbline 316
 0182           ;                BIT(4) | BIT(5);
 0182           ;                        
 0182           ;    PORTC &=~ BIT(1);                  //把pc1端口拉低
 0182 A998              cbi 0x15,1
 0184                   .dbline 317
 0184           ;    NOP();
 0184 0000              nop
 0186                   .dbline 318
 0186           ;    NOP();
 0186 0000              nop
 0188                   .dbline 321
 0188           ;    
 0188           ;    
 0188           ;    if (!(PINC & (BIT(2))))     //读取pc2端口,如果返回值是0则表明按键被按下,    
 0188 9A99              sbic 0x13,2
 018A 02C0              rjmp L55
 018C           X22:
 018C                   .dbline 325
 018C           ;                                //则返回按键的值                                  
 018C           ;                                //以下依次对pc3、pc4、pc5逐个读取值,如果返回值为0
 018C           ;                                //则返回相应按键值                                
 018C           ;    {
 018C                   .dbline 326
 018C           ;        chTempKeyCode = 1;
 018C                   .dbline 327
 018C           ;          return chTempKeyCode;
 018C 01E0              ldi R16,1
 018E 93C0              rjmp L44
 0190           L55:
 0190                   .dbline 329
 0190           ;    }
 0190           ;    else if (!(PINC & (BIT(3))))
 0190 9B99              sbic 0x13,3
 0192 02C0              rjmp L57
 0194           X23:
 0194                   .dbline 330
 0194           ;    {
 0194                   .dbline 331
 0194           ;        chTempKeyCode = 2;
 0194                   .dbline 332
 0194           ;          return chTempKeyCode;
 0194 02E0              ldi R16,2
 0196 8FC0              rjmp L44
 0198           L57:
 0198                   .dbline 334
 0198           ;    }
 0198           ;    else if (!(PINC & (BIT(4))))
 0198 9C99              sbic 0x13,4
 019A 02C0              rjmp L59
 019C           X24:
 019C                   .dbline 335
 019C           ;    {
 019C                   .dbline 336
 019C           ;        chTempKeyCode = 3;
 019C                   .dbline 337
 019C           ;          return chTempKeyCode;
 019C 03E0              ldi R16,3
 019E 8BC0              rjmp L44
 01A0           L59:
 01A0                   .dbline 339
 01A0           ;    }
 01A0           ;    else if (!(PINC & (BIT(5))))
 01A0 9D99              sbic 0x13,5
 01A2 02C0              rjmp L61
 01A4           X25:
 01A4                   .dbline 340
 01A4           ;    {
 01A4                   .dbline 341
 01A4           ;        chTempKeyCode = 4;
 01A4                   .dbline 342
 01A4           ;          return chTempKeyCode;
 01A4 04E0              ldi R16,4
 01A6 87C0              rjmp L44
 01A8           L61:
 01A8                   .dbline 349
 01A8           ;    }
 01A8           ;    
 01A8           ;    
 01A8           ; //////////////////////////////////////////////////////////////
 01A8           ;    
 01A8           ;    //对6-7按钮进行扫描   
 01A8           ;    DDRC &= ~(BIT(1) | BIT(3) | 
 01A8 84B3              in R24,0x14
 01AA 857C              andi R24,197
 01AC 84BB              out 0x14,R24
 01AE                   .dbline 352
 01AE           ;                        BIT(4) | BIT(5));//把端口pc1,pc3-pc5设置为输入
 01AE           ;                        
 01AE           ;    DDRC  |=  BIT(2);//把pc2端口设为输出
 01AE A29A              sbi 0x14,2
 01B0                   .dbline 354
 01B0           ;    
 01B0           ;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
 01B0 85B3              in R24,0x15
 01B2 8E63              ori R24,62
 01B4 85BB              out 0x15,R24
 01B6                   .dbline 357
 01B6           ;                        BIT(4) | BIT(5);
 01B6           ;                        
 01B6           ;    PORTC &= ~BIT(2); //把pc2端口拉低
 01B6 AA98              cbi 0x15,2
 01B8                   .dbline 358
 01B8           ;    NOP();
 01B8 0000              nop
 01BA                   .dbline 359
 01BA           ;    NOP();
 01BA 0000              nop
 01BC                   .dbline 362
 01BC           ;    
 01BC           ;    
 01BC           ;    if (!(PINC & (BIT(3))))     //读取pc3端口,如果返回值是0则表明按键被按下,    
 01BC 9B99              sbic 0x13,3
 01BE 02C0              rjmp L63
 01C0           X26:
 01C0                   .dbline 366
 01C0           ;                                //则返回按键的值                                  
 01C0           ;                                //以下依次对pc4、pc5逐个读取值,如果返回值为0     
 01C0           ;                                //则返回相应按键值                                
 01C0           ;    {
 01C0                   .dbline 367
 01C0           ;        chTempKeyCode = 6;
 01C0                   .dbline 368
 01C0           ;          return chTempKeyCode;
 01C0 06E0              ldi R16,6
 01C2 79C0              rjmp L44
 01C4           L63:
 01C4                   .dbline 370
 01C4           ;    }
 01C4           ;    else if (!(PINC & (BIT(4))))
 01C4 9C99              sbic 0x13,4
 01C6 02C0              rjmp L65
 01C8           X27:
 01C8                   .dbline 371
 01C8           ;    {
 01C8                   .dbline 372
 01C8           ;        chTempKeyCode = 7;
 01C8                   .dbline 373
 01C8           ;          return chTempKeyCode;
 01C8 07E0              ldi R16,7
 01CA 75C0              rjmp L44
 01CC           L65:
 01CC                   .dbline 375
 01CC           ;    }
 01CC           ;    else if (!(PINC & (BIT(5))))
 01CC 9D99              sbic 0x13,5
 01CE 02C0              rjmp L67
 01D0           X28:
 01D0                   .dbline 376
 01D0           ;    {
 01D0                   .dbline 377
 01D0           ;        chTempKeyCode = 8;
 01D0                   .dbline 378
 01D0           ;          return chTempKeyCode;
 01D0 08E0              ldi R16,8
 01D2 71C0              rjmp L44
 01D4           L67:
 01D4                   .dbline 384
 01D4           ;    }
 01D4           ;  
 01D4           ; //////////////////////////////////////////////////////////////
 01D4           ;    
 01D4           ;    //对11-12按钮进行扫描   
 01D4           ;    DDRC &= ~(BIT(2) | BIT(1) | 
 01D4 84B3              in R24,0x14
 01D6 897C              andi R24,201
 01D8 84BB              out 0x14,R24
 01DA                   .dbline 387
 01DA           ;                        BIT(4) | BIT(5));//把端口pc1-pc2,pc4-pc5设置为输入
 01DA           ;                        
 01DA           ;    DDRC  |=  BIT(3);//把pc3端口设为输出
 01DA A39A              sbi 0x14,3
 01DC                   .dbline 389
 01DC           ;    
 01DC           ;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
 01DC 85B3              in R24,0x15
 01DE 8E63              ori R24,62
 01E0 85BB              out 0x15,R24
 01E2                   .dbline 392
 01E2           ;                        BIT(4) | BIT(5);
 01E2           ;                        
 01E2           ;    PORTC &= ~BIT(3);//把pc2端口拉低
 01E2 AB98              cbi 0x15,3
 01E4                   .dbline 393
 01E4           ;    NOP();
 01E4 0000              nop
 01E6                   .dbline 394
 01E6           ;    NOP(); 
 01E6 0000              nop
 01E8                   .dbline 396
 01E8           ;    
 01E8           ;    if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
 01E8 9C99              sbic 0x13,4
 01EA 02C0              rjmp L69
 01EC           X29:
 01EC                   .dbline 399
 01EC           ;                                //则返回按键的值                                  
 01EC           ;                                
 01EC           ;    {
 01EC                   .dbline 400
 01EC           ;        chTempKeyCode = 11;
 01EC                   .dbline 401
 01EC           ;          return chTempKeyCode;
 01EC 0BE0              ldi R16,11
 01EE 63C0              rjmp L44
 01F0           L69:
 01F0                   .dbline 403
 01F0           ;    }
 01F0           ;    else if (!(PINC & (BIT(5))))//读取pc5端口,如果返回值是0则表明按键被按下,    

⌨️ 快捷键说明

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