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

📄 kbsub.s

📁 飞思卡尔的键盘中断源代码,C语言写的,很不错的
💻 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_doubleInit::
; }
; 
; void KB_doubleInit(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=0b11110000;   //允许输入引脚的中断可进入
	lda #-16
	sta 0x1b
; 	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
	bset #2,0x1a
L2:
	.dbline 0 ; func end
	rts
;           line -> 0,X
;              i -> 1,X
;            tmp -> 2,X
_KB_Scan::
	ais #-3
	tsx
; }
; 
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
; *         若无按键,*p为0xff                           *
; *参  数:无                                             *
; *返  回:扫描到的键值                                   *
; *-----------------------------------------------------*/  
; unsigned char KB_Scan(void) 
;  {
; 	 unsigned char line,i,tmp;
;      line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta ,X
; 	 for(i=1;i<=4;i++)         //将扫描4根行线
	lda #1
	sta 1,X
	bra L7
L4:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 2,X
;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 2,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 2,X
; 	    tmp&=0b11110000;       //看第n行是否有键按下
	and #-16
	sta 2,X
; 	    if(tmp!=0xf0)          //本行有键按下
	cmp #-16
	beq L8
; 	     {
; 	        tmp=KB_P;
	lda 0
	sta 2,X
; 		    break;
	bra L6
L8:
	lda ,X
	lsla
	ora #1
	sta ,X
L5:
	inc 1,X
L7:
	lda 1,X
	cmp #4
	bls L4
L6:
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01;
; 		     
; 	 }	
; 	  if(i==5)   tmp=0xff;
	lda 1,X
	cmp #5
	bne L10
	lda #-1
	sta 2,X
L10:
; 	  return(tmp);
	lda 2,X
L3:
	ais #3
	.dbline 0 ; func end
	rts
;           tmp0 -> 0,X
;           line -> 1,X
;              i -> 2,X
;            tmp -> 3,X
_KB_doubleScan::
	ais #-4
	tsx
;  }
; //处理双键
; unsigned char KB_doubleScan(void)
; {
;  unsigned char line,i,tmp,tmp0;
;  tmp0=KB_Scan( );
	jsr _KB_Scan
	tsx
	sta *__r1
	sta ,X
;  if(tmp0==0xE7||tmp0==0xD7)
	cmp #-25
	beq L15
	cmp #-41
	bne L13
L15:
;    {
;       line=0b01111111;        //使第一根列线为0(低电平)
	lda #127
	sta 1,X
; 	 for(i=1;i<=4;i++)         //将扫描4根行线
	lda #1
	sta 2,X
	bra L19
L16:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 3,X
;         tmp|=0b11110000;     //KB_P.7-4保留,KB_P.3-0为1
	ora #-16
	sta 3,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and 1,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 3,X
; 	    //tmp&=0b00001111;       //看第n行是否有键按下
; 	    if(tmp!=0xE7||tmp!=0xD7)          //本行有键按下
	cmp #-25
	bne L22
	cmp #-41
	beq L20
L22:
; 	     {
; 	        tmp=KB_P;
	lda 0
	sta 3,X
; 		    break;
	bra L18
L20:
	lda 1,X
	lsra
	ora #-128
	sta 1,X
L17:
	inc 2,X
L19:
	lda 2,X
	cmp #4
	bls L16
L18:
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line>>1)|0x80;
; 		     
; 	 }	
; 	  if(i==5)   tmp=0xff;
	lda 2,X
	cmp #5
	bne L23
	lda #-1
	sta 3,X
L23:
; 	  return(tmp); 
	lda 3,X
L13:
L12:
	ais #4
	.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 L27
L26:
;    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 L29
;         {KeyPress=0xff; break;}  //返回0xff
	lda #-1
	sta ,X
	bra L28
L29:
;      else
;         //与键值相比较
;         if (j==KB_valve)         //找到       
	lda 2,X
	cmp 5,X
	bne L31
;            {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 L28
L31:
	lda 1,X
	add #2
	sta 1,X
L27:
	bra L26
L28:
;         else
;            i+=2;              //指向下一个键值,继续判断
;     };
;     return KeyPress;
	lda ,X
L25:
	ais #3
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

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