📄 kbsub.lis
字号:
0151 ; case '2':return H2;break;
0151 L32:
0151 A696 lda #-106
0153 CC0228 jmp L2
0156 X26:
0156 ; case '3':return H3;break;
0156 L33:
0156 A645 lda #69
0158 CC0228 jmp L2
015B X27:
015B ; case '4':return H4;break;
015B L34:
015B A6D5 lda #-43
015D CC0228 jmp L2
0160 X28:
0160 ; case '5':return H5;break;
0160 L35:
0160 A695 lda #-107
0162 CC0228 jmp L2
0165 X29:
0165 ; case '6':return H6;break;
0165 L36:
0165 A6C3 lda #-61
0167 CC0228 jmp L2
016A X30:
016A ; case '7':return H7;break;
016A L27:
016A A6FF lda #-1
016C CC0228 jmp L2
016F X31:
016F ; default:return 0xff;break;
016F L25:
016F ; }
016F ; }
016F ; }
016F L11:
016F ;
016F ; }
016F L9:
016F ;
016F ; /************************************补扫第四行结束***************************************/
016F ;
016F ; /*****************************************************************************************/
016F ; /***************************以下为组合键时的补丁程序**************************************/
016F ; /*************解决了引导键与功能键同一列时扫不到键的BUG***********************************/
016F ; /****************至于BUG的原因初步认为是I/O口输出低时的内阻比上拉电阻的阻值大造成的*******/
016F ; /**********************如有问题可交流sam1985317@163.com******QQ:157871537*****************/
016F ; if(trap_in_tmp)
016F E603 lda 3,X
0171 2603 bne X47
0173 CC0218 jmp L37
0176 X47:
0176 ; {
0176 ; //printf("Trap in patch!!!\r\n");
0176 ; KB_D=0b00000111; //定定义7-3为输入,2-0为输出
0176 A607 lda #7
0178 B704 sta 0x4
017A ; KB_PUE=0b11111000; //定义输入引脚有内部上拉电阻
017A A6F8 lda #-8
017C B70D sta 0xd
017E ; line=0b11111110; //使第一根行线为0(低电平)
017E A6FE lda #-2
0180 E704 sta 4,X
0182 ; for(i=1;i<4;i++) //将扫描3根行线
0182 A601 lda #1
0184 E705 sta 5,X
0186 CC020F jmp L42
0189 L39:
0189 ; {
0189 ;
0189 ; tmp=KB_P; //取KB_P->tmp
0189 B600 lda 0
018B E706 sta 6,X
018D ; tmp|=0b00000111; //KB_P.7-3保留,KB_P.2-0为1
018D AA07 ora #7
018F E706 sta 6,X
0191 ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2
0191 E404 and 4,X
0193 B700 sta 0
0195 ; asm("NOP"); //等待,消除按键抖动
0195 9D NOP
0196 ; asm("NOP");
0196 9D NOP
0197 ; tmp=KB_P;
0197 B600 lda 0
0199 E706 sta 6,X
019B ; tmp&=0b11111000; //看第n行是否有键按下
019B A4F8 and #-8
019D E706 sta 6,X
019F ; if(tmp!=0xf8) //本行有键按下
019F A1F8 cmp #-8
01A1 2763 beq L43
01A3 ; {
01A3 ; //printf("Trap in patch&&tmp!!!\r\n");
01A3 ; KB_D=0b00001111; //恢复初始设置
01A3 A60F lda #15
01A5 B704 sta 0x4
01A7 ; KB_PUE=0b11110000;
01A7 A6F0 lda #-16
01A9 B70D sta 0xd
01AB ; if(tmp==0xe0) //L和L所在的列的其它键有同时按下!!!!
01AB E606 lda 6,X
01AD A1E0 cmp #-32
01AF 262E bne L45
01B1 ; {
01B1 ; switch(i)
01B1 7F clr ,X
01B2 E605 lda 5,X
01B4 E701 sta 1,X
01B6 F6 lda ,X
01B7 2606 bne X32
01B9 E601 lda 1,X
01BB A101 cmp #1
01BD 2714 beq L50
01BF X32:
01BF F6 lda ,X
01C0 2606 bne X33
01C2 E601 lda 1,X
01C4 A102 cmp #2
01C6 270F beq L51
01C8 X33:
01C8 F6 lda ,X
01C9 2606 bne X34
01CB E601 lda 1,X
01CD A103 cmp #3
01CF 270A beq L52
01D1 X34:
01D1 200C bra L47
01D3 X35:
01D3 ; {
01D3 L50:
01D3 A6E6 lda #-26
01D5 2051 bra L2
01D7 X36:
01D7 ; case 1:return L1;break;
01D7 L51:
01D7 A6E5 lda #-27
01D9 204D bra L2
01DB X37:
01DB ; case 2:return L4;break;
01DB L52:
01DB A6E3 lda #-29
01DD 2049 bra L2
01DF X38:
01DF ; case 3:return L7;break;
01DF L47:
01DF ; }
01DF ; }
01DF L45:
01DF ; if(tmp==0xd0) //H和H所在的列的其它键有同时按下!!!!
01DF E606 lda 6,X
01E1 A1D0 cmp #-48
01E3 2628 bne L44
01E5 ; {
01E5 ; switch(i)
01E5 7F clr ,X
01E6 E605 lda 5,X
01E8 E701 sta 1,X
01EA F6 lda ,X
01EB 2606 bne X39
01ED E601 lda 1,X
01EF A101 cmp #1
01F1 270B beq L58
01F3 X39:
01F3 F6 lda ,X
01F4 2606 bne X40
01F6 E601 lda 1,X
01F8 A102 cmp #2
01FA 2706 beq L59
01FC X40:
01FC 200F bra L44
01FE X41:
01FE ; {
01FE L58:
01FE A6D6 lda #-42
0200 2026 bra L2
0202 X42:
0202 ; case 1:return H2;break;
0202 L59:
0202 A6D5 lda #-43
0204 2022 bra L2
0206 X43:
0206 ; case 2:return H5;break;
0206 ; }
0206 ; }
0206 ;
0206 ; }
0206 L43:
0206 ; else //本行无键按下,扫描下一行
0206 ; line=(line<<1)|0x01;
0206 E604 lda 4,X
0208 48 lsla
0209 AA01 ora #1
020B E704 sta 4,X
020D L44:
020D L40:
020D 6C05 inc 5,X
020F L42:
020F E605 lda 5,X
0211 A104 cmp #4
0213 2403 bhs X48
0215 CC0189 jmp L39
0218 X48:
0218 ; }
0218 ; }
0218 L37:
0218 ; /**********************************补丁程序在此结束********************************/
0218 ; if((i==5)||(i==4))
0218 E605 lda 5,X
021A A105 cmp #5
021C 2704 beq L62
021E A104 cmp #4
0220 2604 bne L60
0222 L62:
0222 ; return 0xff;
0222 A6FF lda #-1
0224 2002 bra L2
0226 L60:
0226 ; else
0226 ; return tmp;
0226 E606 lda 6,X
0228 L2:
0228 A707 ais #7
022A .dbline 0 ; func end
022A 81 rts
.area lit
0000 _KB_Table::
0000 EE31 .byte 238,49
0002 DE32 .byte 222,50
0004 BE33 .byte 190,51
0006 7E41 .byte 126,'A
0008 ED34 .byte 237,52
000A DD35 .byte 221,53
000C BD36 .byte 189,54
000E 7D42 .byte 125,'B
0010 EB37 .byte 235,55
0012 DB38 .byte 219,56
0014 BB39 .byte 187,57
0016 7B43 .byte 123,'C
0018 E72A .byte 231,42
001A D730 .byte 215,48
001C B723 .byte 183,35
001E 7744 .byte 'w,'D
0020 00 .byte 0
.area text
; KeyPress -> 0,X
; i -> 1,X
; j -> 2,X
; KB_valve -> 5,X
022B _KB_Def::
022B A7FD ais #-3
022D 95 tsx
022E ; }
022E ; /*KB_Def:键值转为定义值函数----------------------------*
022E ; *功 能:键值转为定义值 *
022E ; *参 数:键值 *
022E ; *返 回:键定义值 *
022E ; *-----------------------------------------------------*/
022E ; //键盘定义表
022E ; const unsigned char KB_Table[]=
022E ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
022E ; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
022E ; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
022E ; 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
022E ; 0x00};
022E ; unsigned char KB_Def(unsigned char KB_valve)
022E ; {
022E ; unsigned char KeyPress;
022E ; unsigned char i;
022E ; unsigned char j;
022E ; i=0;
022E 6F01 clr 1,X
0230 203C bra L65
0232 L64:
0232 ; while(1)
0232 ; {
0232 ; j=KB_Table[i];
0232 3F00 clr *__r0
0234 E601 lda 1,X
0236 AB00 add #<_KB_Table
0238 B700 sta *__r1
023A B600 lda *__r0
023C A900 adc #>_KB_Table
023E B700 sta *__r0
0240 5500 ldhx *__r0
0242 F6 lda ,x
0243 95 tsx
0244 E702 sta 2,X
0246 ; //与0(定义表结束标志)相比较
0246 ; if (j==0) //=0,即表中无次定义值
0246 2605 bne L67
0248 ; {KeyPress=0xff; break;} //返回0xff
0248 A6FF lda #-1
024A F7 sta ,X
024B 2023 bra L66
024D L67:
024D ; else
024D ; //与键值相比较
024D ; if (j==KB_valve) //找到
024D E602 lda 2,X
024F E105 cmp 5,X
0251 2615 bne L69
0253 ; {KeyPress=KB_Table[i+1];break;} //取键定义值
0253 3F00 clr *__r0
0255 E601 lda 1,X
0257 AB01 add #<_KB_Table+1
0259 B700 sta *__r1
025B B600 lda *__r0
025D A901 adc #>_KB_Table+1
025F B700 sta *__r0
0261 5500 ldhx *__r0
0263 F6 lda ,x
0264 95 tsx
0265 F7 sta ,X
0266 2008 bra L66
0268 L69:
0268 E601 lda 1,X
026A AB02 add #2
026C E701 sta 1,X
026E L65:
026E 20C2 bra L64
0270 L66:
0270 ; else
0270 ; i+=2; //指向下一个键值,继续判断
0270 ; };
0270 ; return KeyPress;
0270 F6 lda ,X
0271 L63:
0271 A703 ais #3
0273 .dbline 0 ; func end
0273 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -