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

📄 kb.lis

📁 飞思卡尔的电子钟和电子琴的课程设计,包括源代码
💻 LIS
字号:
                        .module kb.c
                        .area text
 0000           _KB_Init::
 0000           ; #include "GP32C.H"
 0000           ; #include "DJC.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           ;           tmp1 -> 0,X
 0013           ;            isL -> 1,X
 0013           ;            isH -> 2,X
 0013           ;           data -> 3,X
 0013           ;           line -> 4,X
 0013           ;              i -> 5,X
 0013           ;            tmp -> 6,X
 0013           _KB_Scan::
 0013 A7F9              ais #-7
 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,tmp,tmp1,data=0x00,isH=0,isL=0;
 0016 6F03              clr 3,X
 0018 6F02              clr 2,X
 001A 6F01              clr 1,X
 001C           ;        KB_Init();
 001C CD0000            jsr _KB_Init
 001F 95                tsx
 0020           ;        line=0b11110111;               //取第四行为零,先识别高低键
 0020 A6F7              lda #-9
 0022 E704              sta 4,X
 0024           ;        tmp=KB_P;            //取KB_P->tmp
 0024 B600              lda 0
 0026 E706              sta 6,X
 0028           ;      tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 0028 AA0F              ora #15
 002A E706              sta 6,X
 002C           ;      KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 002C E404              and 4,X
 002E B700              sta 0
 0030           ;        asm("NOP");            //等待,消除按键抖动
 0030 9D                NOP
 0031           ;        asm("NOP");
 0031 9D                NOP
 0032           ;        tmp=KB_P;
 0032 B600              lda 0
 0034 E706              sta 6,X
 0036           ;        tmp&=0b11110000;       //看第n行是否有键按下       //看第这行是否有键按下
 0036 A4F0              and #-16
 0038 E706              sta 6,X
 003A           ;        if(tmp!=0xf0)          //本行有键按下
 003A A1F0              cmp #-16
 003C 2712              beq L3
 003E           ;        {
 003E           ;               if((tmp&0b00010000)==0) isL=10;//按下了*
 003E A510              bit #16
 0040 2604              bne L5
 0042 A60A              lda #10
 0044 E701              sta 1,X
 0046           L5:
 0046           ; 	 	if((tmp&0b00100000)==0)isH=10;	 //按下了0		
 0046 E606              lda 6,X
 0048 A520              bit #32
 004A 2604              bne L7
 004C A60A              lda #10
 004E E702              sta 2,X
 0050           L7:
 0050           ; 	 }
 0050           L3:
 0050           ;      line=0b11111110;        //使第一根行线为0(低电平)
 0050 A6FE              lda #-2
 0052 E704              sta 4,X
 0054           ;        for(i=0;i<3;i++)       //将扫描3根行线
 0054 6F05              clr 5,X
 0056 205F              bra L12
 0058           L9:
 0058           ; 	  {	
 0058           ;         tmp=KB_P;            //取KB_P->tmp
 0058 B600              lda 0
 005A E706              sta 6,X
 005C           ;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 005C AA0F              ora #15
 005E E706              sta 6,X
 0060           ;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 0060 E404              and 4,X
 0062 B700              sta 0
 0064           ;           asm("NOP");            //等待,消除按键抖动
 0064 9D                NOP
 0065           ;           asm("NOP");
 0065 9D                NOP
 0066           ;           tmp=KB_P;
 0066 B600              lda 0
 0068 E706              sta 6,X
 006A           ;           tmp&=0b11110000;       //看第n行是否有键按下
 006A A4F0              and #-16
 006C E706              sta 6,X
 006E           ;           if(tmp!=0xf0)          //本行有键按下
 006E A1F0              cmp #-16
 0070 273C              beq L13
 0072           ;            {
 0072           ;               if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
 0072 A1E0              cmp #-32
 0074 260C              bne L15
 0076 E605              lda 5,X
 0078 AE03              ldx #3
 007A 42                mul
 007B 95                tsx
 007C AB01              add #1
 007E E703              sta 3,X
 0080 203B              bra L11
 0082           L15:
 0082           ; 	        if(i==2)break;
 0082 E605              lda 5,X
 0084 A102              cmp #2
 0086 2602              bne L17
 0088 2033              bra L11
 008A           L17:
 008A           ; 	        if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
 008A E606              lda 6,X
 008C A1D0              cmp #-48
 008E 260C              bne L19
 0090 E605              lda 5,X
 0092 AE03              ldx #3
 0094 42                mul
 0095 95                tsx
 0096 AB02              add #2
 0098 E703              sta 3,X
 009A 2021              bra L11
 009C           L19:
 009C           ; 	        if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
 009C E606              lda 6,X
 009E A1B0              cmp #-80
 00A0 2613              bne L14
 00A2 E605              lda 5,X
 00A4 AE03              ldx #3
 00A6 42                mul
 00A7 95                tsx
 00A8 AB03              add #3
 00AA E703              sta 3,X
 00AC 200F              bra L11
 00AE           X0:
 00AE           ; 	     }
 00AE           L13:
 00AE           ; 	     else                  //本行无键按下,扫描下一行
 00AE           ; 		    line=(line<<1)|0x01; 
 00AE E604              lda 4,X
 00B0 48                lsla
 00B1 AA01              ora #1
 00B3 E704              sta 4,X
 00B5           L14:
 00B5           L10:
 00B5 6C05              inc 5,X
 00B7           L12:
 00B7 E605              lda 5,X
 00B9 A103              cmp #3
 00BB 259B              blo L9
 00BD           L11:
 00BD           ; 	 }	
 00BD           ; 	  data=data+10+isH-isL;		//自定义按键值,高为21~27,中为11~17,低为1~7
 00BD E603              lda 3,X
 00BF AB0A              add #10
 00C1 EB02              add 2,X
 00C3 E001              sub 1,X
 00C5 E703              sta 3,X
 00C7           ;         if((data%10)==0)   data=0xff;//没有按1~7中的任意一个时,data=0;
 00C7 AE0A              ldx #10
 00C9 8C                clrh
 00CA 52                div
 00CB 8B                pshh
 00CC 86                pula
 00CD 95                tsx
 00CE 4D                tsta
 00CF 2604              bne L23
 00D1 A6FF              lda #-1
 00D3 E703              sta 3,X
 00D5           L23:
 00D5           ; 	  return(data);					
 00D5 E603              lda 3,X
 00D7           L2:
 00D7 A707              ais #7
 00D9                   .dbline 0 ; func end
 00D9 81                rts
 00DA           ;           data -> 0,X
 00DA           ;           tmp2 -> 1,X
 00DA           ;           line -> 2,X
 00DA           ;              i -> 3,X
 00DA           ;           tmp1 -> 4,X
 00DA           ;            tmp -> 5,X
 00DA           _KB_ScanD::
 00DA A7FA              ais #-6
 00DC 95                tsx
 00DD           ;  }
 00DD           ; 
 00DD           ; unsigned char KB_ScanD(void) 
 00DD           ;  {
 00DD           ;        unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
 00DD A6FF              lda #-1
 00DF F7                sta ,X
 00E0           ;        line=0b11111110;        //使第一根行线为0(低电平)
 00E0 A6FE              lda #-2
 00E2 E702              sta 2,X
 00E4           ;        for(i=0;i<3;i++)       //将扫描3根行线
 00E4 6F03              clr 3,X
 00E6 CC0178            jmp L29
 00E9           L26:
 00E9           ; 	  {	
 00E9           ;         tmp=KB_P;            //取KB_P->tmp
 00E9 B600              lda 0
 00EB E705              sta 5,X
 00ED           ;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
 00ED AA0F              ora #15
 00EF E705              sta 5,X
 00F1           ;         tmp=tmp&line;       //令KB_P.n=0,n=0、1、2、3
 00F1 E402              and 2,X
 00F3 E705              sta 5,X
 00F5           ;         KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
 00F5 A4F7              and #-9
 00F7 B700              sta 0
 00F9           ;           asm("NOP");            //等待,消除按键抖动
 00F9 9D                NOP
 00FA           ;           asm("NOP");
 00FA 9D                NOP
 00FB           ;           tmp1=KB_P;
 00FB B600              lda 0
 00FD E704              sta 4,X
 00FF           ;           tmp1&=0b11110000;       //看第这两行是否有键按下
 00FF A4F0              and #-16
 0101 E704              sta 4,X
 0103           ;           if(tmp1!=0xf0)          //有键按下
 0103 A1F0              cmp #-16
 0105 2603              bne X4
 0107 CC016F            jmp L30
 010A           X4:
 010A           ; 	     {
 010A           ; 	     	KB_P=tmp;			//使第四根行线为1
 010A E605              lda 5,X
 010C B700              sta 0
 010E           ;               asm("NOP");            //等待,消除按键抖动
 010E 9D                NOP
 010F           ;               asm("NOP");
 010F 9D                NOP
 0110           ;               tmp2=KB_P;
 0110 B600              lda 0
 0112 E701              sta 1,X
 0114           ;               tmp2&=0b11110000;    
 0114 A4F0              and #-16
 0116 E701              sta 1,X
 0118           ;               if(tmp2==0xf0) {     //看第这i行是否有独立键按下
 0118 A1F0              cmp #-16
 011A 265A              bne L31
 011C           ;                       tmp&=~(1<<MOVEB);//使第四根行线为0
 011C E605              lda 5,X
 011E A4F7              and #-9
 0120 E705              sta 5,X
 0122           ;                       tmp|=(1<<i);   ///使第i根行线为1
 0122 6E0100            mov #1,*__r0
 0125 E603              lda 3,X
 0127 A407              and #7
 0129 2704              beq X3
 012B           X2:
 012B 3800              lsl *__r0
 012D 4BFC              dbnza X2
 012F           X3:
 012F E605              lda 5,X
 0131 BA00              ora *__r0
 0133 E705              sta 5,X
 0135           ;                       KB_P=tmp;
 0135 B700              sta 0
 0137           ;                       asm("NOP");            //等待,消除按键抖动
 0137 9D                NOP
 0138           ;                               asm("NOP");
 0138 9D                NOP
 0139           ;                       tmp=KB_P;
 0139 B600              lda 0
 013B E705              sta 5,X
 013D           ;                       tmp&=0b11110000;
 013D A4F0              and #-16
 013F E705              sta 5,X
 0141           ;                       if(tmp==0xff){
 0141 A1FF              cmp #-1
 0143 2631              bne L31
 0145           ;                               if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
 0145 E604              lda 4,X
 0147 A1E0              cmp #-32
 0149 260B              bne L36
 014B E603              lda 3,X
 014D AE03              ldx #3
 014F 42                mul
 0150 95                tsx
 0151 AB01              add #1
 0153 F7                sta ,X
 0154 202B              bra L28
 0156           L36:
 0156           ; 			        if(i==2)break;
 0156 E603              lda 3,X
 0158 A102              cmp #2
 015A 2602              bne L38
 015C 2023              bra L28
 015E           L38:
 015E           ; 			        if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
 015E E604              lda 4,X
 0160 A1D0              cmp #-48
 0162 2612              bne L31
 0164 E603              lda 3,X
 0166 AE03              ldx #3
 0168 42                mul
 0169 95                tsx
 016A AB16              add #22
 016C F7                sta ,X
 016D 2012              bra L28
 016F           X1:
 016F           ; 			    }
 016F           ; 	        }
 016F           ; 	     }
 016F           L30:
 016F           ; 	     else                  //本行无键按下,扫描下一行
 016F           ; 		    line=(line<<1)|0x01; 
 016F E602              lda 2,X
 0171 48                lsla
 0172 AA01              ora #1
 0174 E702              sta 2,X
 0176           L31:
 0176           L27:
 0176 6C03              inc 3,X
 0178           L29:
 0178 E603              lda 3,X
 017A A103              cmp #3
 017C 2403              bhs X5
 017E CC00E9            jmp L26
 0181           X5:
 0181           L28:
 0181           ; 	 }	
 0181           ; 	 return(data);					
 0181 F6                lda ,X
 0182           L25:
 0182 A706              ais #6
 0184                   .dbline 0 ; func end
 0184 81                rts

⌨️ 快捷键说明

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