?? kbsub.lis
字號:
.module KBSub.c
.area text
0000 _KB_Init::
0000 ; /*-----------------------------------------------------*
0000 ; *文件描述:本文件包含了H08C鍵盤中斷子函數(shù),分別為: *
0000 ; *(1)KB_Init:鍵盤初始化函數(shù) *
0000 ; * void KB_Init(void) *
0000 ; *(2)KB_Scan:掃描讀取鍵值函數(shù) *
0000 ; * unsigned char KB_Scan(void) *
0000 ; *(3)KB_Def:鍵值轉為定義值函數(shù) *
0000 ; * unsigned char KB_Def(unsigned char KB_valve) *
0000 ; *-----------------------------------------------------*/
0000 ; /*[以下為子程序源代碼]*/
0000 ; /*[頭文件]*/
0000 ; #include "GP32C.H"
0000 ; #include "KB.h"
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ; /*KB_Init:鍵盤初始化函數(shù)-------------------------------*
0000 ; *功 能:初始化鍵盤中斷的引腳,但未開放鍵盤中斷 *
0000 ; *參 數(shù):無 *
0000 ; *返 回:無 *
0000 ; *-----------------------------------------------------*/
0000 ; void KB_Init(void)
0000 ; {
0000 ; KB_P=0x00; //復位KB_P
0000 3F00 clr 0
0002 ; KB_D=0b00001111; //定定義7-4為輸入,3-0為輸出
0002 A60F lda #15
0004 B704 sta 0x4
0006 ; KB_PUE=0b11110000; //定義輸入引腳有內部上拉電阻
0006 A6F0 lda #-16
0008 B70D sta 0xd
000A ; INTKBSCR|= (1<<IntBit);//屏蔽鍵盤中斷(IMASKk=1)
000A 121A bset #1,0x1a
000C ; INTKBIER=0b11110000; //允許輸入引腳的中斷可進入
000C A6F0 lda #-16
000E B71B sta 0x1b
0010 ; INTKBSCR|= (1<<ACKKBit); //清鍵盤中斷請求(ACKK=1)
0010 141A bset #2,0x1a
0012 L1:
0012 .dbline 0 ; func end
0012 81 rts
0013 ; line -> 0,X
0013 ; i -> 1,X
0013 ; tmp -> 2,X
0013 _KB_Scan::
0013 A7FD ais #-3
0015 95 tsx
0016 ; }
0016 ; /*KB_Scan:掃描讀取鍵值函數(shù)-----------------------------*
0016 ; *功 能:掃描一次4*4鍵盤上的按鍵,讀取鍵值->*p *
0016 ; * 若無按鍵,*p為0xff *
0016 ; *參 數(shù):無 *
0016 ; *返 回:掃描到的鍵值 *
0016 ; *-----------------------------------------------------*/
0016 ; unsigned char KB_Scan(void)
0016 ; {
0016 ; unsigned char line,i,tmp;
0016 ; line=0b11111110; //使第一根行線為0(低電平)
0016 A6FE lda #-2
0018 F7 sta ,X
0019 ; for(i=1;i<=4;i++) //將掃描4根行線
0019 A601 lda #1
001B E701 sta 1,X
001D 2026 bra L6
001F L3:
001F ; {
001F ; tmp=KB_P; //取KB_P->tmp
001F B600 lda 0
0021 E702 sta 2,X
0023 ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0為1
0023 AA0F ora #15
0025 E702 sta 2,X
0027 ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
0027 F4 and ,X
0028 B700 sta 0
002A ; asm("NOP"); //等待,消除按鍵抖動
002A 9D NOP
002B ; asm("NOP");
002B 9D NOP
002C ; tmp=KB_P;
002C B600 lda 0
002E E702 sta 2,X
0030 ; tmp&=0b11110000; //看第n行是否有鍵按下
0030 A4F0 and #-16
0032 E702 sta 2,X
0034 ; if(tmp!=0xf0) //本行有鍵按下
0034 A1F0 cmp #-16
0036 2706 beq L7
0038 ; {
0038 ; tmp=KB_P;
0038 B600 lda 0
003A E702 sta 2,X
003C ; break;
003C 200D bra L5
003E L7:
003E F6 lda ,X
003F 48 lsla
0040 AA01 ora #1
0042 F7 sta ,X
0043 L4:
0043 6C01 inc 1,X
0045 L6:
0045 E601 lda 1,X
0047 A104 cmp #4
0049 23D4 bls L3
004B L5:
004B ; }
004B ; else //本行無鍵按下,掃描下一行
004B ; line=(line<<1)|0x01;
004B ; }
004B ; if(i==5) tmp=0xff;
004B E601 lda 1,X
004D A105 cmp #5
004F 2604 bne L9
0051 A6FF lda #-1
0053 E702 sta 2,X
0055 L9:
0055 ; return(tmp);
0055 E602 lda 2,X
0057 L2:
0057 A703 ais #3
0059 .dbline 0 ; func end
0059 81 rts
.area lit
0000 _KB_Table::
0000 EE31 .byte 238,49
0002 DE32 .byte 222,50
0004 BE33 .byte 190,51
0006 7E41 .byte 126,'A
0008 ED34 .byte 237,52
000A DD35 .byte 221,53
000C BD36 .byte 189,54
000E 7D42 .byte 125,'B
0010 EB37 .byte 235,55
0012 DB38 .byte 219,56
0014 BB39 .byte 187,57
0016 7B43 .byte 123,'C
0018 E72A .byte 231,42
001A D730 .byte 215,48
001C B723 .byte 183,35
001E 7744 .byte 'w,'D
0020 00 .byte 0
.area text
; KeyPress -> 0,X
; i -> 1,X
; j -> 2,X
; KB_valve -> 5,X
005A _KB_Def::
005A A7FD ais #-3
005C 95 tsx
005D ; }
005D ; /*KB_Def:鍵值轉為定義值函數(shù)----------------------------*
005D ; *功 能:鍵值轉為定義值 *
005D ; *參 數(shù):鍵值 *
005D ; *返 回:鍵定義值 *
005D ; *-----------------------------------------------------*/
005D ; //鍵盤定義表
005D ; const unsigned char KB_Table[]=
005D ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
005D ; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
005D ; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
005D ; 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
005D ; 0x00};
005D ; unsigned char KB_Def(unsigned char KB_valve)
005D ; {
005D ; unsigned char KeyPress;
005D ; unsigned char i;
005D ; unsigned char j;
005D ; i=0;
005D 6F01 clr 1,X
005F 203C bra L13
0061 L12:
0061 ; while(1)
0061 ; {
0061 ; j=KB_Table[i];
0061 3F00 clr *__r0
0063 E601 lda 1,X
0065 AB00 add #<_KB_Table
0067 B700 sta *__r1
0069 B600 lda *__r0
006B A900 adc #>_KB_Table
006D B700 sta *__r0
006F 5500 ldhx *__r0
0071 F6 lda ,x
0072 95 tsx
0073 E702 sta 2,X
0075 ; //與0(定義表結束標志)相比較
0075 ; if (j==0) //=0,即表中無次定義值
0075 2605 bne L15
0077 ; {KeyPress=0xff; break;} //返回0xff
0077 A6FF lda #-1
0079 F7 sta ,X
007A 2023 bra L14
007C L15:
007C ; else
007C ; //與鍵值相比較
007C ; if (j==KB_valve) //找到
007C E602 lda 2,X
007E E105 cmp 5,X
0080 2615 bne L17
0082 ; {KeyPress=KB_Table[i+1];break;} //取鍵定義值
0082 3F00 clr *__r0
0084 E601 lda 1,X
0086 AB01 add #<_KB_Table+1
0088 B700 sta *__r1
008A B600 lda *__r0
008C A901 adc #>_KB_Table+1
008E B700 sta *__r0
0090 5500 ldhx *__r0
0092 F6 lda ,x
0093 95 tsx
0094 F7 sta ,X
0095 2008 bra L14
0097 L17:
0097 E601 lda 1,X
0099 AB02 add #2
009B E701 sta 1,X
009D L13:
009D 20C2 bra L12
009F L14:
009F ; else
009F ; i+=2; //指向下一個鍵值,繼續(xù)判斷
009F ; };
009F ; return KeyPress;
009F F6 lda ,X
00A0 L11:
00A0 A703 ais #3
00A2 .dbline 0 ; func end
00A2 81 rts
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -