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

📄 key_board.lis

📁 键盘操作 键盘扫描 用的是单片机mega16
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0074 9E07              cpc R25,R30
 0076 69F0              breq L14
 0078 8D30              cpi R24,13
 007A E0E0              ldi R30,0
 007C 9E07              cpc R25,R30
 007E 39F0              breq L13
 0080 8E30              cpi R24,14
 0082 E0E0              ldi R30,0
 0084 9E07              cpc R25,R30
 0086 09F0              breq L12
 0088 07C0              xjmp L10
 008A           X0:
 008A                   .dbline 97
 008A           ;       {
 008A           L12:
 008A                   .dbline 99
 008A           ;        case (KEY_COL_ALL&(~(1<<KEY_COL_0))):
 008A           ;              key_i = 0;
 008A 4427              clr R20
 008C                   .dbline 100
 008C           ;                  break;
 008C 05C0              xjmp L10
 008E           L13:
 008E                   .dbline 102
 008E           ;        case (KEY_COL_ALL&(~(1<<KEY_COL_1))):
 008E           ;                  key_i = 1;
 008E 41E0              ldi R20,1
 0090                   .dbline 103
 0090           ;                  break;
 0090 03C0              xjmp L10
 0092           L14:
 0092                   .dbline 105
 0092           ;        case (KEY_COL_ALL&(~(1<<KEY_COL_2))):
 0092           ;              key_i = 2;
 0092 42E0              ldi R20,2
 0094                   .dbline 106
 0094           ;                  break;
 0094 01C0              xjmp L10
 0096           L15:
 0096                   .dbline 108
 0096           ;        case (KEY_COL_ALL&(~(1<<KEY_COL_3))):
 0096           ;              key_i = 3;
 0096 43E0              ldi R20,3
 0098                   .dbline 109
 0098           ;                  break;
 0098                   .dbline 133
 0098           ;                  
 0098           ;       // 扩展
 0098           ;       #if PER_COL>4
 0098           ;       case (KEY_COL_ALL&(~(1<<KEY_COL_4))):
 0098           ;              key_i = 4;
 0098           ;                  break;
 0098           ;     #endif
 0098           ;       #if PER_COL>5
 0098           ;       case (KEY_COL_ALL&(~(1<<KEY_COL_5))):
 0098           ;              key_i = 5;
 0098           ;                  break;
 0098           ;     #endif
 0098           ;       #if PER_COL>6
 0098           ;       case (KEY_COL_ALL&(~(1<<KEY_COL_6))):
 0098           ;              key_i = 6;
 0098           ;                  break;
 0098           ;     #endif
 0098           ;       #if PER_COL>7
 0098           ;       case (KEY_COL_ALL&(~(1<<KEY_COL_7))):
 0098           ;              key_i = 7;
 0098           ;                  break;
 0098           ;     #endif
 0098           ;       
 0098           ;       default:break;
 0098           L10:
 0098                   .dbline 137
 0098           ;     }//end switch
 0098           ;    
 0098           ;    //翻转,与初始化恰好相反
 0098           ;     KEY_DDR_ROW   &=~  KEY_ROW_ALL;                                                      //行输入,并使能内部上拉
 0098 8AB3              in R24,0x1a
 009A 8F70              andi R24,15
 009C 8ABB              out 0x1a,R24
 009E                   .dbline 138
 009E           ;       KEY_PORT_ROW  |=  KEY_ROW_ALL;
 009E 8BB3              in R24,0x1b
 00A0 806F              ori R24,240
 00A2 8BBB              out 0x1b,R24
 00A4                   .dbline 139
 00A4           ;       KEY_DDR_COL   |=  KEY_COL_ALL;                                                     //列输出,低
 00A4 8AB3              in R24,0x1a
 00A6 8F60              ori R24,15
 00A8 8ABB              out 0x1a,R24
 00AA                   .dbline 140
 00AA           ;     KEY_PORT_COL  &=~  KEY_COL_ALL;
 00AA 8BB3              in R24,0x1b
 00AC 807F              andi R24,240
 00AE 8BBB              out 0x1b,R24
 00B0                   .dbline 142
 00B0           ;       
 00B0           ;     NOP();                                                                                                       //等待啊你家安稳定,此步骤不能少
 00B0 0000              nop
 00B2                   .dbline 144
 00B2           ;    
 00B2           ;     temp_key = ( KEY_ROW_ALL & KEY_PIN_ROW );                            //读取翻转后键值
 00B2 69B3              in R22,0x19
 00B4 607F              andi R22,240
 00B6                   .dbline 146
 00B6           ;       
 00B6           ;       switch(temp_key)
 00B6 7727              clr R23
 00B8 603B              cpi R22,176
 00BA E0E0              ldi R30,0
 00BC 7E07              cpc R23,R30
 00BE C9F0              breq L21
 00C0 80EB              ldi R24,176
 00C2 90E0              ldi R25,0
 00C4 8617              cp R24,R22
 00C6 9707              cpc R25,R23
 00C8 2CF0              brlt L24
 00CA           L23:
 00CA 6037              cpi R22,112
 00CC E0E0              ldi R30,0
 00CE 7E07              cpc R23,R30
 00D0 91F0              breq L22
 00D2 12C0              xjmp L27
 00D4           L24:
 00D4 603D              cpi R22,208
 00D6 E0E0              ldi R30,0
 00D8 7E07              cpc R23,R30
 00DA 49F0              breq L20
 00DC 603D              cpi R22,208
 00DE E0E0              ldi R30,0
 00E0 7E07              cpc R23,R30
 00E2 54F0              brlt L27
 00E4           L25:
 00E4 603E              cpi R22,224
 00E6 E0E0              ldi R30,0
 00E8 7E07              cpc R23,R30
 00EA 31F0              breq L27
 00EC 05C0              xjmp L27
 00EE           X1:
 00EE                   .dbline 147
 00EE           ;       {
 00EE                   .dbline 150
 00EE           ;        case (KEY_ROW_ALL&(~(1<<KEY_ROW_0))):
 00EE           ;              // key_i += 0; //加零,直接省掉
 00EE           ;                  break;
 00EE           L20:
 00EE                   .dbline 152
 00EE           ;        case (KEY_ROW_ALL&(~(1<<KEY_ROW_1))):
 00EE           ;                  key_i += PER_POW;
 00EE 4C5F              subi R20,252    ; addi 4
 00F0                   .dbline 153
 00F0           ;                  break;
 00F0 03C0              xjmp L27
 00F2           L21:
 00F2                   .dbline 155
 00F2           ;        case (KEY_ROW_ALL&(~(1<<KEY_ROW_2))):
 00F2           ;              key_i += PER_POW*2;
 00F2 485F              subi R20,248    ; addi 8
 00F4                   .dbline 156
 00F4           ;                  break;
 00F4 01C0              xjmp L27
 00F6           L22:
 00F6                   .dbline 158
 00F6           ;        case (KEY_ROW_ALL&(~(1<<KEY_ROW_3))):
 00F6           ;              key_i += PER_POW*3;
 00F6 445F              subi R20,244    ; addi 12
 00F8                   .dbline 159
 00F8           ;                  break;
 00F8                   .dbline 183
 00F8           ;                  
 00F8           ;       // 扩展 PER_POW 最大值为8
 00F8           ;       #if PER_POW>4
 00F8           ;       case (KEY_ROW_ALL&(~(1<<KEY_ROW_4))):
 00F8           ;              key_i += PER_POW*4;
 00F8           ;                  break;
 00F8           ;       #endif
 00F8           ;       #if PER_POW>5
 00F8           ;       case (KEY_ROW_ALL&(~(1<<KEY_ROW_5))):
 00F8           ;              key_i += PER_POW*5;
 00F8           ;                  break;
 00F8           ;       #endif
 00F8           ;       #if PER_POW>6
 00F8           ;       case (KEY_ROW_ALL&(~(1<<KEY_ROW_6))):
 00F8           ;              key_i += PER_POW*6;
 00F8           ;                  break;
 00F8           ;       #endif
 00F8           ;       #if PER_POW>7
 00F8           ;       case (KEY_ROW_ALL&(~(1<<KEY_ROW_7))):
 00F8           ;              key_i += PER_POW*7;
 00F8           ;                  break;
 00F8           ;       #endif
 00F8           ;       
 00F8           ;       default:break;
 00F8           L26:
 00F8                   .dbline 189
 00F8           L27:
 00F8                   .dbline 188
 00F8           ;     }//end switch
 00F8           ; 
 00F8           ;       //检测按键抬起
 00F8           ;       #if WAIT_KEY_UP==1
 00F8           ;                while((KEY_ROW_ALL & KEY_PIN_ROW)!=KEY_ROW_ALL)
 00F8 89B3              in R24,0x19
 00FA 807F              andi R24,240
 00FC 803F              cpi R24,240
 00FE E1F7              brne L26
 0100                   .dbline 192
 0100           ;                ;
 0100           ;       #endif
 0100           ;       
 0100           ;       key_board_int();                                                                        //恢复键盘IO口的初时状态
 0100 90DF              xcall _key_board_int
 0102                   .dbline 194
 0102           ;       
 0102           ;    }//end if have key
 0102           L7:
 0102                   .dbline 195
 0102           ;    return key_board_table[key_i];                                             //返回键值
 0102 80E0              ldi R24,<_key_board_table
 0104 90E0              ldi R25,>_key_board_table
 0106 E42F              mov R30,R20
 0108 FF27              clr R31
 010A E80F              add R30,R24
 010C F91F              adc R31,R25
 010E 0491              lpm R16,Z
 0110 01C0              xjmp L4
 0112           L5:
 0112                   .dbline 198
 0112           ;   }
 0112           ;   else
 0112           ;   return 0xFF;
 0112 0FEF              ldi R16,255
 0114                   .dbline -2
 0114           L4:
 0114 0E940000          xcall pop_gset3
 0118                   .dbline 0 ; func end
 0118 0895              ret
 011A                   .dbsym r key_i 20 c
 011A                   .dbsym r temp_key 22 c
 011A                   .dbend

⌨️ 快捷键说明

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