📄 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 ; /*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 _KB_doubleInit::
0013 ; }
0013 ;
0013 ; void KB_doubleInit(void)
0013 ; {
0013 ; KB_P=0x00; //复位KB_P
0013 3F00 clr 0
0015 ; KB_D=0b11110000; //定定义7-4为输入,3-0为输出
0015 A6F0 lda #-16
0017 B704 sta 0x4
0019 ; KB_PUE=0b00001111; //定义输入引脚有内部上拉电阻
0019 A60F lda #15
001B B70D sta 0xd
001D ; INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
001D 121A bset #1,0x1a
001F ; INTKBIER=0b11110000; //允许输入引脚的中断可进入
001F A6F0 lda #-16
0021 B71B sta 0x1b
0023 ; INTKBSCR|= (1<<ACKKBit); //清键盘中断请求(ACKK=1)
0023 141A bset #2,0x1a
0025 L2:
0025 .dbline 0 ; func end
0025 81 rts
0026 ; line -> 0,X
0026 ; i -> 1,X
0026 ; tmp -> 2,X
0026 _KB_Scan::
0026 A7FD ais #-3
0028 95 tsx
0029 ; }
0029 ;
0029 ; /*KB_Scan:扫描读取键值函数-----------------------------*
0029 ; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
0029 ; * 若无按键,*p为0xff *
0029 ; *参 数:无 *
0029 ; *返 回:扫描到的键值 *
0029 ; *-----------------------------------------------------*/
0029 ; unsigned char KB_Scan(void)
0029 ; {
0029 ; unsigned char line,i,tmp;
0029 ; line=0b11111110; //使第一根行线为0(低电平)
0029 A6FE lda #-2
002B F7 sta ,X
002C ; for(i=1;i<=4;i++) //将扫描4根行线
002C A601 lda #1
002E E701 sta 1,X
0030 2026 bra L7
0032 L4:
0032 ; {
0032 ; tmp=KB_P; //取KB_P->tmp
0032 B600 lda 0
0034 E702 sta 2,X
0036 ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
0036 AA0F ora #15
0038 E702 sta 2,X
003A ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
003A F4 and ,X
003B B700 sta 0
003D ; asm("NOP"); //等待,消除按键抖动
003D 9D NOP
003E ; asm("NOP");
003E 9D NOP
003F ; tmp=KB_P;
003F B600 lda 0
0041 E702 sta 2,X
0043 ; tmp&=0b11110000; //看第n行是否有键按下
0043 A4F0 and #-16
0045 E702 sta 2,X
0047 ; if(tmp!=0xf0) //本行有键按下
0047 A1F0 cmp #-16
0049 2706 beq L8
004B ; {
004B ; tmp=KB_P;
004B B600 lda 0
004D E702 sta 2,X
004F ; break;
004F 200D bra L6
0051 L8:
0051 F6 lda ,X
0052 48 lsla
0053 AA01 ora #1
0055 F7 sta ,X
0056 L5:
0056 6C01 inc 1,X
0058 L7:
0058 E601 lda 1,X
005A A104 cmp #4
005C 23D4 bls L4
005E L6:
005E ; }
005E ; else //本行无键按下,扫描下一行
005E ; line=(line<<1)|0x01;
005E ;
005E ; }
005E ; if(i==5) tmp=0xff;
005E E601 lda 1,X
0060 A105 cmp #5
0062 2604 bne L10
0064 A6FF lda #-1
0066 E702 sta 2,X
0068 L10:
0068 ; return(tmp);
0068 E602 lda 2,X
006A L3:
006A A703 ais #3
006C .dbline 0 ; func end
006C 81 rts
006D ; tmp0 -> 0,X
006D ; line -> 1,X
006D ; i -> 2,X
006D ; tmp -> 3,X
006D _KB_doubleScan::
006D A7FC ais #-4
006F 95 tsx
0070 ; }
0070 ; //处理双键
0070 ; unsigned char KB_doubleScan(void)
0070 ; {
0070 ; unsigned char line,i,tmp,tmp0;
0070 ; tmp0=KB_Scan( );
0070 CD0026 jsr _KB_Scan
0073 95 tsx
0074 B700 sta *__r1
0076 F7 sta ,X
0077 ; if(tmp0==0xE7||tmp0==0xD7)
0077 A1E7 cmp #-25
0079 2704 beq L15
007B A1D7 cmp #-41
007D 2645 bne L13
007F L15:
007F ; {
007F ; line=0b01111111; //使第一根列线为0(低电平)
007F A67F lda #127
0081 E701 sta 1,X
0083 ; for(i=1;i<=4;i++) //将扫描4根行线
0083 A601 lda #1
0085 E702 sta 2,X
0087 2029 bra L19
0089 L16:
0089 ; {
0089 ; tmp=KB_P; //取KB_P->tmp
0089 B600 lda 0
008B E703 sta 3,X
008D ; tmp|=0b11110000; //KB_P.7-4保留,KB_P.3-0为1
008D AAF0 ora #-16
008F E703 sta 3,X
0091 ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
0091 E401 and 1,X
0093 B700 sta 0
0095 ; asm("NOP"); //等待,消除按键抖动
0095 9D NOP
0096 ; asm("NOP");
0096 9D NOP
0097 ; tmp=KB_P;
0097 B600 lda 0
0099 E703 sta 3,X
009B ; //tmp&=0b00001111; //看第n行是否有键按下
009B ; if(tmp!=0xE7||tmp!=0xD7) //本行有键按下
009B A1E7 cmp #-25
009D 2604 bne L22
009F A1D7 cmp #-41
00A1 2706 beq L20
00A3 L22:
00A3 ; {
00A3 ; tmp=KB_P;
00A3 B600 lda 0
00A5 E703 sta 3,X
00A7 ; break;
00A7 200F bra L18
00A9 L20:
00A9 E601 lda 1,X
00AB 44 lsra
00AC AA80 ora #-128
00AE E701 sta 1,X
00B0 L17:
00B0 6C02 inc 2,X
00B2 L19:
00B2 E602 lda 2,X
00B4 A104 cmp #4
00B6 23D1 bls L16
00B8 L18:
00B8 ; }
00B8 ; else //本行无键按下,扫描下一行
00B8 ; line=(line>>1)|0x80;
00B8 ;
00B8 ; }
00B8 ; if(i==5) tmp=0xff;
00B8 E602 lda 2,X
00BA A105 cmp #5
00BC 2604 bne L23
00BE A6FF lda #-1
00C0 E703 sta 3,X
00C2 L23:
00C2 ; return(tmp);
00C2 E603 lda 3,X
00C4 L13:
00C4 L12:
00C4 A704 ais #4
00C6 .dbline 0 ; func end
00C6 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
00C7 _KB_Def::
00C7 A7FD ais #-3
00C9 95 tsx
00CA ; }
00CA ;
00CA ;
00CA ;
00CA ;
00CA ; }
00CA ;
00CA ; /*KB_Def:键值转为定义值函数----------------------------*
00CA ; *功 能:键值转为定义值 *
00CA ; *参 数:键值 *
00CA ; *返 回:键定义值 *
00CA ; *-----------------------------------------------------*/
00CA ; //键盘定义表
00CA ; const unsigned char KB_Table[]=
00CA ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
00CA ; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
00CA ; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
00CA ; 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
00CA ; 0x00};
00CA ; unsigned char KB_Def(unsigned char KB_valve)
00CA ; {
00CA ; unsigned char KeyPress;
00CA ; unsigned char i;
00CA ; unsigned char j;
00CA ; i=0;
00CA 6F01 clr 1,X
00CC 203C bra L27
00CE L26:
00CE ; while(1)
00CE ; {
00CE ; j=KB_Table[i];
00CE 3F00 clr *__r0
00D0 E601 lda 1,X
00D2 AB00 add #<_KB_Table
00D4 B700 sta *__r1
00D6 B600 lda *__r0
00D8 A900 adc #>_KB_Table
00DA B700 sta *__r0
00DC 5500 ldhx *__r0
00DE F6 lda ,x
00DF 95 tsx
00E0 E702 sta 2,X
00E2 ; //与0(定义表结束标志)相比较
00E2 ; if (j==0) //=0,即表中无次定义值
00E2 2605 bne L29
00E4 ; {KeyPress=0xff; break;} //返回0xff
00E4 A6FF lda #-1
00E6 F7 sta ,X
00E7 2023 bra L28
00E9 L29:
00E9 ; else
00E9 ; //与键值相比较
00E9 ; if (j==KB_valve) //找到
00E9 E602 lda 2,X
00EB E105 cmp 5,X
00ED 2615 bne L31
00EF ; {KeyPress=KB_Table[i+1];break;} //取键定义值
00EF 3F00 clr *__r0
00F1 E601 lda 1,X
00F3 AB01 add #<_KB_Table+1
00F5 B700 sta *__r1
00F7 B600 lda *__r0
00F9 A901 adc #>_KB_Table+1
00FB B700 sta *__r0
00FD 5500 ldhx *__r0
00FF F6 lda ,x
0100 95 tsx
0101 F7 sta ,X
0102 2008 bra L28
0104 L31:
0104 E601 lda 1,X
0106 AB02 add #2
0108 E701 sta 1,X
010A L27:
010A 20C2 bra L26
010C L28:
010C ; else
010C ; i+=2; //指向下一个键值,继续判断
010C ; };
010C ; return KeyPress;
010C F6 lda ,X
010D L25:
010D A703 ais #3
010F .dbline 0 ; func end
010F 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -