📄 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:键盘初始化函数--------3-----------------------*
0000 ; *功 能:初始化键盘中断的引脚,但未开放键盘中断 *
0000 ; *参 数:无 *
0000 ; *返 回:无 *
0000 ; *-----------------------------------------------------*/
0000 ; void KB_Init(void)
0000 ; {
0000 ; KB_P=0x00; //复位KB_P
0000 3F00 clr 0
0002 ; KB_D=0b11110000; //定定义3-0为输入,7-4为输出
0002 A6F0 lda #-16
0004 B704 sta 0x4
0006 ; KB_PUE=0b00001111; //定义输入引脚有内部上拉电阻
0006 A60F lda #15
0008 B70D sta 0xd
000A L1:
000A .dbline 0 ; func end
000A 81 rts
000B ; line -> 0,X
000B ; i -> 1,X
000B ; tmp -> 2,X
000B _KB_Scan1::
000B A7FD ais #-3
000D 95 tsx
000E ; }
000E ; /*KB_Scan:扫描读取键值函数-----------------------------*
000E ; *功 能:扫描一次4*4键盘上的按键,读取键值->*p *
000E ; * 若无按键,*p为0xff *
000E ; *参 数:无 *
000E ; *返 回:扫描到的键值 *
000E ; *-----------------------------------------------------*/
000E ; unsigned char KB_Scan1(void)
000E ; {
000E ; unsigned char line,i,tmp;
000E ; line=0b11101111; //使第一根列线为0(低电平)
000E A6EF lda #-17
0010 F7 sta ,X
0011 ; for(i=1;i<=4;i++) //将扫描4根行线
0011 A601 lda #1
0013 E701 sta 1,X
0015 2026 bra L6
0017 L3:
0017 ; {
0017 ; tmp=KB_P; //取KB_P->tmp
0017 B600 lda 0
0019 E702 sta 2,X
001B ; tmp|=0b11110000; //KB_P.3-0保留,KB_P.7-4为1
001B AAF0 ora #-16
001D E702 sta 2,X
001F ; KB_P=tmp&line; //令KB_P.n=0,n=4、5、6、7
001F F4 and ,X
0020 B700 sta 0
0022 ; asm("NOP"); //等待,消除按键抖动
0022 9D NOP
0023 ; asm("NOP");
0023 9D NOP
0024 ; tmp=KB_P;
0024 B600 lda 0
0026 E702 sta 2,X
0028 ; tmp&=0b00001111; //看第n行是否有键按下
0028 A40F and #15
002A E702 sta 2,X
002C ; if(tmp!=0x0f) //本行有键按下
002C A10F cmp #15
002E 2706 beq L7
0030 ; {
0030 ; tmp=KB_P;
0030 B600 lda 0
0032 E702 sta 2,X
0034 ; break;
0034 200D bra L5
0036 L7:
0036 F6 lda ,X
0037 48 lsla
0038 AA01 ora #1
003A F7 sta ,X
003B L4:
003B 6C01 inc 1,X
003D L6:
003D E601 lda 1,X
003F A104 cmp #4
0041 23D4 bls L3
0043 L5:
0043 ;
0043 ; }
0043 ; else //本行无键按下,扫描下一行
0043 ; line=(line<<1)|0x01;
0043 ; }
0043 ; if(i==5) tmp=0xff;
0043 E601 lda 1,X
0045 A105 cmp #5
0047 2604 bne L9
0049 A6FF lda #-1
004B E702 sta 2,X
004D L9:
004D ; return(tmp);
004D E602 lda 2,X
004F L2:
004F A703 ais #3
0051 .dbline 0 ; func end
0051 81 rts
0052 ; line -> 0,X
0052 ; i -> 1,X
0052 ; tmp -> 2,X
0052 _KB_Scan2::
0052 A7FD ais #-3
0054 95 tsx
0055 ; }
0055 ;
0055 ;
0055 ; unsigned char KB_Scan2(void)
0055 ; {
0055 ; unsigned char line,i,tmp;
0055 ; line=0b01111111; //使最后一根列线为0(低电平)
0055 A67F lda #127
0057 F7 sta ,X
0058 ; for(i=1;i<=4;i++) //将扫描4根行线
0058 A601 lda #1
005A E701 sta 1,X
005C 2026 bra L15
005E L12:
005E ; {
005E ; tmp=KB_P; //取KB_P->tmp
005E B600 lda 0
0060 E702 sta 2,X
0062 ; tmp|=0b11110000; //KB_P.3-0保留,KB_P.7-4为1
0062 AAF0 ora #-16
0064 E702 sta 2,X
0066 ; KB_P=tmp&line; //令KB_P.n=0,n=4、5、6、7
0066 F4 and ,X
0067 B700 sta 0
0069 ; asm("NOP"); //等待,消除按键抖动
0069 9D NOP
006A ; asm("NOP");
006A 9D NOP
006B ; tmp=KB_P;
006B B600 lda 0
006D E702 sta 2,X
006F ; tmp&=0b00001111; //看第n行是否有键按下
006F A40F and #15
0071 E702 sta 2,X
0073 ; if(tmp!=0x0f) //本行有键按下
0073 A10F cmp #15
0075 2706 beq L16
0077 ; {
0077 ; tmp=KB_P;
0077 B600 lda 0
0079 E702 sta 2,X
007B ; break;
007B 200D bra L14
007D L16:
007D F6 lda ,X
007E 44 lsra
007F AB80 add #-128
0081 F7 sta ,X
0082 L13:
0082 6C01 inc 1,X
0084 L15:
0084 E601 lda 1,X
0086 A104 cmp #4
0088 23D4 bls L12
008A L14:
008A ; }
008A ; else //本行无键按下,扫描下一行
008A ; line=(line>>1)+128;
008A ; }
008A ; if(i==5) tmp=0xff;
008A E601 lda 1,X
008C A105 cmp #5
008E 2604 bne L18
0090 A6FF lda #-1
0092 E702 sta 2,X
0094 L18:
0094 ; return(tmp);
0094 E602 lda 2,X
0096 L11:
0096 A703 ais #3
0098 .dbline 0 ; func end
0098 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -