📄 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 ; INTKBSCR&= ~(1<<IntBit); //开放键盘中断(IMASKk=1)
0012 131A bclr #1,0x1a
0014 L1:
0014 .dbline 0 ; func end
0014 81 rts
0015 ; line -> 0,X
0015 ; i -> 1,X
0015 ; tmp -> 2,X
0015 _KB_Scan::
0015 A7FD ais #-3
0017 95 tsx
0018 ; }
0018 ; /*KB_Scan:扫描读取键值函数-----------------------------*
0018 ; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
0018 ; * 若无按键,*p为0xff *
0018 ; *参 数:无 *
0018 ; *返 回:扫描到的键值 *
0018 ; *-----------------------------------------------------*/
0018 ; unsigned char KB_Scan(void)
0018 ; {
0018 ; unsigned char line,i,tmp;
0018 ; line=0b11111110; //使第一根行线为0(低电平)
0018 A6FE lda #-2
001A F7 sta ,X
001B ; for(i=1;i<=4;i++) //将扫描4根行线
001B A601 lda #1
001D E701 sta 1,X
001F 2026 bra L6
0021 L3:
0021 ; {
0021 ; tmp=KB_P; //取KB_P->tmp
0021 B600 lda 0
0023 E702 sta 2,X
0025 ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
0025 AA0F ora #15
0027 E702 sta 2,X
0029 ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
0029 F4 and ,X
002A B700 sta 0
002C ; asm("NOP"); //等待,消除按键抖动
002C 9D NOP
002D ; asm("NOP");
002D 9D NOP
002E ; tmp=KB_P;
002E B600 lda 0
0030 E702 sta 2,X
0032 ; tmp&=0b11110000; //看第n行是否有键按下
0032 A4F0 and #-16
0034 E702 sta 2,X
0036 ; if(tmp!=0xf0) //本行有键按下
0036 A1F0 cmp #-16
0038 2706 beq L7
003A ; {
003A ; tmp=KB_P;
003A B600 lda 0
003C E702 sta 2,X
003E ; break;
003E 200D bra L5
0040 L7:
0040 F6 lda ,X
0041 48 lsla
0042 AA01 ora #1
0044 F7 sta ,X
0045 L4:
0045 6C01 inc 1,X
0047 L6:
0047 E601 lda 1,X
0049 A104 cmp #4
004B 23D4 bls L3
004D L5:
004D ; }
004D ; else //本行无键按下,扫描下一行
004D ; line=(line<<1)|0x01;
004D ; }
004D ; if(i==5) tmp=0xff;
004D E601 lda 1,X
004F A105 cmp #5
0051 2604 bne L9
0053 A6FF lda #-1
0055 E702 sta 2,X
0057 L9:
0057 ; return(tmp);
0057 E602 lda 2,X
0059 L2:
0059 A703 ais #3
005B .dbline 0 ; func end
005B 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 E72E .byte 231,46
001A D730 .byte 215,48
001C B73A .byte 183,58
001E 7744 .byte 'w,'D
0020 00 .byte 0
.area text
; KeyPress -> 0,X
; i -> 1,X
; j -> 2,X
; KB_valve -> 5,X
005C _KB_Def::
005C A7FD ais #-3
005E 95 tsx
005F ; }
005F ; /*KB_Def:键值转为定义值函数----------------------------*
005F ; *功 能:键值转为定义值 *
005F ; *参 数:键值 *
005F ; *返 回:键定义值 *
005F ; *-----------------------------------------------------*/
005F ; //键盘定义表
005F ; const unsigned char KB_Table[]=
005F ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
005F ; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
005F ; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
005F ; 0xE7,'.',0xD7,'0',0xB7,':',0x77,'D',
005F ; 0x00};
005F ; unsigned char KB_Def(unsigned char KB_valve)
005F ; {
005F ; unsigned char KeyPress;
005F ; unsigned char i;
005F ; unsigned char j;
005F ; i=0;
005F 6F01 clr 1,X
0061 203C bra L13
0063 L12:
0063 ; while(1)
0063 ; {
0063 ; j=KB_Table[i];
0063 3F00 clr *__r0
0065 E601 lda 1,X
0067 AB00 add #<_KB_Table
0069 B700 sta *__r1
006B B600 lda *__r0
006D A900 adc #>_KB_Table
006F B700 sta *__r0
0071 5500 ldhx *__r0
0073 F6 lda ,x
0074 95 tsx
0075 E702 sta 2,X
0077 ; //与0(定义表结束标志)相比较
0077 ; if (j==0) //=0,即表中无次定义值
0077 2605 bne L15
0079 ; {KeyPress=0xff; break;} //返回0xff
0079 A6FF lda #-1
007B F7 sta ,X
007C 2023 bra L14
007E L15:
007E ; else
007E ; //与键值相比较
007E ; if (j==KB_valve) //找到
007E E602 lda 2,X
0080 E105 cmp 5,X
0082 2615 bne L17
0084 ; {KeyPress=KB_Table[i+1];break;} //取键定义值
0084 3F00 clr *__r0
0086 E601 lda 1,X
0088 AB01 add #<_KB_Table+1
008A B700 sta *__r1
008C B600 lda *__r0
008E A901 adc #>_KB_Table+1
0090 B700 sta *__r0
0092 5500 ldhx *__r0
0094 F6 lda ,x
0095 95 tsx
0096 F7 sta ,X
0097 2008 bra L14
0099 L17:
0099 E601 lda 1,X
009B AB02 add #2
009D E701 sta 1,X
009F L13:
009F 20C2 bra L12
00A1 L14:
00A1 ; else
00A1 ; i+=2; //指向下一个键值,继续判断
00A1 ; };
00A1 ; return KeyPress;
00A1 F6 lda ,X
00A2 L11:
00A2 A703 ais #3
00A4 .dbline 0 ; func end
00A4 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -