📄 kbsub.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 + -