📄 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 ; k -> 0,X
0013 ; ch -> 1,X
0013 ; i -> 2,X
0013 ; line -> 3,X
0013 ; tmp -> 4,X
0013 _KB_Scan::
0013 A7FB ais #-5
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 ch,k,line,i,tmp;
0016 ; line=0b11111110; //使第一根行线为0(低电平)
0016 A6FE lda #-2
0018 E703 sta 3,X
001A ; ch=0xff;
001A A6FF lda #-1
001C E701 sta 1,X
001E ; k=0;
001E 7F clr ,X
001F ; for(i=1;i<=4;i++) //将扫描4根行线
001F A601 lda #1
0021 E702 sta 2,X
0023 202A bra L6
0025 L3:
0025 ; {
0025 ; tmp=KB_P; //取KB_P->tmp
0025 B600 lda 0
0027 E704 sta 4,X
0029 ; tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
0029 AA0F ora #15
002B E704 sta 4,X
002D ; KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
002D E403 and 3,X
002F B700 sta 0
0031 ; asm("NOP"); //等待,消除按键抖动
0031 9D NOP
0032 ; asm("NOP");
0032 9D NOP
0033 ; tmp=KB_P;
0033 B600 lda 0
0035 E704 sta 4,X
0037 ; tmp&=0b11110000; //看第n行是否有键按下
0037 A4F0 and #-16
0039 E704 sta 4,X
003B ; if(tmp!=0xf0) //本行有键按下
003B A1F0 cmp #-16
003D 2707 beq L7
003F ; {
003F ; ch&=KB_P;//ch与上一次检测得到的按键扫描码进行与操作得到按键的总值
003F E601 lda 1,X
0041 B400 and 0
0043 E701 sta 1,X
0045 ; k++;
0045 7C inc ,X
0046 ; }
0046 L7:
0046 E603 lda 3,X
0048 48 lsla
0049 AA01 ora #1
004B E703 sta 3,X
004D L4:
004D 6C02 inc 2,X
004F L6:
004F E602 lda 2,X
0051 A104 cmp #4
0053 23D0 bls L3
0055 ; line=(line<<1)|0x01;
0055 ; }
0055 ; tmp=ch;
0055 E601 lda 1,X
0057 E704 sta 4,X
0059 ; if(k==0) tmp=0xff;
0059 F6 lda ,X
005A 2604 bne L9
005C A6FF lda #-1
005E E704 sta 4,X
0060 L9:
0060 ; return(tmp);
0060 E604 lda 4,X
0062 L2:
0062 A705 ais #5
0064 .dbline 0 ; func end
0064 81 rts
.area lit
0000 _KB_Table::
0000 E6C6 .byte 230,198
0002 A6E5 .byte 166,229
0004 C5A5 .byte 197,165
0006 E3EE .byte 227,238
0008 DEBE .byte 222,190
000A EDDD .byte 237,221
000C BDEB .byte 189,235
000E C6D6 .byte 198,214
0010 96C5 .byte 150,197
0012 D595 .byte 213,149
0014 C3B7 .byte 195,183
0016 3D00 .byte 61,0
0018 _KB_Frq::
0018 0106 .word 262
001A 0126 .word 294
001C 014A .word 330
001E 015D .word 349
0020 0188 .word 392
0022 01B8 .word 440
0024 01EE .word 494
0026 020B .word 523
0028 022E .word 558
002A 0294 .word 660
002C 02BA .word 698
002E 0310 .word 784
0030 0370 .word 880
0032 03DC .word 988
0034 0416 .word 1046
0036 0497 .word 1175
0038 0526 .word 1318
003A 0575 .word 1397
003C 0620 .word 1568
003E 06E0 .word 1760
0040 07B8 .word 1976
0042 0000 .word 0
.area text
; KeyPress -> 0,X
; i -> 2,X
; j -> 3,X
; KB_valve -> 6,X
0065 _KB_Def::
0065 A7FC ais #-4
0067 95 tsx
0068 ; }
0068 ; /*KB_Def:键值转为定义值函数----------------------------*
0068 ; *功 能:键值转为定义值 *
0068 ; *参 数:键值 *
0068 ; *返 回:键定义值 *
0068 ; *-----------------------------------------------------*/
0068 ; //键盘定义表
0068 ; const unsigned char KB_Table[]=
0068 ; {0xE6,0xC6,0xA6,0xE5,0xC5,0xA5,0xE3,//低音
0068 ; 0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,//中音
0068 ; 0xC6,0xD6,0x96,0xC5,0xD5,0x95,0xC3,//高音
0068 ; 0xB7,'=',//等号字符
0068 ; 0x00};//其中8为退格键
0068 ; const unsigned int KB_Frq[]=
0068 ; {262,294,330,349,392,440,494,
0068 ; 523,558,660,698,784,880,988,
0068 ; 1046,1175,1318,1397,1568,1760,1976,0};
0068 ; unsigned int KB_Def(unsigned char KB_valve)
0068 ; {
0068 ; unsigned int KeyPress;
0068 ; unsigned char i;
0068 ; unsigned char j;
0068 ; i=0;
0068 6F02 clr 2,X
006A 204D bra L13
006C L12:
006C ; while(1)
006C ; {
006C ; j=KB_Table[i];
006C 3F00 clr *__r0
006E E602 lda 2,X
0070 AB00 add #<_KB_Table
0072 B700 sta *__r1
0074 B600 lda *__r0
0076 A900 adc #>_KB_Table
0078 B700 sta *__r0
007A 5500 ldhx *__r0
007C F6 lda ,x
007D 95 tsx
007E E703 sta 3,X
0080 ; //与0(定义表结束标志)相比较
0080 ; if (j==0) //=0,即表中无次定义值
0080 2609 bne L15
0082 ; {KeyPress=0xffff; break;} //返回0xff
0082 A6FF lda #-1
0084 F7 sta ,X
0085 A6FF lda #-1
0087 E701 sta 1,X
0089 2030 bra L14
008B L15:
008B ; else
008B ; //与键值相比较
008B ; if (j==KB_valve) //找到
008B E603 lda 3,X
008D E106 cmp 6,X
008F 2626 bne L17
0091 ; {KeyPress=KB_Frq[2*i];break;} //取键定义值
0091 3F00 clr *__r0
0093 E602 lda 2,X
0095 B700 sta *__r1
0097 3800 lsl *__r1
0099 3900 rol *__r0
009B 3800 lsl *__r1
009D 3900 rol *__r0
009F B600 lda *__r1
00A1 AB18 add #<_KB_Frq
00A3 B700 sta *__r1
00A5 B600 lda *__r0
00A7 A918 adc #>_KB_Frq
00A9 B700 sta *__r0
00AB 5500 ldhx *__r0
00AD E601 lda 1,x
00AF 9EE702 sta 2,SP
00B2 F6 lda ,x
00B3 95 tsx
00B4 F7 sta ,X
00B5 2004 bra L14
00B7 L17:
00B7 6C02 inc 2,X
00B9 L13:
00B9 20B1 bra L12
00BB L14:
00BB ; else
00BB ; i+=1; //指向下一个键值,继续判断
00BB ; };
00BB ; return KeyPress;
00BB E601 lda 1,X
00BD B700 sta *__r1
00BF F6 lda ,X
00C0 B700 sta *__r0
00C2 L11:
00C2 A704 ais #4
00C4 .dbline 0 ; func end
00C4 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -