⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbsub.lis

📁 要用到开发工具SD-H08
💻 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 + -