📄 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_Init1::
0013 ; }
0013 ; void KB_Init1(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=0b00001111; //允许输入引脚的中断可进入
001F A60F lda #15
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 ; line1 -> 2,X
0026 ; j -> 3,X
0026 ; tmp -> 4,X
0026 ; tmp1 -> 5,X
0026 _KB_Scan::
0026 A7FA ais #-6
0028 95 tsx
0029 ; }
0029 ; /*KB_Scan:扫描读取键值函数-----------------------------*
0029 ; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
0029 ; * 若无按键,*p为0xff *
0029 ; *参 数:无 *
0029 ; *返 回:扫描到的键值 *
0029 ; *-----------------------------------------------------*/
0029 ; unsigned char KB_Scan(void)
0029 ; {
0029 ;
0029 ; unsigned char line,i,j,tmp,tmp1,line1;
0029 ; KB_Init();
0029 CD0000 jsr _KB_Init
002C 95 tsx
002D ; line=0b11111110; //使第一根行线为0(低电平)
002D A6FE lda #-2
002F F7 sta ,X
0030 ; for(i=1;i<=4;i++) //将扫描4根行线
0030 A601 lda #1
0032 E701 sta 1,X
0034 CC0184 jmp L7
0037 L4:
0037 ; {
0037 ; tmp=KB_P; //取KB_P->tmp
0037 B600 lda 0
0039 E704 sta 4,X
003B ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
003B AA0F ora #15
003D E704 sta 4,X
003F ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
003F F4 and ,X
0040 B700 sta 0
0042 ; asm("NOP"); //等待,消除按键抖动
0042 9D NOP
0043 ; asm("NOP");
0043 9D NOP
0044 ; tmp=KB_P;
0044 B600 lda 0
0046 E704 sta 4,X
0048 ; tmp&=0b11110000; //看第n行是否有键按下
0048 A4F0 and #-16
004A E704 sta 4,X
004C ; if(tmp!=0xf0) //本行有键按下
004C A1F0 cmp #-16
004E 2603 bne X1
0050 CC017D jmp L8
0053 X1:
0053 ; {
0053 ; tmp=KB_P;
0053 B600 lda 0
0055 E704 sta 4,X
0057 ; if(KB_P==0xE7||KB_P==0xB7)
0057 B600 lda 0
0059 A1E7 cmp #-25
005B 2709 beq L12
005D B600 lda 0
005F A1B7 cmp #-73
0061 2703 beq X2
0063 CC018D jmp L6
0066 X2:
0066 L12:
0066 ; {
0066 CC0176 jmp L14
0069 L13:
0069 ; while(1)
0069 ; {
0069 ; //*/
0069 ; KB_Init1();
0069 CD0013 jsr _KB_Init1
006C 95 tsx
006D ; line1=0b11101111; //使第一根列线为0
006D A6EF lda #-17
006F E702 sta 2,X
0071 ; for(j=1;j<=3;j++) //扫描3列,确定有无1~~~7键按下
0071 A601 lda #1
0073 E703 sta 3,X
0075 CC0161 jmp L19
0078 L16:
0078 ; {
0078 ; tmp1=0b00001111; //取KB_P->tmp
0078 A60F lda #15
007A E705 sta 5,X
007C ; tmp1|=0b11110000; //KB_P.7-4保留,KB_P.3-0为1
007C AAF0 ora #-16
007E E705 sta 5,X
0080 ; KB_P=tmp&line1; //令KB_P.n=0,n=0、1、2、3
0080 E604 lda 4,X
0082 E402 and 2,X
0084 B700 sta 0
0086 ; asm("NOP"); //等待,消除按键抖动
0086 9D NOP
0087 ; asm("NOP");
0087 9D NOP
0088 ; tmp1=KB_P;
0088 B600 lda 0
008A E705 sta 5,X
008C ; tmp1&=0b00001111; //看第n行是否有键按下
008C A40F and #15
008E E705 sta 5,X
0090 ; if(tmp1!=0x0f) //本行有键按下
0090 A10F cmp #15
0092 2603 bne X3
0094 CC0158 jmp L20
0097 X3:
0097 ; {
0097 ;
0097 ; if(KB_P==0xEE&&tmp==0xE7)tmp=0xE6;
0097 B600 lda 0
0099 A1EE cmp #-18
009B 260D bne L22
009D E604 lda 4,X
009F A1E7 cmp #-25
00A1 2607 bne L22
00A3 A6E6 lda #-26
00A5 E704 sta 4,X
00A7 CC016A jmp L18
00AA L22:
00AA ; else if(KB_P==0xED&&tmp==0xE7)tmp=0xE5;
00AA B600 lda 0
00AC A1ED cmp #-19
00AE 260D bne L24
00B0 E604 lda 4,X
00B2 A1E7 cmp #-25
00B4 2607 bne L24
00B6 A6E5 lda #-27
00B8 E704 sta 4,X
00BA CC016A jmp L18
00BD L24:
00BD ; else if(KB_P==0xEB&&tmp==0xE7)tmp=0xE3;
00BD B600 lda 0
00BF A1EB cmp #-21
00C1 260D bne L26
00C3 E604 lda 4,X
00C5 A1E7 cmp #-25
00C7 2607 bne L26
00C9 A6E3 lda #-29
00CB E704 sta 4,X
00CD CC016A jmp L18
00D0 L26:
00D0 ; else if(KB_P==0xBE&&tmp==0xB7)tmp=0xB6;
00D0 B600 lda 0
00D2 A1BE cmp #-66
00D4 260D bne L28
00D6 E604 lda 4,X
00D8 A1B7 cmp #-73
00DA 2607 bne L28
00DC A6B6 lda #-74
00DE E704 sta 4,X
00E0 CC016A jmp L18
00E3 L28:
00E3 ; else if(KB_P==0xBD&&tmp==0xB7)tmp=0xB5;
00E3 B600 lda 0
00E5 A1BD cmp #-67
00E7 260D bne L30
00E9 E604 lda 4,X
00EB A1B7 cmp #-73
00ED 2607 bne L30
00EF A6B5 lda #-75
00F1 E704 sta 4,X
00F3 CC016A jmp L18
00F6 L30:
00F6 ; else if(KB_P==0xEE&&tmp==0xB7)tmp=0xAA;
00F6 B600 lda 0
00F8 A1EE cmp #-18
00FA 260C bne L32
00FC E604 lda 4,X
00FE A1B7 cmp #-73
0100 2606 bne L32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -