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

📄 kbsub.lis

📁 基于HC908GP32的计算器完整程序
💻 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           ;           line -> 0,X
 0013           ;              i -> 1,X
 0013           ;            tmp -> 2,X
 0013           ;              j -> 3,X
 0013           _KB_Scan::
 0013 A7FC              ais #-4
 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,j,tmp;
 0016           ;      line=0b11111110;        //使第一根行线为0(低电平)
 0016 A6FE              lda #-2
 0018 F7                sta ,X
 0019           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 0019 A601              lda #1
 001B E701              sta 1,X
 001D 2032              bra L6
 001F           L3:
 001F           ; 	  {	
 001F           ;         tmp=KB_P;            //取KB_P->tmp
 001F B600              lda 0
 0021 E702              sta 2,X
 0023           ;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 0023 AA0F              ora #15
 0025 E702              sta 2,X
 0027           ;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 0027 F4                and ,X
 0028 B700              sta 0
 002A           ;           asm("NOP");            //等待,消除按键抖动
 002A 9D                NOP
 002B           ;           asm("NOP");
 002B 9D                NOP
 002C           ;           tmp=KB_P;
 002C B600              lda 0
 002E E702              sta 2,X
 0030           ;           tmp&=0b11110000;       //看第n行是否有键按下
 0030 A4F0              and #-16
 0032 E702              sta 2,X
 0034           ;           if(tmp!=0xf0)          //本行有键按下
 0034 A1F0              cmp #-16
 0036 2712              beq L7
 0038           ;            {
 0038 6F03              clr 3,X
 003A 2002              bra L12
 003C           L9:
 003C           L10:
 003C 6C03              inc 3,X
 003E           L12:
 003E           ; 	     for(j=0;j<250;j++);
 003E E603              lda 3,X
 0040 A1FA              cmp #-6
 0042 25F8              blo L9
 0044           ;               tmp=KB_P;
 0044 B600              lda 0
 0046 E702              sta 2,X
 0048           ;                   break;
 0048 200D              bra L5
 004A           L7:
 004A F6                lda ,X
 004B 48                lsla
 004C AA01              ora #1
 004E F7                sta ,X
 004F           L4:
 004F 6C01              inc 1,X
 0051           L6:
 0051 E601              lda 1,X
 0053 A104              cmp #4
 0055 23C8              bls L3
 0057           L5:
 0057           ; 	     }
 0057           ; 	     else                  //本行无键按下,扫描下一行
 0057           ; 		    line=(line<<1)|0x01; 
 0057           ; 	 }	
 0057           ; 	  if(i==5)   tmp=0xff;
 0057 E601              lda 1,X
 0059 A105              cmp #5
 005B 2604              bne L13
 005D A6FF              lda #-1
 005F E702              sta 2,X
 0061           L13:
 0061           ; 	  return(tmp);
 0061 E602              lda 2,X
 0063           L2:
 0063 A704              ais #4
 0065                   .dbline 0 ; func end
 0065 81                rts
                        .area lit
 0000           _KB_Table::
 0000 EE31              .byte 238,49
 0002 DE32              .byte 222,50
 0004 BE33              .byte 190,51
 0006 7E2B              .byte 126,43
 0008 ED34              .byte 237,52
 000A DD35              .byte 221,53
 000C BD36              .byte 189,54
 000E 7D2D              .byte 125,45
 0010 EB37              .byte 235,55
 0012 DB38              .byte 219,56
 0014 BB39              .byte 187,57
 0016 7B2A              .byte 123,42
 0018 E73C              .byte 231,60
 001A D730              .byte 215,48
 001C B73D              .byte 183,61
 001E 772F              .byte 'w,47
 0020 00                .byte 0
                        .area text
                ;       KeyPress -> 0,X
                ;              i -> 1,X
                ;              j -> 2,X
                ;       KB_valve -> 5,X
 0066           _KB_Def::
 0066 A7FD              ais #-3
 0068 95                tsx
 0069           ;  }
 0069           ; /*KB_Def:键值转为定义值函数----------------------------*
 0069           ; *功  能:键值转为定义值                                 *
 0069           ; *参  数:键值                                           *
 0069           ; *返  回:键定义值                                       *
 0069           ; *-----------------------------------------------------*/
 0069           ; //键盘定义表
 0069           ; const unsigned char KB_Table[]= 
 0069           ; {0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'+',
 0069           ;  0xED,'4',0xDD,'5',0xBD,'6',0x7D,'-',
 0069           ;  0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'*',
 0069           ;  0xE7,'<',0xD7,'0',0xB7,'=',0x77,'/',
 0069           ;  0x00};
 0069           ; unsigned char KB_Def(unsigned char KB_valve)
 0069           ;  {
 0069           ;    unsigned char KeyPress;
 0069           ;    unsigned char i;
 0069           ;    unsigned char j;
 0069           ;    i=0;
 0069 6F01              clr 1,X
 006B 203C              bra L17
 006D           L16:
 006D           ;    while(1)
 006D           ;    {
 006D           ;      j=KB_Table[i];
 006D 3F00              clr *__r0
 006F E601              lda 1,X
 0071 AB00              add #<_KB_Table
 0073 B700              sta *__r1
 0075 B600              lda *__r0
 0077 A900              adc #>_KB_Table
 0079 B700              sta *__r0
 007B 5500              ldhx *__r0
 007D F6                lda ,x
 007E 95                tsx
 007F E702              sta 2,X
 0081           ;      //与0(定义表结束标志)相比较
 0081           ;      if (j==0)                   //=0,即表中无次定义值
 0081 2605              bne L19
 0083           ;         {KeyPress=0xff; break;}  //返回0xff
 0083 A6FF              lda #-1
 0085 F7                sta ,X
 0086 2023              bra L18
 0088           L19:
 0088           ;      else
 0088           ;         //与键值相比较
 0088           ;         if (j==KB_valve)         //找到       
 0088 E602              lda 2,X
 008A E105              cmp 5,X
 008C 2615              bne L21
 008E           ;            {KeyPress=KB_Table[i+1];break;} //取键定义值
 008E 3F00              clr *__r0
 0090 E601              lda 1,X
 0092 AB01              add #<_KB_Table+1
 0094 B700              sta *__r1
 0096 B600              lda *__r0
 0098 A901              adc #>_KB_Table+1
 009A B700              sta *__r0
 009C 5500              ldhx *__r0
 009E F6                lda ,x
 009F 95                tsx
 00A0 F7                sta ,X
 00A1 2008              bra L18
 00A3           L21:
 00A3 E601              lda 1,X
 00A5 AB02              add #2
 00A7 E701              sta 1,X
 00A9           L17:
 00A9 20C2              bra L16
 00AB           L18:
 00AB           ;         else
 00AB           ;            i+=2;              //指向下一个键值,继续判断
 00AB           ;     };
 00AB           ;     return KeyPress;
 00AB F6                lda ,X
 00AC           L15:
 00AC A703              ais #3
 00AE                   .dbline 0 ; func end
 00AE 81                rts

⌨️ 快捷键说明

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