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

📄 kbsub.lis

📁 飞思卡尔的键盘中断源代码,C语言写的,很不错的
💻 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_doubleInit::
 0013           ; }
 0013           ; 
 0013           ; void KB_doubleInit(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=0b11110000;   //允许输入引脚的中断可进入
 001F A6F0              lda #-16
 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           ;            tmp -> 2,X
 0026           _KB_Scan::
 0026 A7FD              ais #-3
 0028 95                tsx
 0029           ; }
 0029           ; 
 0029           ; /*KB_Scan:扫描读取键值函数-----------------------------*
 0029           ; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
 0029           ; *         若无按键,*p为0xff                           *
 0029           ; *参  数:无                                             *
 0029           ; *返  回:扫描到的键值                                   *
 0029           ; *-----------------------------------------------------*/  
 0029           ; unsigned char KB_Scan(void) 
 0029           ;  {
 0029           ;        unsigned char line,i,tmp;
 0029           ;      line=0b11111110;        //使第一根行线为0(低电平)
 0029 A6FE              lda #-2
 002B F7                sta ,X
 002C           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 002C A601              lda #1
 002E E701              sta 1,X
 0030 2026              bra L7
 0032           L4:
 0032           ; 	  {	
 0032           ;         tmp=KB_P;            //取KB_P->tmp
 0032 B600              lda 0
 0034 E702              sta 2,X
 0036           ;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 0036 AA0F              ora #15
 0038 E702              sta 2,X
 003A           ;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 003A F4                and ,X
 003B B700              sta 0
 003D           ;           asm("NOP");            //等待,消除按键抖动
 003D 9D                NOP
 003E           ;           asm("NOP");
 003E 9D                NOP
 003F           ;           tmp=KB_P;
 003F B600              lda 0
 0041 E702              sta 2,X
 0043           ;           tmp&=0b11110000;       //看第n行是否有键按下
 0043 A4F0              and #-16
 0045 E702              sta 2,X
 0047           ;           if(tmp!=0xf0)          //本行有键按下
 0047 A1F0              cmp #-16
 0049 2706              beq L8
 004B           ;            {
 004B           ;               tmp=KB_P;
 004B B600              lda 0
 004D E702              sta 2,X
 004F           ;                   break;
 004F 200D              bra L6
 0051           L8:
 0051 F6                lda ,X
 0052 48                lsla
 0053 AA01              ora #1
 0055 F7                sta ,X
 0056           L5:
 0056 6C01              inc 1,X
 0058           L7:
 0058 E601              lda 1,X
 005A A104              cmp #4
 005C 23D4              bls L4
 005E           L6:
 005E           ; 	     }
 005E           ; 	     else                  //本行无键按下,扫描下一行
 005E           ; 		    line=(line<<1)|0x01;
 005E           ; 		     
 005E           ; 	 }	
 005E           ; 	  if(i==5)   tmp=0xff;
 005E E601              lda 1,X
 0060 A105              cmp #5
 0062 2604              bne L10
 0064 A6FF              lda #-1
 0066 E702              sta 2,X
 0068           L10:
 0068           ; 	  return(tmp);
 0068 E602              lda 2,X
 006A           L3:
 006A A703              ais #3
 006C                   .dbline 0 ; func end
 006C 81                rts
 006D           ;           tmp0 -> 0,X
 006D           ;           line -> 1,X
 006D           ;              i -> 2,X
 006D           ;            tmp -> 3,X
 006D           _KB_doubleScan::
 006D A7FC              ais #-4
 006F 95                tsx
 0070           ;  }
 0070           ; //处理双键
 0070           ; unsigned char KB_doubleScan(void)
 0070           ; {
 0070           ;  unsigned char line,i,tmp,tmp0;
 0070           ;  tmp0=KB_Scan( );
 0070 CD0026            jsr _KB_Scan
 0073 95                tsx
 0074 B700              sta *__r1
 0076 F7                sta ,X
 0077           ;  if(tmp0==0xE7||tmp0==0xD7)
 0077 A1E7              cmp #-25
 0079 2704              beq L15
 007B A1D7              cmp #-41
 007D 2645              bne L13
 007F           L15:
 007F           ;    {
 007F           ;       line=0b01111111;        //使第一根列线为0(低电平)
 007F A67F              lda #127
 0081 E701              sta 1,X
 0083           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 0083 A601              lda #1
 0085 E702              sta 2,X
 0087 2029              bra L19
 0089           L16:
 0089           ; 	  {	
 0089           ;         tmp=KB_P;            //取KB_P->tmp
 0089 B600              lda 0
 008B E703              sta 3,X
 008D           ;         tmp|=0b11110000;     //KB_P.7-4保留,KB_P.3-0为1
 008D AAF0              ora #-16
 008F E703              sta 3,X
 0091           ;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 0091 E401              and 1,X
 0093 B700              sta 0
 0095           ;           asm("NOP");            //等待,消除按键抖动
 0095 9D                NOP
 0096           ;           asm("NOP");
 0096 9D                NOP
 0097           ;           tmp=KB_P;
 0097 B600              lda 0
 0099 E703              sta 3,X
 009B           ;           //tmp&=0b00001111;       //看第n行是否有键按下
 009B           ;           if(tmp!=0xE7||tmp!=0xD7)          //本行有键按下
 009B A1E7              cmp #-25
 009D 2604              bne L22
 009F A1D7              cmp #-41
 00A1 2706              beq L20
 00A3           L22:
 00A3           ; 	     {
 00A3           ; 	        tmp=KB_P;
 00A3 B600              lda 0
 00A5 E703              sta 3,X
 00A7           ;                   break;
 00A7 200F              bra L18
 00A9           L20:
 00A9 E601              lda 1,X
 00AB 44                lsra
 00AC AA80              ora #-128
 00AE E701              sta 1,X
 00B0           L17:
 00B0 6C02              inc 2,X
 00B2           L19:
 00B2 E602              lda 2,X
 00B4 A104              cmp #4
 00B6 23D1              bls L16
 00B8           L18:
 00B8           ; 	     }
 00B8           ; 	     else                  //本行无键按下,扫描下一行
 00B8           ; 		    line=(line>>1)|0x80;
 00B8           ; 		     
 00B8           ; 	 }	
 00B8           ; 	  if(i==5)   tmp=0xff;
 00B8 E602              lda 2,X
 00BA A105              cmp #5
 00BC 2604              bne L23
 00BE A6FF              lda #-1
 00C0 E703              sta 3,X
 00C2           L23:
 00C2           ; 	  return(tmp); 
 00C2 E603              lda 3,X
 00C4           L13:
 00C4           L12:
 00C4 A704              ais #4
 00C6                   .dbline 0 ; func end
 00C6 81                rts
                        .area lit
 0000           _KB_Table::
 0000 EE31              .byte 238,49
 0002 DE32              .byte 222,50
 0004 BE33              .byte 190,51
 0006 7E41              .byte 126,'A
 0008 ED34              .byte 237,52
 000A DD35              .byte 221,53
 000C BD36              .byte 189,54
 000E 7D42              .byte 125,'B
 0010 EB37              .byte 235,55
 0012 DB38              .byte 219,56
 0014 BB39              .byte 187,57
 0016 7B43              .byte 123,'C
 0018 E72A              .byte 231,42
 001A D730              .byte 215,48
 001C B723              .byte 183,35
 001E 7744              .byte 'w,'D
 0020 00                .byte 0
                        .area text
                ;       KeyPress -> 0,X
                ;              i -> 1,X
                ;              j -> 2,X
                ;       KB_valve -> 5,X
 00C7           _KB_Def::
 00C7 A7FD              ais #-3
 00C9 95                tsx
 00CA           ;    }
 00CA           ;                          
 00CA           ; 
 00CA           ; 
 00CA           ; 
 00CA           ; }
 00CA           ;  
 00CA           ; /*KB_Def:键值转为定义值函数----------------------------*
 00CA           ; *功  能:键值转为定义值                                 *
 00CA           ; *参  数:键值                                           *
 00CA           ; *返  回:键定义值                                       *
 00CA           ; *-----------------------------------------------------*/
 00CA           ; //键盘定义表
 00CA           ; const unsigned char KB_Table[]= 
 00CA           ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
 00CA           ;  0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
 00CA           ;  0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
 00CA           ;  0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
 00CA           ;  0x00};
 00CA           ; unsigned char KB_Def(unsigned char KB_valve)
 00CA           ;  {
 00CA           ;    unsigned char KeyPress;
 00CA           ;    unsigned char i;
 00CA           ;    unsigned char j;
 00CA           ;    i=0;
 00CA 6F01              clr 1,X
 00CC 203C              bra L27
 00CE           L26:
 00CE           ;    while(1)
 00CE           ;    {
 00CE           ;      j=KB_Table[i];
 00CE 3F00              clr *__r0
 00D0 E601              lda 1,X
 00D2 AB00              add #<_KB_Table
 00D4 B700              sta *__r1
 00D6 B600              lda *__r0
 00D8 A900              adc #>_KB_Table
 00DA B700              sta *__r0
 00DC 5500              ldhx *__r0
 00DE F6                lda ,x
 00DF 95                tsx
 00E0 E702              sta 2,X
 00E2           ;      //与0(定义表结束标志)相比较
 00E2           ;      if (j==0)                   //=0,即表中无次定义值
 00E2 2605              bne L29
 00E4           ;         {KeyPress=0xff; break;}  //返回0xff
 00E4 A6FF              lda #-1
 00E6 F7                sta ,X
 00E7 2023              bra L28
 00E9           L29:
 00E9           ;      else
 00E9           ;         //与键值相比较
 00E9           ;         if (j==KB_valve)         //找到       
 00E9 E602              lda 2,X
 00EB E105              cmp 5,X
 00ED 2615              bne L31
 00EF           ;            {KeyPress=KB_Table[i+1];break;} //取键定义值
 00EF 3F00              clr *__r0
 00F1 E601              lda 1,X
 00F3 AB01              add #<_KB_Table+1
 00F5 B700              sta *__r1
 00F7 B600              lda *__r0
 00F9 A901              adc #>_KB_Table+1
 00FB B700              sta *__r0
 00FD 5500              ldhx *__r0
 00FF F6                lda ,x
 0100 95                tsx
 0101 F7                sta ,X
 0102 2008              bra L28
 0104           L31:
 0104 E601              lda 1,X
 0106 AB02              add #2
 0108 E701              sta 1,X
 010A           L27:
 010A 20C2              bra L26
 010C           L28:
 010C           ;         else
 010C           ;            i+=2;              //指向下一个键值,继续判断
 010C           ;     };
 010C           ;     return KeyPress;
 010C F6                lda ,X
 010D           L25:
 010D A703              ais #3
 010F                   .dbline 0 ; func end
 010F 81                rts

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -