📄 kb.lis
字号:
.module kb.c
.area text
0000 _KB_Init::
0000 ; #include "GP32C.H"
0000 ; #include "DJC.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 ; tmp1 -> 0,X
0013 ; isL -> 1,X
0013 ; isH -> 2,X
0013 ; data -> 3,X
0013 ; line -> 4,X
0013 ; i -> 5,X
0013 ; tmp -> 6,X
0013 _KB_Scan::
0013 A7F9 ais #-7
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,tmp,tmp1,data=0x00,isH=0,isL=0;
0016 6F03 clr 3,X
0018 6F02 clr 2,X
001A 6F01 clr 1,X
001C ; KB_Init();
001C CD0000 jsr _KB_Init
001F 95 tsx
0020 ; line=0b11110111; //取第四行为零,先识别高低键
0020 A6F7 lda #-9
0022 E704 sta 4,X
0024 ; tmp=KB_P; //取KB_P->tmp
0024 B600 lda 0
0026 E706 sta 6,X
0028 ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
0028 AA0F ora #15
002A E706 sta 6,X
002C ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
002C E404 and 4,X
002E B700 sta 0
0030 ; asm("NOP"); //等待,消除按键抖动
0030 9D NOP
0031 ; asm("NOP");
0031 9D NOP
0032 ; tmp=KB_P;
0032 B600 lda 0
0034 E706 sta 6,X
0036 ; tmp&=0b11110000; //看第n行是否有键按下 //看第这行是否有键按下
0036 A4F0 and #-16
0038 E706 sta 6,X
003A ; if(tmp!=0xf0) //本行有键按下
003A A1F0 cmp #-16
003C 2712 beq L3
003E ; {
003E ; if((tmp&0b00010000)==0) isL=10;//按下了*
003E A510 bit #16
0040 2604 bne L5
0042 A60A lda #10
0044 E701 sta 1,X
0046 L5:
0046 ; if((tmp&0b00100000)==0)isH=10; //按下了0
0046 E606 lda 6,X
0048 A520 bit #32
004A 2604 bne L7
004C A60A lda #10
004E E702 sta 2,X
0050 L7:
0050 ; }
0050 L3:
0050 ; line=0b11111110; //使第一根行线为0(低电平)
0050 A6FE lda #-2
0052 E704 sta 4,X
0054 ; for(i=0;i<3;i++) //将扫描3根行线
0054 6F05 clr 5,X
0056 205F bra L12
0058 L9:
0058 ; {
0058 ; tmp=KB_P; //取KB_P->tmp
0058 B600 lda 0
005A E706 sta 6,X
005C ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
005C AA0F ora #15
005E E706 sta 6,X
0060 ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
0060 E404 and 4,X
0062 B700 sta 0
0064 ; asm("NOP"); //等待,消除按键抖动
0064 9D NOP
0065 ; asm("NOP");
0065 9D NOP
0066 ; tmp=KB_P;
0066 B600 lda 0
0068 E706 sta 6,X
006A ; tmp&=0b11110000; //看第n行是否有键按下
006A A4F0 and #-16
006C E706 sta 6,X
006E ; if(tmp!=0xf0) //本行有键按下
006E A1F0 cmp #-16
0070 273C beq L13
0072 ; {
0072 ; if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
0072 A1E0 cmp #-32
0074 260C bne L15
0076 E605 lda 5,X
0078 AE03 ldx #3
007A 42 mul
007B 95 tsx
007C AB01 add #1
007E E703 sta 3,X
0080 203B bra L11
0082 L15:
0082 ; if(i==2)break;
0082 E605 lda 5,X
0084 A102 cmp #2
0086 2602 bne L17
0088 2033 bra L11
008A L17:
008A ; if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
008A E606 lda 6,X
008C A1D0 cmp #-48
008E 260C bne L19
0090 E605 lda 5,X
0092 AE03 ldx #3
0094 42 mul
0095 95 tsx
0096 AB02 add #2
0098 E703 sta 3,X
009A 2021 bra L11
009C L19:
009C ; if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
009C E606 lda 6,X
009E A1B0 cmp #-80
00A0 2613 bne L14
00A2 E605 lda 5,X
00A4 AE03 ldx #3
00A6 42 mul
00A7 95 tsx
00A8 AB03 add #3
00AA E703 sta 3,X
00AC 200F bra L11
00AE X0:
00AE ; }
00AE L13:
00AE ; else //本行无键按下,扫描下一行
00AE ; line=(line<<1)|0x01;
00AE E604 lda 4,X
00B0 48 lsla
00B1 AA01 ora #1
00B3 E704 sta 4,X
00B5 L14:
00B5 L10:
00B5 6C05 inc 5,X
00B7 L12:
00B7 E605 lda 5,X
00B9 A103 cmp #3
00BB 259B blo L9
00BD L11:
00BD ; }
00BD ; data=data+10+isH-isL; //自定义按键值,高为21~27,中为11~17,低为1~7
00BD E603 lda 3,X
00BF AB0A add #10
00C1 EB02 add 2,X
00C3 E001 sub 1,X
00C5 E703 sta 3,X
00C7 ; if((data%10)==0) data=0xff;//没有按1~7中的任意一个时,data=0;
00C7 AE0A ldx #10
00C9 8C clrh
00CA 52 div
00CB 8B pshh
00CC 86 pula
00CD 95 tsx
00CE 4D tsta
00CF 2604 bne L23
00D1 A6FF lda #-1
00D3 E703 sta 3,X
00D5 L23:
00D5 ; return(data);
00D5 E603 lda 3,X
00D7 L2:
00D7 A707 ais #7
00D9 .dbline 0 ; func end
00D9 81 rts
00DA ; data -> 0,X
00DA ; tmp2 -> 1,X
00DA ; line -> 2,X
00DA ; i -> 3,X
00DA ; tmp1 -> 4,X
00DA ; tmp -> 5,X
00DA _KB_ScanD::
00DA A7FA ais #-6
00DC 95 tsx
00DD ; }
00DD ;
00DD ; unsigned char KB_ScanD(void)
00DD ; {
00DD ; unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
00DD A6FF lda #-1
00DF F7 sta ,X
00E0 ; line=0b11111110; //使第一根行线为0(低电平)
00E0 A6FE lda #-2
00E2 E702 sta 2,X
00E4 ; for(i=0;i<3;i++) //将扫描3根行线
00E4 6F03 clr 3,X
00E6 CC0178 jmp L29
00E9 L26:
00E9 ; {
00E9 ; tmp=KB_P; //取KB_P->tmp
00E9 B600 lda 0
00EB E705 sta 5,X
00ED ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
00ED AA0F ora #15
00EF E705 sta 5,X
00F1 ; tmp=tmp&line; //令KB_P.n=0,n=0、1、2、3
00F1 E402 and 2,X
00F3 E705 sta 5,X
00F5 ; KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
00F5 A4F7 and #-9
00F7 B700 sta 0
00F9 ; asm("NOP"); //等待,消除按键抖动
00F9 9D NOP
00FA ; asm("NOP");
00FA 9D NOP
00FB ; tmp1=KB_P;
00FB B600 lda 0
00FD E704 sta 4,X
00FF ; tmp1&=0b11110000; //看第这两行是否有键按下
00FF A4F0 and #-16
0101 E704 sta 4,X
0103 ; if(tmp1!=0xf0) //有键按下
0103 A1F0 cmp #-16
0105 2603 bne X4
0107 CC016F jmp L30
010A X4:
010A ; {
010A ; KB_P=tmp; //使第四根行线为1
010A E605 lda 5,X
010C B700 sta 0
010E ; asm("NOP"); //等待,消除按键抖动
010E 9D NOP
010F ; asm("NOP");
010F 9D NOP
0110 ; tmp2=KB_P;
0110 B600 lda 0
0112 E701 sta 1,X
0114 ; tmp2&=0b11110000;
0114 A4F0 and #-16
0116 E701 sta 1,X
0118 ; if(tmp2==0xf0) { //看第这i行是否有独立键按下
0118 A1F0 cmp #-16
011A 265A bne L31
011C ; tmp&=~(1<<MOVEB);//使第四根行线为0
011C E605 lda 5,X
011E A4F7 and #-9
0120 E705 sta 5,X
0122 ; tmp|=(1<<i); ///使第i根行线为1
0122 6E0100 mov #1,*__r0
0125 E603 lda 3,X
0127 A407 and #7
0129 2704 beq X3
012B X2:
012B 3800 lsl *__r0
012D 4BFC dbnza X2
012F X3:
012F E605 lda 5,X
0131 BA00 ora *__r0
0133 E705 sta 5,X
0135 ; KB_P=tmp;
0135 B700 sta 0
0137 ; asm("NOP"); //等待,消除按键抖动
0137 9D NOP
0138 ; asm("NOP");
0138 9D NOP
0139 ; tmp=KB_P;
0139 B600 lda 0
013B E705 sta 5,X
013D ; tmp&=0b11110000;
013D A4F0 and #-16
013F E705 sta 5,X
0141 ; if(tmp==0xff){
0141 A1FF cmp #-1
0143 2631 bne L31
0145 ; if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
0145 E604 lda 4,X
0147 A1E0 cmp #-32
0149 260B bne L36
014B E603 lda 3,X
014D AE03 ldx #3
014F 42 mul
0150 95 tsx
0151 AB01 add #1
0153 F7 sta ,X
0154 202B bra L28
0156 L36:
0156 ; if(i==2)break;
0156 E603 lda 3,X
0158 A102 cmp #2
015A 2602 bne L38
015C 2023 bra L28
015E L38:
015E ; if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
015E E604 lda 4,X
0160 A1D0 cmp #-48
0162 2612 bne L31
0164 E603 lda 3,X
0166 AE03 ldx #3
0168 42 mul
0169 95 tsx
016A AB16 add #22
016C F7 sta ,X
016D 2012 bra L28
016F X1:
016F ; }
016F ; }
016F ; }
016F L30:
016F ; else //本行无键按下,扫描下一行
016F ; line=(line<<1)|0x01;
016F E602 lda 2,X
0171 48 lsla
0172 AA01 ora #1
0174 E702 sta 2,X
0176 L31:
0176 L27:
0176 6C03 inc 3,X
0178 L29:
0178 E603 lda 3,X
017A A103 cmp #3
017C 2403 bhs X5
017E CC00E9 jmp L26
0181 X5:
0181 L28:
0181 ; }
0181 ; return(data);
0181 F6 lda ,X
0182 L25:
0182 A706 ais #6
0184 .dbline 0 ; func end
0184 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -