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

📄 kbsub.lis

📁 飞思卡尔U08开发平台下可以自由运行
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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_Init1::
 0013           ; }
 0013           ; void KB_Init1(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=0b00001111;   //允许输入引脚的中断可进入
 001F A60F              lda #15
 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           ;          line1 -> 2,X
 0026           ;              j -> 3,X
 0026           ;            tmp -> 4,X
 0026           ;           tmp1 -> 5,X
 0026           _KB_Scan::
 0026 A7FA              ais #-6
 0028 95                tsx
 0029           ; }
 0029           ; /*KB_Scan:扫描读取键值函数-----------------------------*
 0029           ; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
 0029           ; *         若无按键,*p为0xff                           *
 0029           ; *参  数:无                                             *
 0029           ; *返  回:扫描到的键值                                   *
 0029           ; *-----------------------------------------------------*/  
 0029           ; unsigned char KB_Scan(void) 
 0029           ;  {
 0029           ;      
 0029           ;        unsigned char line,i,j,tmp,tmp1,line1;
 0029           ;        KB_Init();
 0029 CD0000            jsr _KB_Init
 002C 95                tsx
 002D           ;      line=0b11111110;        //使第一根行线为0(低电平)
 002D A6FE              lda #-2
 002F F7                sta ,X
 0030           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 0030 A601              lda #1
 0032 E701              sta 1,X
 0034 CC0184            jmp L7
 0037           L4:
 0037           ; 	  {	
 0037           ;        tmp=KB_P;            //取KB_P->tmp
 0037 B600              lda 0
 0039 E704              sta 4,X
 003B           ;        tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 003B AA0F              ora #15
 003D E704              sta 4,X
 003F           ;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 003F F4                and ,X
 0040 B700              sta 0
 0042           ;           asm("NOP");            //等待,消除按键抖动
 0042 9D                NOP
 0043           ;           asm("NOP");
 0043 9D                NOP
 0044           ;           tmp=KB_P;
 0044 B600              lda 0
 0046 E704              sta 4,X
 0048           ;           tmp&=0b11110000;       //看第n行是否有键按下
 0048 A4F0              and #-16
 004A E704              sta 4,X
 004C           ;           if(tmp!=0xf0)          //本行有键按下
 004C A1F0              cmp #-16
 004E 2603              bne X1
 0050 CC017D            jmp L8
 0053           X1:
 0053           ; 	     {
 0053           ; 	        tmp=KB_P;
 0053 B600              lda 0
 0055 E704              sta 4,X
 0057           ;               if(KB_P==0xE7||KB_P==0xB7)
 0057 B600              lda 0
 0059 A1E7              cmp #-25
 005B 2709              beq L12
 005D B600              lda 0
 005F A1B7              cmp #-73
 0061 2703              beq X2
 0063 CC018D            jmp L6
 0066           X2:
 0066           L12:
 0066           ; 	        {
 0066 CC0176            jmp L14
 0069           L13:
 0069           ; 	        while(1)
 0069           ; 	        {
 0069           ; 	        //*/
 0069           ; 	        KB_Init1();
 0069 CD0013            jsr _KB_Init1
 006C 95                tsx
 006D           ;               line1=0b11101111;        //使第一根列线为0
 006D A6EF              lda #-17
 006F E702              sta 2,X
 0071           ;        for(j=1;j<=3;j++)         //扫描3列,确定有无1~~~7键按下
 0071 A601              lda #1
 0073 E703              sta 3,X
 0075 CC0161            jmp L19
 0078           L16:
 0078           ; 	  {	
 0078           ; 	    tmp1=0b00001111;            //取KB_P->tmp
 0078 A60F              lda #15
 007A E705              sta 5,X
 007C           ;         tmp1|=0b11110000;     //KB_P.7-4保留,KB_P.3-0为1
 007C AAF0              ora #-16
 007E E705              sta 5,X
 0080           ;         KB_P=tmp&line1;       //令KB_P.n=0,n=0、1、2、3
 0080 E604              lda 4,X
 0082 E402              and 2,X
 0084 B700              sta 0
 0086           ;           asm("NOP");            //等待,消除按键抖动
 0086 9D                NOP
 0087           ;           asm("NOP");
 0087 9D                NOP
 0088           ;           tmp1=KB_P;
 0088 B600              lda 0
 008A E705              sta 5,X
 008C           ;           tmp1&=0b00001111;       //看第n行是否有键按下
 008C A40F              and #15
 008E E705              sta 5,X
 0090           ;           if(tmp1!=0x0f)          //本行有键按下
 0090 A10F              cmp #15
 0092 2603              bne X3
 0094 CC0158            jmp L20
 0097           X3:
 0097           ; 	     {  
 0097           ; 	        
 0097           ; 	        if(KB_P==0xEE&&tmp==0xE7)tmp=0xE6;
 0097 B600              lda 0
 0099 A1EE              cmp #-18
 009B 260D              bne L22
 009D E604              lda 4,X
 009F A1E7              cmp #-25
 00A1 2607              bne L22
 00A3 A6E6              lda #-26
 00A5 E704              sta 4,X
 00A7 CC016A            jmp L18
 00AA           L22:
 00AA           ; 	        else if(KB_P==0xED&&tmp==0xE7)tmp=0xE5;
 00AA B600              lda 0
 00AC A1ED              cmp #-19
 00AE 260D              bne L24
 00B0 E604              lda 4,X
 00B2 A1E7              cmp #-25
 00B4 2607              bne L24
 00B6 A6E5              lda #-27
 00B8 E704              sta 4,X
 00BA CC016A            jmp L18
 00BD           L24:
 00BD           ; 	        else if(KB_P==0xEB&&tmp==0xE7)tmp=0xE3;
 00BD B600              lda 0
 00BF A1EB              cmp #-21
 00C1 260D              bne L26
 00C3 E604              lda 4,X
 00C5 A1E7              cmp #-25
 00C7 2607              bne L26
 00C9 A6E3              lda #-29
 00CB E704              sta 4,X
 00CD CC016A            jmp L18
 00D0           L26:
 00D0           ; 	        else if(KB_P==0xBE&&tmp==0xB7)tmp=0xB6;
 00D0 B600              lda 0
 00D2 A1BE              cmp #-66
 00D4 260D              bne L28
 00D6 E604              lda 4,X
 00D8 A1B7              cmp #-73
 00DA 2607              bne L28
 00DC A6B6              lda #-74
 00DE E704              sta 4,X
 00E0 CC016A            jmp L18
 00E3           L28:
 00E3           ; 	        else if(KB_P==0xBD&&tmp==0xB7)tmp=0xB5;
 00E3 B600              lda 0
 00E5 A1BD              cmp #-67
 00E7 260D              bne L30
 00E9 E604              lda 4,X
 00EB A1B7              cmp #-73
 00ED 2607              bne L30
 00EF A6B5              lda #-75
 00F1 E704              sta 4,X
 00F3 CC016A            jmp L18
 00F6           L30:
 00F6           ; 	        else if(KB_P==0xEE&&tmp==0xB7)tmp=0xAA;
 00F6 B600              lda 0
 00F8 A1EE              cmp #-18
 00FA 260C              bne L32
 00FC E604              lda 4,X
 00FE A1B7              cmp #-73
 0100 2606              bne L32

⌨️ 快捷键说明

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