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

📄 kbsub.lis

📁 这是我做课程设计时自己做的,用摩托罗位的飞思卡尔单片机做的,包括了对键盘复键的处理
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -