📄 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 ; line -> 0,X
0013 ; i -> 1,X
0013 ; tmp -> 2,X
0013 ; j -> 3,X
0013 _KB_Scan::
0013 A7FC ais #-4
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,j,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 2032 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 2712 beq L7
0038 ; {
0038 6F03 clr 3,X
003A 2002 bra L12
003C L9:
003C L10:
003C 6C03 inc 3,X
003E L12:
003E ; for(j=0;j<250;j++);
003E E603 lda 3,X
0040 A1FA cmp #-6
0042 25F8 blo L9
0044 ; tmp=KB_P;
0044 B600 lda 0
0046 E702 sta 2,X
0048 ; break;
0048 200D bra L5
004A L7:
004A F6 lda ,X
004B 48 lsla
004C AA01 ora #1
004E F7 sta ,X
004F L4:
004F 6C01 inc 1,X
0051 L6:
0051 E601 lda 1,X
0053 A104 cmp #4
0055 23C8 bls L3
0057 L5:
0057 ; }
0057 ; else //本行无键按下,扫描下一行
0057 ; line=(line<<1)|0x01;
0057 ; }
0057 ; if(i==5) tmp=0xff;
0057 E601 lda 1,X
0059 A105 cmp #5
005B 2604 bne L13
005D A6FF lda #-1
005F E702 sta 2,X
0061 L13:
0061 ; return(tmp);
0061 E602 lda 2,X
0063 L2:
0063 A704 ais #4
0065 .dbline 0 ; func end
0065 81 rts
.area lit
0000 _KB_Table::
0000 EE31 .byte 238,49
0002 DE32 .byte 222,50
0004 BE33 .byte 190,51
0006 7E2B .byte 126,43
0008 ED34 .byte 237,52
000A DD35 .byte 221,53
000C BD36 .byte 189,54
000E 7D2D .byte 125,45
0010 EB37 .byte 235,55
0012 DB38 .byte 219,56
0014 BB39 .byte 187,57
0016 7B2A .byte 123,42
0018 E73C .byte 231,60
001A D730 .byte 215,48
001C B73D .byte 183,61
001E 772F .byte 'w,47
0020 00 .byte 0
.area text
; KeyPress -> 0,X
; i -> 1,X
; j -> 2,X
; KB_valve -> 5,X
0066 _KB_Def::
0066 A7FD ais #-3
0068 95 tsx
0069 ; }
0069 ; /*KB_Def:键值转为定义值函数----------------------------*
0069 ; *功 能:键值转为定义值 *
0069 ; *参 数:键值 *
0069 ; *返 回:键定义值 *
0069 ; *-----------------------------------------------------*/
0069 ; //键盘定义表
0069 ; const unsigned char KB_Table[]=
0069 ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'+',
0069 ; 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'-',
0069 ; 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'*',
0069 ; 0xE7,'<',0xD7,'0',0xB7,'=',0x77,'/',
0069 ; 0x00};
0069 ; unsigned char KB_Def(unsigned char KB_valve)
0069 ; {
0069 ; unsigned char KeyPress;
0069 ; unsigned char i;
0069 ; unsigned char j;
0069 ; i=0;
0069 6F01 clr 1,X
006B 203C bra L17
006D L16:
006D ; while(1)
006D ; {
006D ; j=KB_Table[i];
006D 3F00 clr *__r0
006F E601 lda 1,X
0071 AB00 add #<_KB_Table
0073 B700 sta *__r1
0075 B600 lda *__r0
0077 A900 adc #>_KB_Table
0079 B700 sta *__r0
007B 5500 ldhx *__r0
007D F6 lda ,x
007E 95 tsx
007F E702 sta 2,X
0081 ; //与0(定义表结束标志)相比较
0081 ; if (j==0) //=0,即表中无次定义值
0081 2605 bne L19
0083 ; {KeyPress=0xff; break;} //返回0xff
0083 A6FF lda #-1
0085 F7 sta ,X
0086 2023 bra L18
0088 L19:
0088 ; else
0088 ; //与键值相比较
0088 ; if (j==KB_valve) //找到
0088 E602 lda 2,X
008A E105 cmp 5,X
008C 2615 bne L21
008E ; {KeyPress=KB_Table[i+1];break;} //取键定义值
008E 3F00 clr *__r0
0090 E601 lda 1,X
0092 AB01 add #<_KB_Table+1
0094 B700 sta *__r1
0096 B600 lda *__r0
0098 A901 adc #>_KB_Table+1
009A B700 sta *__r0
009C 5500 ldhx *__r0
009E F6 lda ,x
009F 95 tsx
00A0 F7 sta ,X
00A1 2008 bra L18
00A3 L21:
00A3 E601 lda 1,X
00A5 AB02 add #2
00A7 E701 sta 1,X
00A9 L17:
00A9 20C2 bra L16
00AB L18:
00AB ; else
00AB ; i+=2; //指向下一个键值,继续判断
00AB ; };
00AB ; return KeyPress;
00AB F6 lda ,X
00AC L15:
00AC A703 ais #3
00AE .dbline 0 ; func end
00AE 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -