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

📄 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:键盘初始化函数--------3-----------------------*
 0000           ; *功  能:初始化键盘中断的引脚,但未开放键盘中断         *
 0000           ; *参  数:无                                             *
 0000           ; *返  回:无                                             *
 0000           ; *-----------------------------------------------------*/  
 0000           ; void KB_Init(void)
 0000           ; {
 0000           ; 	 KB_P=0x00;             //复位KB_P
 0000 3F00              clr 0
 0002           ;        KB_D=0b11110000;       //定定义3-0为输入,7-4为输出
 0002 A6F0              lda #-16
 0004 B704              sta 0x4
 0006           ;        KB_PUE=0b00001111;     //定义输入引脚有内部上拉电阻
 0006 A60F              lda #15
 0008 B70D              sta 0xd
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 81                rts
 000B           ;           line -> 0,X
 000B           ;              i -> 1,X
 000B           ;            tmp -> 2,X
 000B           _KB_Scan1::
 000B A7FD              ais #-3
 000D 95                tsx
 000E           ; }
 000E           ; /*KB_Scan:扫描读取键值函数-----------------------------*
 000E           ; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
 000E           ; *         若无按键,*p为0xff                           *
 000E           ; *参  数:无                                             *
 000E           ; *返  回:扫描到的键值                                   *
 000E           ; *-----------------------------------------------------*/  
 000E           ; unsigned char KB_Scan1(void) 
 000E           ;  {
 000E           ;        unsigned char line,i,tmp;
 000E           ;      line=0b11101111;        //使第一根列线为0(低电平)
 000E A6EF              lda #-17
 0010 F7                sta ,X
 0011           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 0011 A601              lda #1
 0013 E701              sta 1,X
 0015 2026              bra L6
 0017           L3:
 0017           ; 	  {	
 0017           ;         tmp=KB_P;            //取KB_P->tmp
 0017 B600              lda 0
 0019 E702              sta 2,X
 001B           ;         tmp|=0b11110000;     //KB_P.3-0保留,KB_P.7-4为1
 001B AAF0              ora #-16
 001D E702              sta 2,X
 001F           ;         KB_P=tmp&line;       //令KB_P.n=0,n=4、5、6、7
 001F F4                and ,X
 0020 B700              sta 0
 0022           ;           asm("NOP");            //等待,消除按键抖动
 0022 9D                NOP
 0023           ;           asm("NOP");
 0023 9D                NOP
 0024           ;           tmp=KB_P;
 0024 B600              lda 0
 0026 E702              sta 2,X
 0028           ;           tmp&=0b00001111;       //看第n行是否有键按下
 0028 A40F              and #15
 002A E702              sta 2,X
 002C           ;           if(tmp!=0x0f)          //本行有键按下
 002C A10F              cmp #15
 002E 2706              beq L7
 0030           ;            {
 0030           ;               tmp=KB_P;
 0030 B600              lda 0
 0032 E702              sta 2,X
 0034           ;                   break;
 0034 200D              bra L5
 0036           L7:
 0036 F6                lda ,X
 0037 48                lsla
 0038 AA01              ora #1
 003A F7                sta ,X
 003B           L4:
 003B 6C01              inc 1,X
 003D           L6:
 003D E601              lda 1,X
 003F A104              cmp #4
 0041 23D4              bls L3
 0043           L5:
 0043           ; 		    
 0043           ; 	     }
 0043           ; 	     else                  //本行无键按下,扫描下一行
 0043           ; 		    line=(line<<1)|0x01; 
 0043           ; 	 }	
 0043           ; 	  if(i==5)   tmp=0xff;
 0043 E601              lda 1,X
 0045 A105              cmp #5
 0047 2604              bne L9
 0049 A6FF              lda #-1
 004B E702              sta 2,X
 004D           L9:
 004D           ; 	  return(tmp);
 004D E602              lda 2,X
 004F           L2:
 004F A703              ais #3
 0051                   .dbline 0 ; func end
 0051 81                rts
 0052           ;           line -> 0,X
 0052           ;              i -> 1,X
 0052           ;            tmp -> 2,X
 0052           _KB_Scan2::
 0052 A7FD              ais #-3
 0054 95                tsx
 0055           ;  }
 0055           ;  
 0055           ;  
 0055           ; unsigned char KB_Scan2(void) 
 0055           ;  {
 0055           ;        unsigned char line,i,tmp;
 0055           ;      line=0b01111111;        //使最后一根列线为0(低电平)
 0055 A67F              lda #127
 0057 F7                sta ,X
 0058           ;        for(i=1;i<=4;i++)         //将扫描4根行线
 0058 A601              lda #1
 005A E701              sta 1,X
 005C 2026              bra L15
 005E           L12:
 005E           ; 	  {	
 005E           ;         tmp=KB_P;            //取KB_P->tmp
 005E B600              lda 0
 0060 E702              sta 2,X
 0062           ;         tmp|=0b11110000;     //KB_P.3-0保留,KB_P.7-4为1
 0062 AAF0              ora #-16
 0064 E702              sta 2,X
 0066           ;         KB_P=tmp&line;       //令KB_P.n=0,n=4、5、6、7
 0066 F4                and ,X
 0067 B700              sta 0
 0069           ;           asm("NOP");            //等待,消除按键抖动
 0069 9D                NOP
 006A           ;           asm("NOP");
 006A 9D                NOP
 006B           ;           tmp=KB_P;
 006B B600              lda 0
 006D E702              sta 2,X
 006F           ;           tmp&=0b00001111;       //看第n行是否有键按下
 006F A40F              and #15
 0071 E702              sta 2,X
 0073           ;           if(tmp!=0x0f)          //本行有键按下
 0073 A10F              cmp #15
 0075 2706              beq L16
 0077           ;            {
 0077           ;               tmp=KB_P;
 0077 B600              lda 0
 0079 E702              sta 2,X
 007B           ;                   break;
 007B 200D              bra L14
 007D           L16:
 007D F6                lda ,X
 007E 44                lsra
 007F AB80              add #-128
 0081 F7                sta ,X
 0082           L13:
 0082 6C01              inc 1,X
 0084           L15:
 0084 E601              lda 1,X
 0086 A104              cmp #4
 0088 23D4              bls L12
 008A           L14:
 008A           ; 	     }
 008A           ; 	     else                  //本行无键按下,扫描下一行
 008A           ; 		    line=(line>>1)+128; 
 008A           ; 	 }	
 008A           ; 	  if(i==5)   tmp=0xff;
 008A E601              lda 1,X
 008C A105              cmp #5
 008E 2604              bne L18
 0090 A6FF              lda #-1
 0092 E702              sta 2,X
 0094           L18:
 0094           ; 	  return(tmp);
 0094 E602              lda 2,X
 0096           L11:
 0096 A703              ais #3
 0098                   .dbline 0 ; func end
 0098 81                rts

⌨️ 快捷键说明

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