📄 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:键盘初始化函数--------3-----------------------*
; *功 能:初始化键盘中断的引脚,但未开放键盘中断 *
; *参 数:无 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void KB_Init(void)
; {
; KB_P=0x00; //复位KB_P
clr 0
; KB_D=0b11110000; //定定义3-0为输入,7-4为输出
lda #-16
sta 0x4
; KB_PUE=0b00001111; //定义输入引脚有内部上拉电阻
lda #15
sta 0xd
L1:
.dbline 0 ; func end
rts
; line -> 0,X
; i -> 1,X
; tmp -> 2,X
_KB_Scan1::
ais #-3
tsx
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
; * 若无按键,*p为0xff *
; *参 数:无 *
; *返 回:扫描到的键值 *
; *-----------------------------------------------------*/
; unsigned char KB_Scan1(void)
; {
; unsigned char line,i,tmp;
; line=0b11101111; //使第一根列线为0(低电平)
lda #-17
sta ,X
; for(i=1;i<=4;i++) //将扫描4根行线
lda #1
sta 1,X
bra L6
L3:
; {
; tmp=KB_P; //取KB_P->tmp
lda 0
sta 2,X
; tmp|=0b11110000; //KB_P.3-0保留,KB_P.7-4为1
ora #-16
sta 2,X
; KB_P=tmp&line; //令KB_P.n=0,n=4、5、6、7
and ,X
sta 0
; asm("NOP"); //等待,消除按键抖动
NOP
; asm("NOP");
NOP
; tmp=KB_P;
lda 0
sta 2,X
; tmp&=0b00001111; //看第n行是否有键按下
and #15
sta 2,X
; if(tmp!=0x0f) //本行有键按下
cmp #15
beq L7
; {
; tmp=KB_P;
lda 0
sta 2,X
; break;
bra L5
L7:
lda ,X
lsla
ora #1
sta ,X
L4:
inc 1,X
L6:
lda 1,X
cmp #4
bls L3
L5:
;
; }
; else //本行无键按下,扫描下一行
; line=(line<<1)|0x01;
; }
; if(i==5) tmp=0xff;
lda 1,X
cmp #5
bne L9
lda #-1
sta 2,X
L9:
; return(tmp);
lda 2,X
L2:
ais #3
.dbline 0 ; func end
rts
; line -> 0,X
; i -> 1,X
; tmp -> 2,X
_KB_Scan2::
ais #-3
tsx
; }
;
;
; unsigned char KB_Scan2(void)
; {
; unsigned char line,i,tmp;
; line=0b01111111; //使最后一根列线为0(低电平)
lda #127
sta ,X
; for(i=1;i<=4;i++) //将扫描4根行线
lda #1
sta 1,X
bra L15
L12:
; {
; tmp=KB_P; //取KB_P->tmp
lda 0
sta 2,X
; tmp|=0b11110000; //KB_P.3-0保留,KB_P.7-4为1
ora #-16
sta 2,X
; KB_P=tmp&line; //令KB_P.n=0,n=4、5、6、7
and ,X
sta 0
; asm("NOP"); //等待,消除按键抖动
NOP
; asm("NOP");
NOP
; tmp=KB_P;
lda 0
sta 2,X
; tmp&=0b00001111; //看第n行是否有键按下
and #15
sta 2,X
; if(tmp!=0x0f) //本行有键按下
cmp #15
beq L16
; {
; tmp=KB_P;
lda 0
sta 2,X
; break;
bra L14
L16:
lda ,X
lsra
add #-128
sta ,X
L13:
inc 1,X
L15:
lda 1,X
cmp #4
bls L12
L14:
; }
; else //本行无键按下,扫描下一行
; line=(line>>1)+128;
; }
; if(i==5) tmp=0xff;
lda 1,X
cmp #5
bne L18
lda #-1
sta 2,X
L18:
; return(tmp);
lda 2,X
L11:
ais #3
.dbline 0 ; func end
rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -