?? 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
; line -> 0,X
; i -> 1,X
; tmp -> 2,X
; j -> 3,X
_KB_Scan::
ais #-4
tsx
; }
; /*KB_Scan:掃描讀取鍵值函數-----------------------------*
; *功 能:掃描一次4*4鍵盤上的按鍵,讀取鍵值->*p *
; * 若無按鍵,*p為0xff *
; *參 數:無 *
; *返 回:掃描到的鍵值 *
; *-----------------------------------------------------*/
; unsigned char KB_Scan(void)
; {
; unsigned char line,i,j,tmp;
; line=0b11111110; //使第一根行線為0(低電平)
lda #-2
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|=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 L7
; {
clr 3,X
bra L12
L9:
L10:
inc 3,X
L12:
; for(j=0;j<250;j++);
lda 3,X
cmp #-6
blo L9
; 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 L13
lda #-1
sta 2,X
L13:
; return(tmp);
lda 2,X
L2:
ais #4
.dbline 0 ; func end
rts
.area lit
_KB_Table::
.byte 238,49
.byte 222,50
.byte 190,51
.byte 126,43
.byte 237,52
.byte 221,53
.byte 189,54
.byte 125,45
.byte 235,55
.byte 219,56
.byte 187,57
.byte 123,42
.byte 231,60
.byte 215,48
.byte 183,61
.byte 'w,47
.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,'+',
; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'-',
; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'*',
; 0xE7,'<',0xD7,'0',0xB7,'=',0x77,'/',
; 0x00};
; unsigned char KB_Def(unsigned char KB_valve)
; {
; unsigned char KeyPress;
; unsigned char i;
; unsigned char j;
; i=0;
clr 1,X
bra L17
L16:
; 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 L19
; {KeyPress=0xff; break;} //返回0xff
lda #-1
sta ,X
bra L18
L19:
; else
; //與鍵值相比較
; if (j==KB_valve) //找到
lda 2,X
cmp 5,X
bne L21
; {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 L18
L21:
lda 1,X
add #2
sta 1,X
L17:
bra L16
L18:
; else
; i+=2; //指向下一個鍵值,繼續判斷
; };
; return KeyPress;
lda ,X
L15:
ais #3
.dbline 0 ; func end
rts
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -