📄 kb.s
字号:
.module kb.c
.area text
_KB_Init::
; #include "GP32C.H"
; #include "DJC.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
; tmp1 -> 0,X
; isL -> 1,X
; isH -> 2,X
; data -> 3,X
; line -> 4,X
; i -> 5,X
; tmp -> 6,X
_KB_Scan::
ais #-7
tsx
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
; * 若无按键,*p为0xff *
; *参 数:无 *
; *返 回:扫描到的键值 *
; *-----------------------------------------------------*/
; unsigned char KB_Scan(void)
; {
; unsigned char line,i,tmp,tmp1,data=0x00,isH=0,isL=0;
clr 3,X
clr 2,X
clr 1,X
; KB_Init();
jsr _KB_Init
tsx
; line=0b11110111; //取第四行为零,先识别高低键
lda #-9
sta 4,X
; 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 L3
; {
; if((tmp&0b00010000)==0) isL=10;//按下了*
bit #16
bne L5
lda #10
sta 1,X
L5:
; if((tmp&0b00100000)==0)isH=10; //按下了0
lda 6,X
bit #32
bne L7
lda #10
sta 2,X
L7:
; }
L3:
; line=0b11111110; //使第一根行线为0(低电平)
lda #-2
sta 4,X
; for(i=0;i<3;i++) //将扫描3根行线
clr 5,X
bra L12
L9:
; {
; 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 L13
; {
; if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
cmp #-32
bne L15
lda 5,X
ldx #3
mul
tsx
add #1
sta 3,X
bra L11
L15:
; if(i==2)break;
lda 5,X
cmp #2
bne L17
bra L11
L17:
; if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
lda 6,X
cmp #-48
bne L19
lda 5,X
ldx #3
mul
tsx
add #2
sta 3,X
bra L11
L19:
; if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
lda 6,X
cmp #-80
bne L14
lda 5,X
ldx #3
mul
tsx
add #3
sta 3,X
bra L11
X0:
; }
L13:
; else //本行无键按下,扫描下一行
; line=(line<<1)|0x01;
lda 4,X
lsla
ora #1
sta 4,X
L14:
L10:
inc 5,X
L12:
lda 5,X
cmp #3
blo L9
L11:
; }
; data=data+10+isH-isL; //自定义按键值,高为21~27,中为11~17,低为1~7
lda 3,X
add #10
add 2,X
sub 1,X
sta 3,X
; if((data%10)==0) data=0xff;//没有按1~7中的任意一个时,data=0;
ldx #10
clrh
div
pshh
pula
tsx
tsta
bne L23
lda #-1
sta 3,X
L23:
; return(data);
lda 3,X
L2:
ais #7
.dbline 0 ; func end
rts
; data -> 0,X
; tmp2 -> 1,X
; line -> 2,X
; i -> 3,X
; tmp1 -> 4,X
; tmp -> 5,X
_KB_ScanD::
ais #-6
tsx
; }
;
; unsigned char KB_ScanD(void)
; {
; unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
lda #-1
sta ,X
; line=0b11111110; //使第一根行线为0(低电平)
lda #-2
sta 2,X
; for(i=0;i<3;i++) //将扫描3根行线
clr 3,X
jmp L29
L26:
; {
; tmp=KB_P; //取KB_P->tmp
lda 0
sta 5,X
; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
ora #15
sta 5,X
; tmp=tmp&line; //令KB_P.n=0,n=0、1、2、3
and 2,X
sta 5,X
; KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
and #-9
sta 0
; asm("NOP"); //等待,消除按键抖动
NOP
; asm("NOP");
NOP
; tmp1=KB_P;
lda 0
sta 4,X
; tmp1&=0b11110000; //看第这两行是否有键按下
and #-16
sta 4,X
; if(tmp1!=0xf0) //有键按下
cmp #-16
bne X4
jmp L30
X4:
; {
; KB_P=tmp; //使第四根行线为1
lda 5,X
sta 0
; asm("NOP"); //等待,消除按键抖动
NOP
; asm("NOP");
NOP
; tmp2=KB_P;
lda 0
sta 1,X
; tmp2&=0b11110000;
and #-16
sta 1,X
; if(tmp2==0xf0) { //看第这i行是否有独立键按下
cmp #-16
bne L31
; tmp&=~(1<<MOVEB);//使第四根行线为0
lda 5,X
and #-9
sta 5,X
; tmp|=(1<<i); ///使第i根行线为1
mov #1,*__r0
lda 3,X
and #7
beq X3
X2:
lsl *__r0
dbnza X2
X3:
lda 5,X
ora *__r0
sta 5,X
; KB_P=tmp;
sta 0
; asm("NOP"); //等待,消除按键抖动
NOP
; asm("NOP");
NOP
; tmp=KB_P;
lda 0
sta 5,X
; tmp&=0b11110000;
and #-16
sta 5,X
; if(tmp==0xff){
cmp #-1
bne L31
; if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
lda 4,X
cmp #-32
bne L36
lda 3,X
ldx #3
mul
tsx
add #1
sta ,X
bra L28
L36:
; if(i==2)break;
lda 3,X
cmp #2
bne L38
bra L28
L38:
; if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
lda 4,X
cmp #-48
bne L31
lda 3,X
ldx #3
mul
tsx
add #22
sta ,X
bra L28
X1:
; }
; }
; }
L30:
; else //本行无键按下,扫描下一行
; line=(line<<1)|0x01;
lda 2,X
lsla
ora #1
sta 2,X
L31:
L27:
inc 3,X
L29:
lda 3,X
cmp #3
bhs X5
jmp L26
X5:
L28:
; }
; return(data);
lda ,X
L25:
ais #6
.dbline 0 ; func end
rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -