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

📄 kbsub.s

📁 飞思卡尔U08开发平台下可以自由运行
💻 S
字号:
	.module KBsub.c
	.area text
_KB_Init::
; /*-----------------------------------------------------*
; *文件描述:本文件包含了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
; 	 INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	bset #1,0x1a
; 	 INTKBIER=0b11110000;   //允许输入引脚的中断可进入
	lda #-16
	sta 0x1b
; 	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
	bset #2,0x1a
L1:
	.dbline 0 ; func end
	rts
_KB_Init1::
; }
; void KB_Init1(void)
; {
; 	 KB_P=0x00;             //复位KB_P
	clr 0
; 	 KB_D=0b11110000;       //定定义7-4为输入,3-0为输出
	lda #-16
	sta 0x4
; 	 KB_PUE=0b00001111;     //定义输入引脚有内部上拉电阻
	lda #15
	sta 0xd
; 	 INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	bset #1,0x1a
; 	 INTKBIER=0b00001111;   //允许输入引脚的中断可进入
	lda #15
	sta 0x1b
; 	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
	bset #2,0x1a
L2:
	.dbline 0 ; func end
	rts
;           line -> 0,X
;              i -> 1,X
;          line1 -> 2,X
;              j -> 3,X
;            tmp -> 4,X
;           tmp1 -> 5,X
_KB_Scan::
	ais #-6
	tsx
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
; *         若无按键,*p为0xff                           *
; *参  数:无                                             *
; *返  回:扫描到的键值                                   *
; *-----------------------------------------------------*/  
; unsigned char KB_Scan(void) 
;  {
;      
; 	 unsigned char line,i,j,tmp,tmp1,line1;
; 	 KB_Init();
	jsr _KB_Init
	tsx
;      line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta ,X
; 	 for(i=1;i<=4;i++)         //将扫描4根行线
	lda #1
	sta 1,X
	jmp L7
L4:
; 	  {	
;        tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 4,X
;        tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 4,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and ,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 4,X
; 	    tmp&=0b11110000;       //看第n行是否有键按下
	and #-16
	sta 4,X
; 	    if(tmp!=0xf0)          //本行有键按下
	cmp #-16
	bne X1
	jmp L8
X1:
; 	     {
; 	        tmp=KB_P;
	lda 0
	sta 4,X
; 	        if(KB_P==0xE7||KB_P==0xB7)
	lda 0
	cmp #-25
	beq L12
	lda 0
	cmp #-73
	beq X2
	jmp L6
X2:
L12:
; 	        {
	jmp L14
L13:
; 	        while(1)
; 	        {
; 	        //*/
; 	        KB_Init1();
	jsr _KB_Init1
	tsx
; 	        line1=0b11101111;        //使第一根列线为0
	lda #-17
	sta 2,X
; 	 for(j=1;j<=3;j++)         //扫描3列,确定有无1~~~7键按下
	lda #1
	sta 3,X
	jmp L19
L16:
; 	  {	
; 	    tmp1=0b00001111;            //取KB_P->tmp
	lda #15
	sta 5,X
;         tmp1|=0b11110000;     //KB_P.7-4保留,KB_P.3-0为1
	ora #-16
	sta 5,X
;         KB_P=tmp&line1;       //令KB_P.n=0,n=0、1、2、3
	lda 4,X
	and 2,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp1=KB_P;
	lda 0
	sta 5,X
; 	    tmp1&=0b00001111;       //看第n行是否有键按下
	and #15
	sta 5,X
; 	    if(tmp1!=0x0f)          //本行有键按下
	cmp #15
	bne X3
	jmp L20
X3:
; 	     {  
; 	        
; 	        if(KB_P==0xEE&&tmp==0xE7)tmp=0xE6;
	lda 0
	cmp #-18
	bne L22
	lda 4,X
	cmp #-25
	bne L22
	lda #-26
	sta 4,X
	jmp L18
L22:
; 	        else if(KB_P==0xED&&tmp==0xE7)tmp=0xE5;
	lda 0
	cmp #-19
	bne L24
	lda 4,X
	cmp #-25
	bne L24
	lda #-27
	sta 4,X
	jmp L18
L24:
; 	        else if(KB_P==0xEB&&tmp==0xE7)tmp=0xE3;
	lda 0
	cmp #-21
	bne L26
	lda 4,X
	cmp #-25
	bne L26
	lda #-29
	sta 4,X
	jmp L18
L26:
; 	        else if(KB_P==0xBE&&tmp==0xB7)tmp=0xB6;
	lda 0
	cmp #-66
	bne L28
	lda 4,X
	cmp #-73
	bne L28
	lda #-74
	sta 4,X
	jmp L18
L28:
; 	        else if(KB_P==0xBD&&tmp==0xB7)tmp=0xB5;
	lda 0
	cmp #-67
	bne L30
	lda 4,X
	cmp #-73
	bne L30
	lda #-75
	sta 4,X
	jmp L18
L30:
; 	        else if(KB_P==0xEE&&tmp==0xB7)tmp=0xAA;
	lda 0
	cmp #-18
	bne L32
	lda 4,X
	cmp #-73
	bne L32
	lda #-86
	sta 4,X
	bra L18
L32:
; 	        else if(KB_P==0xED&&tmp==0xB7)tmp=0x55;
	lda 0
	cmp #-19
	bne L34
	lda 4,X
	cmp #-73
	bne L34
	lda #85
	sta 4,X
	bra L18
L34:
; 	        else if(KB_P==0xEB&&tmp==0xB7)tmp=0xA3;
	lda 0
	cmp #-21
	bne L36
	lda 4,X
	cmp #-73
	bne L36
	lda #-93
	sta 4,X
	bra L18
L36:
; 	        else if(KB_P==0xBE&&tmp==0xE7)tmp=0xA6;
	lda 0
	cmp #-66
	bne L38
	lda 4,X
	cmp #-25
	bne L38
	lda #-90
	sta 4,X
	bra L18
L38:
; 	        else if(KB_P==0xBD&&tmp==0xE7)tmp=0xA5;
	lda 0
	cmp #-67
	bne L40
	lda 4,X
	cmp #-25
	bne L40
	lda #-91
	sta 4,X
	bra L18
L40:
; 	        else tmp=KB_P&tmp;
	lda 0
	and 4,X
	sta 4,X
; 		    break;
	bra L18
L20:
	lda 2,X
	lsla
	add #16
	sta 2,X
L17:
	inc 3,X
L19:
	lda 3,X
	cmp #3
	bhi X4
	jmp L16
X4:
L18:
	lda 3,X
	cmp #4
	bne L15
	lda #-1
	sta 4,X
	bra L15
L14:
	jmp L13
L15:
; 	     }
; 	     
; 	     else                  //本行无键按下,扫描下一列
; 		    line1=(line1<<1)+0x10; 
; 		 
; 	 }	
; 	 
; 	
; 	  if(j==4)   tmp=0xff;
; 	  break;
; 	 }
; 	  return(tmp);
	lda 4,X
	bra L3
X0:
; 	        
; 	        //*/
; 	        }
; 		    break;
L8:
	lda ,X
	lsla
	ora #1
	sta ,X
L5:
	inc 1,X
L7:
	lda 1,X
	cmp #4
	bhi X5
	jmp L4
X5:
L6:
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01; 
; 	 }	
; 	  if(i==5)   tmp=0xff;
	lda 1,X
	cmp #5
	bne L44
	lda #-1
	sta 4,X
L44:
; 	  return(tmp);
	lda 4,X
L3:
	ais #6
	.dbline 0 ; func end
	rts
	.area lit
_KB_Table::
	.byte 238,49
	.byte 222,50
	.byte 190,51
	.byte 237,52
	.byte 221,53
	.byte 189,54
	.byte 235,55
	.byte 231,42
	.byte 183,35
	.byte 230,'a
	.byte 198,'b
	.byte 166,'c
	.byte 229,'d
	.byte 197,'e
	.byte 165,'f
	.byte 227,'g
	.byte 170,'A
	.byte 150,'B
	.byte 182,'C
	.byte 'U,'D
	.byte 149,'E
	.byte 181,'F
	.byte 163,'G
	.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',0xED,'4',0xDD,'5',0xBD,'6',0xEB,'7',0xE7,'*',0xB7,'#',
;  0xE6,'a',0xC6,'b',0xA6,'c',0xE5,'d', 0xC5,'e', 0xA5,'f',0xE3,'g',//按键*1,*2,*3,*4,*5,*6,*7
;  0xAA,'A',0x96,'B',0xB6,'C',0x55,'D', 0x95,'E', 0xB5,'F',0xA3,'G',//按键#1,#2,#3,#4,#5,#6,#7
;  0x00};
; unsigned char KB_Def(unsigned char KB_valve)
;  {
;    unsigned char KeyPress;
;    unsigned char i;
;    unsigned char j;
;    i=0;
	clr 1,X
	bra L48
L47:
;    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 L50
;         {KeyPress=0xff; break;}  //返回0xff
	lda #-1
	sta ,X
	bra L49
L50:
;      else
;         //与键值相比较
;         if (j==KB_valve)         //找到       
	lda 2,X
	cmp 5,X
	bne L52
;            {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 L49
L52:
	lda 1,X
	add #2
	sta 1,X
L48:
	bra L47
L49:
;         else
;            i+=2;              //指向下一个键值,继续判断
;     };
;     return KeyPress;
	lda ,X
L46:
	ais #3
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

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