📄 key_board.lis
字号:
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 + -