📄 kbsub.lis
字号:
.module KBSub.c
.area text
0000 _KB_Init::
0000 ; /*-----------------------------------------------------*
0000 ; *文件描述:本文件包含了H08C键盘中断子函数,分别为: *
0000 ; *(1)KB_Init:键盘初始化函数 *
0000 ; * void KB_Init(void) *
0000 ; *(2)KB_Scan:扫描读取键值函数 *
0000 ; * unsigned char KB_Scan(void) *
0000 ; *(3)KB_Def:键值转为定义值函数 *
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:键盘初始化函数-------------------------------*
0000 ; *功 能:初始化键盘中断的引脚,但未开放键盘中断 *
0000 ; *参 数:无 *
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:扫描读取键值函数-----------------------------*
0016 ; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
0016 ; * 若无按键,*p为0xff *
0016 ; *参 数:无 *
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:键值转为定义值函数----------------------------*
005D ; *功 能:键值转为定义值 *
005D ; *参 数:键值 *
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; //指向下一个键值,继续判断
009F ; };
009F ; return KeyPress;
009F F6 lda ,X
00A0 L11:
00A0 A703 ais #3
00A2 .dbline 0 ; func end
00A2 81 rts
00A3 ; temp -> 0,X
00A3 _GetKey::
00A3 A7FF ais #-1
00A5 95 tsx
00A6 ; }
00A6 ;
00A6 ; unsigned char GetKey(void) //判断并获得按下键的定义值
00A6 ; {
00A6 ; unsigned char temp;
00A6 ; temp=KB_Scan();
00A6 CD0013 jsr _KB_Scan
00A9 95 tsx
00AA B700 sta *__r1
00AC F7 sta ,X
00AD ; temp=KB_Def(temp);
00AD 87 psha
00AE CD005A jsr _KB_Def
00B1 A701 ais #1
00B3 95 tsx
00B4 B700 sta *__r1
00B6 F7 sta ,X
00B7 ; return temp;
00B7 L20:
00B7 A701 ais #1
00B9 .dbline 0 ; func end
00B9 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -