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

📄 kbsub.s

📁 这是我做课程设计时自己做的,用摩托罗位的飞思卡尔单片机做的,包括了对键盘复键的处理
💻 S
字号:
	.module KBsub.c
	.area text
_KB_Init::
; #include "KeyBoard_define.h"
; //#include "stdio.h"
; 
; 
; /*-----------------------------------------------------*
; *文件描述:本文件包含了H08C键盘中断子函数,分别为:       *  
; *(1)KB_Init:键盘初始化函数                             *
; *   void KB_Init(void)                                 *
; *(2)KB_Scan:扫描读取键值函数                           *
; *   unsigned char KB_Scan(void)                        *
; *(3)KB_Def:键值转为定义值函数                          *
; *   unsigned char KB_Def(unsigned char KB_valve)       *
; *-----------------------------------------------------*/
; /*[以下为子程序源代码]*/
; /*[头文件]*/
; #include "GP32C.H"
; #include "KB.h"
; /*KB_Init:键盘初始化函数-------------------------------*
; *功  能:初始化键盘中断的引脚,但未开放键盘中断         *
; *参  数:无                                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/  
; void KB_Init(void)
; {
; 	 KB_P=0x00;             //复位KB_P
	clr 0
; 	 KB_D=0b00001111;       //定定义7-4为输入,3-0为输出
	lda #15
	sta 0x4
; 	 KB_PUE=0b11110000;     //定义输入引脚有内部上拉电阻
	lda #-16
	sta 0xd
L1:
	.dbline 0 ; func end
	rts
;       tmp_beta -> 2,X
;    trap_in_tmp -> 3,X
;           line -> 4,X
;              i -> 5,X
;            tmp -> 6,X
_KB_Scan::
	ais #-7
	tsx
; 	 //INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
; 	 //INTKBIER=0b11110000;   //允许输入引脚的中断可进入
; 	 //INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
; *         若无按键,*p为0xff                           *
; *参  数:无                                             *
; *返  回:扫描到的键值                                   *
; 
; /*----------------------------------------------------*/  
; unsigned char KB_Scan(void) 
;  {
; 	 unsigned char line,i,tmp,tmp_beta,trap_in_tmp;
; 	 trap_in_tmp=1;
	lda #1
	sta 3,X
;      line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta 4,X
; 	 for(i=1;i<4;i++)         //将扫描4根行线
	lda #1
	sta 5,X
	bra L6
L3:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 6,X
;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 6,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and 4,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 6,X
; 	    tmp&=0b11110000;       //看第n行是否有键按下
	and #-16
	sta 6,X
; 	    if(tmp!=0xf0)          //本行有键按下
	cmp #-16
	beq L7
; 	     {	
; 	     	trap_in_tmp=0; 
	clr 3,X
;             tmp=KB_P;
	lda 0
	sta 6,X
;             tmp=KB_Def(tmp);
	psha
	jsr _KB_Def
	ais #1
	tsx
	sta *__r1
	sta 6,X
;             //printf("%c key value is pressed\r\n",tmp); 
; 		    break;
	bra L5
L7:
	lda 4,X
	lsla
	ora #1
	sta 4,X
L4:
	inc 5,X
L6:
	lda 5,X
	cmp #4
	blo L3
L5:
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01; 
; 	 }
; 	 
; 	 /************************************补扫第四行有没有按键按下***********************************/
; 	
; 	 if(1)
; 	 {
; 	 	line=0b11110111;
	lda #-9
	sta 4,X
; 	 	tmp_beta=KB_P;            //取KB_P->tmp
	lda 0
	sta 2,X
;         tmp_beta|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1.
	ora #15
	sta 2,X
;         KB_P=tmp_beta&line;       //令KB_P.3=0
	and 4,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp_beta=KB_P;
	lda 0
	sta 2,X
; 	    tmp_beta&=0b11110000;       //看第4行是否有键按下
	and #-16
	sta 2,X
; 	    if(tmp_beta!=0xf0)          //Y
	cmp #-16
	bne X44
	jmp L11
X44:
; 	    {
; 	    	trap_in_tmp=0;
	clr 3,X
; 	    	tmp_beta=KB_P;
	lda 0
	sta 2,X
; 	    	tmp_beta&=0b11110000; 
	and #-16
	sta 2,X
; 	    	if(tmp_beta==0xe0)   //"L" key is be pressed!!!
	cmp #-32
	beq X45
	jmp L13
X45:
; 	    	{
; 	    		//printf("L key is be pressed!!!\r\n");
; 	    		switch(tmp)
	clr ,X
	lda 6,X
	sta 1,X
	lda ,X
	bne X0
	lda 1,X
	cmp #49
	beq L18
X0:
	lda ,X
	bne X1
	lda 1,X
	cmp #50
	beq L19
X1:
	lda ,X
	bne X2
	lda 1,X
	cmp #51
	beq L20
X2:
	lda ,X
	bne X3
	lda 1,X
	cmp #52
	beq L21
X3:
	lda ,X
	bne X4
	lda 1,X
	cmp #53
	beq L22
X4:
	lda ,X
	bne X5
	lda 1,X
	cmp #54
	beq L23
X5:
	lda ,X
	bne X6
	lda 1,X
	cmp #55
	beq L24
X6:
	bra L15
X7:
; 	    		{
L18:
	lda #-26
	jmp L2
X8:
; 	    			case '1':return L1;break;
L19:
	lda #-58
	jmp L2
X9:
; 	    			case '2':return L2;break;
L20:
	lda #-90
	jmp L2
X10:
; 	    			case '3':return L3;break;
L21:
	lda #-27
	jmp L2
X11:
; 	    			case '4':return L4;break;
L22:
	lda #-59
	jmp L2
X12:
; 	    			case '5':return L5;break;
L23:
	lda #-91
	jmp L2
X13:
; 	    			case '6':return L6;break;
L24:
	lda #-29
	jmp L2
X14:
; 	    			case '7':return L7;break;
L15:
	lda #-1
	jmp L2
X15:
; 	    			default:return 0xff;break;
L13:
; 	    		}
; 	    	}
; 	    	if(tmp_beta==0xd0)     //"H" key is be pressed!!!
	lda 2,X
	cmp #-48
	beq X46
	jmp L25
X46:
; 	    	{
; 				//printf("H key is be pressed!!!\r\n");
; 	    		switch(tmp)
	clr ,X
	lda 6,X
	sta 1,X
	lda ,X
	bne X16
	lda 1,X
	cmp #49
	beq L30
X16:
	lda ,X
	bne X17
	lda 1,X
	cmp #50
	beq L31
X17:
	lda ,X
	bne X18
	lda 1,X
	cmp #51
	beq L32
X18:
	lda ,X
	bne X19
	lda 1,X
	cmp #52
	beq L33
X19:
	lda ,X
	bne X20
	lda 1,X
	cmp #53
	beq L34
X20:
	lda ,X
	bne X21
	lda 1,X
	cmp #54
	beq L35
X21:
	lda ,X
	bne X22
	lda 1,X
	cmp #55
	beq L36
X22:
	bra L27
X23:
; 	    		{
L30:
	lda #70
	jmp L2
X24:
; 	    			case '1':return H1;break;
L31:
	lda #-42
	jmp L2
X25:
; 	    			case '2':return H2;break;
L32:
	lda #-106
	jmp L2
X26:
; 	    			case '3':return H3;break;
L33:
	lda #69
	jmp L2
X27:
; 	    			case '4':return H4;break;
L34:
	lda #-43
	jmp L2
X28:
; 	    			case '5':return H5;break;
L35:
	lda #-107
	jmp L2
X29:
; 	    			case '6':return H6;break;
L36:
	lda #-61
	jmp L2
X30:
; 	    			case '7':return H7;break;
L27:
	lda #-1
	jmp L2
X31:
; 	    			default:return 0xff;break;
L25:
; 	    		}
; 	    	}
; 	    } 
L11:
; 	     
; 	 }	
L9:
; 	
; 	 /************************************补扫第四行结束***************************************/
; 	 
; 	 /*****************************************************************************************/
; 	 /***************************以下为组合键时的补丁程序**************************************/
; 	 /*************解决了引导键与功能键同一列时扫不到键的BUG***********************************/
; 	 /****************至于BUG的原因初步认为是I/O口输出低时的内阻比上拉电阻的阻值大造成的*******/
; 	 /**********************如有问题可交流sam1985317@163.com******QQ:157871537*****************/
; 	 if(trap_in_tmp)
	lda 3,X
	bne X47
	jmp L37
X47:
; 	 {
; 	 	//printf("Trap in patch!!!\r\n"); 
; 	 	KB_D=0b00000111;       //定定义7-3为输入,2-0为输出
	lda #7
	sta 0x4
; 	 	KB_PUE=0b11111000;     //定义输入引脚有内部上拉电阻
	lda #-8
	sta 0xd
; 	 	line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta 4,X
; 	 	for(i=1;i<4;i++)         //将扫描3根行线
	lda #1
	sta 5,X
	jmp L42
L39:
; 	  	{	
; 	  	
;         	tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 6,X
;         	tmp|=0b00000111;     //KB_P.7-3保留,KB_P.2-0为1
	ora #7
	sta 6,X
;         	KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2
	and 4,X
	sta 0
; 	    	asm("NOP");            //等待,消除按键抖动
	NOP
; 	    	asm("NOP");
	NOP
; 	    	tmp=KB_P;
	lda 0
	sta 6,X
; 	    	tmp&=0b11111000;       //看第n行是否有键按下
	and #-8
	sta 6,X
; 	    	if(tmp!=0xf8)          //本行有键按下
	cmp #-8
	beq L43
; 	     	{
; 	     		//printf("Trap in patch&&tmp!!!\r\n");  
; 	        	KB_D=0b00001111;       //恢复初始设置
	lda #15
	sta 0x4
; 	 			KB_PUE=0b11110000;     
	lda #-16
	sta 0xd
; 	     		if(tmp==0xe0)          //L和L所在的列的其它键有同时按下!!!!
	lda 6,X
	cmp #-32
	bne L45
; 	     		{
; 	     			switch(i)
	clr ,X
	lda 5,X
	sta 1,X
	lda ,X
	bne X32
	lda 1,X
	cmp #1
	beq L50
X32:
	lda ,X
	bne X33
	lda 1,X
	cmp #2
	beq L51
X33:
	lda ,X
	bne X34
	lda 1,X
	cmp #3
	beq L52
X34:
	bra L47
X35:
; 			    	{
L50:
	lda #-26
	bra L2
X36:
; 						case 1:return L1;break;
L51:
	lda #-27
	bra L2
X37:
; 						case 2:return L4;break;
L52:
	lda #-29
	bra L2
X38:
; 						case 3:return L7;break;
L47:
; 			    	}
; 	     		}
L45:
; 	     		if(tmp==0xd0)          //H和H所在的列的其它键有同时按下!!!!
	lda 6,X
	cmp #-48
	bne L44
; 	     		{
; 	     			switch(i)
	clr ,X
	lda 5,X
	sta 1,X
	lda ,X
	bne X39
	lda 1,X
	cmp #1
	beq L58
X39:
	lda ,X
	bne X40
	lda 1,X
	cmp #2
	beq L59
X40:
	bra L44
X41:
; 			    	{
L58:
	lda #-42
	bra L2
X42:
; 						case 1:return H2;break;
L59:
	lda #-43
	bra L2
X43:
; 						case 2:return H5;break;
; 			    	}
; 	     		}
; 			
; 	     	}
L43:
; 	     	else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01;
	lda 4,X
	lsla
	ora #1
	sta 4,X
L44:
L40:
	inc 5,X
L42:
	lda 5,X
	cmp #4
	bhs X48
	jmp L39
X48:
; 	  	}
; 	 }
L37:
; 	  /**********************************补丁程序在此结束********************************/
; 	  if((i==5)||(i==4))
	lda 5,X
	cmp #5
	beq L62
	cmp #4
	bne L60
L62:
; 	    return 0xff;
	lda #-1
	bra L2
L60:
; 	  else
; 	  	return tmp;
	lda 6,X
L2:
	ais #7
	.dbline 0 ; func end
	rts
	.area lit
_KB_Table::
	.byte 238,49
	.byte 222,50
	.byte 190,51
	.byte 126,'A
	.byte 237,52
	.byte 221,53
	.byte 189,54
	.byte 125,'B
	.byte 235,55
	.byte 219,56
	.byte 187,57
	.byte 123,'C
	.byte 231,42
	.byte 215,48
	.byte 183,35
	.byte 'w,'D
	.byte 0
	.area text
;       KeyPress -> 0,X
;              i -> 1,X
;              j -> 2,X
;       KB_valve -> 5,X
_KB_Def::
	ais #-3
	tsx
;  }
; /*KB_Def:键值转为定义值函数----------------------------*
; *功  能:键值转为定义值                                 *
; *参  数:键值                                           *
; *返  回:键定义值                                       *
; *-----------------------------------------------------*/
; //键盘定义表
; const unsigned char KB_Table[]= 
; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
;  0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
;  0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
;  0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
;  0x00};
; unsigned char KB_Def(unsigned char KB_valve)
;  {
;    unsigned char KeyPress;
;    unsigned char i;
;    unsigned char j;
;    i=0;
	clr 1,X
	bra L65
L64:
;    while(1)
;    {
;      j=KB_Table[i];
	clr *__r0
	lda 1,X
	add #<_KB_Table
	sta *__r1
	lda *__r0
	adc #>_KB_Table
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	sta 2,X
;      //与0(定义表结束标志)相比较
;      if (j==0)                   //=0,即表中无次定义值
	bne L67
;         {KeyPress=0xff; break;}  //返回0xff
	lda #-1
	sta ,X
	bra L66
L67:
;      else
;         //与键值相比较
;         if (j==KB_valve)         //找到       
	lda 2,X
	cmp 5,X
	bne L69
;            {KeyPress=KB_Table[i+1];break;} //取键定义值
	clr *__r0
	lda 1,X
	add #<_KB_Table+1
	sta *__r1
	lda *__r0
	adc #>_KB_Table+1
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	sta ,X
	bra L66
L69:
	lda 1,X
	add #2
	sta 1,X
L65:
	bra L64
L66:
;         else
;            i+=2;              //指向下一个键值,继续判断
;     };
;     return KeyPress;
	lda ,X
L63:
	ais #3
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

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