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

📄 kb.s

📁 飞思卡尔的电子钟和电子琴的课程设计,包括源代码
💻 S
字号:
	.module kb.c
	.area text
_KB_Init::
; #include "GP32C.H"
; #include "DJC.h"
; /*KB_Init:键盘初始化函数-------------------------------*
; *功  能:初始化键盘中断的引脚,但未开放键盘中断         *
; *参  数:无                                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/  
; void KB_Init(void)
; {
; 	 KB_P=0x00;             //复位KB_P
	clr 0
; 	 KB_D=0b00001111;       //定定义7-4为输入,3-0为输出
	lda #15
	sta 0x4
; 	 KB_PUE=0b11110000;     //定义输入引脚有内部上拉电阻
	lda #-16
	sta 0xd
; 	 INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	bset #1,0x1a
; 	 INTKBIER=0b11110000;   //允许输入引脚的中断可进入
	lda #-16
	sta 0x1b
; 	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
	bset #2,0x1a
L1:
	.dbline 0 ; func end
	rts
;           tmp1 -> 0,X
;            isL -> 1,X
;            isH -> 2,X
;           data -> 3,X
;           line -> 4,X
;              i -> 5,X
;            tmp -> 6,X
_KB_Scan::
	ais #-7
	tsx
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
; *         若无按键,*p为0xff                           *
; *参  数:无                                             *
; *返  回:扫描到的键值                                   *
; *-----------------------------------------------------*/  
; unsigned char KB_Scan(void)               
;  {
; 	 unsigned char line,i,tmp,tmp1,data=0x00,isH=0,isL=0;
	clr 3,X
	clr 2,X
	clr 1,X
; 	 KB_Init();
	jsr _KB_Init
	tsx
; 	 line=0b11110111;		//取第四行为零,先识别高低键
	lda #-9
	sta 4,X
; 	 tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 6,X
;      tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 6,X
;      KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and 4,X
	sta 0
; 	 asm("NOP");            //等待,消除按键抖动
	NOP
; 	 asm("NOP");
	NOP
; 	 tmp=KB_P;
	lda 0
	sta 6,X
; 	 tmp&=0b11110000;       //看第n行是否有键按下       //看第这行是否有键按下
	and #-16
	sta 6,X
; 	 if(tmp!=0xf0)          //本行有键按下
	cmp #-16
	beq L3
; 	 {
; 	 	if((tmp&0b00010000)==0)	isL=10;//按下了*
	bit #16
	bne L5
	lda #10
	sta 1,X
L5:
; 	 	if((tmp&0b00100000)==0)isH=10;	 //按下了0		
	lda 6,X
	bit #32
	bne L7
	lda #10
	sta 2,X
L7:
; 	 }
L3:
;      line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta 4,X
; 	 for(i=0;i<3;i++)       //将扫描3根行线
	clr 5,X
	bra L12
L9:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 6,X
;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 6,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and 4,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 6,X
; 	    tmp&=0b11110000;       //看第n行是否有键按下
	and #-16
	sta 6,X
; 	    if(tmp!=0xf0)          //本行有键按下
	cmp #-16
	beq L13
; 	     {
; 	        if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
	cmp #-32
	bne L15
	lda 5,X
	ldx #3
	mul
	tsx
	add #1
	sta 3,X
	bra L11
L15:
; 	        if(i==2)break;
	lda 5,X
	cmp #2
	bne L17
	bra L11
L17:
; 	        if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
	lda 6,X
	cmp #-48
	bne L19
	lda 5,X
	ldx #3
	mul
	tsx
	add #2
	sta 3,X
	bra L11
L19:
; 	        if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
	lda 6,X
	cmp #-80
	bne L14
	lda 5,X
	ldx #3
	mul
	tsx
	add #3
	sta 3,X
	bra L11
X0:
; 	     }
L13:
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01; 
	lda 4,X
	lsla
	ora #1
	sta 4,X
L14:
L10:
	inc 5,X
L12:
	lda 5,X
	cmp #3
	blo L9
L11:
; 	 }	
; 	  data=data+10+isH-isL;		//自定义按键值,高为21~27,中为11~17,低为1~7
	lda 3,X
	add #10
	add 2,X
	sub 1,X
	sta 3,X
; 	  if((data%10)==0)   data=0xff;//没有按1~7中的任意一个时,data=0;
	ldx #10
	clrh
	div
	pshh
	pula
	tsx
	tsta
	bne L23
	lda #-1
	sta 3,X
L23:
; 	  return(data);					
	lda 3,X
L2:
	ais #7
	.dbline 0 ; func end
	rts
;           data -> 0,X
;           tmp2 -> 1,X
;           line -> 2,X
;              i -> 3,X
;           tmp1 -> 4,X
;            tmp -> 5,X
_KB_ScanD::
	ais #-6
	tsx
;  }
; 
; unsigned char KB_ScanD(void) 
;  {
; 	 unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
	lda #-1
	sta ,X
; 	 line=0b11111110;        //使第一根行线为0(低电平)
	lda #-2
	sta 2,X
; 	 for(i=0;i<3;i++)       //将扫描3根行线
	clr 3,X
	jmp L29
L26:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 5,X
;         tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
	ora #15
	sta 5,X
;         tmp=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	and 2,X
	sta 5,X
;         KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
	and #-9
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp1=KB_P;
	lda 0
	sta 4,X
; 	    tmp1&=0b11110000;       //看第这两行是否有键按下
	and #-16
	sta 4,X
; 	    if(tmp1!=0xf0)          //有键按下
	cmp #-16
	bne X4
	jmp L30
X4:
; 	     {
; 	     	KB_P=tmp;			//使第四根行线为1
	lda 5,X
	sta 0
; 	    	asm("NOP");            //等待,消除按键抖动
	NOP
; 	    	asm("NOP");
	NOP
; 	    	tmp2=KB_P;
	lda 0
	sta 1,X
; 	    	tmp2&=0b11110000;    
	and #-16
	sta 1,X
; 	    	if(tmp2==0xf0) {     //看第这i行是否有独立键按下
	cmp #-16
	bne L31
; 	    		tmp&=~(1<<MOVEB);//使第四根行线为0
	lda 5,X
	and #-9
	sta 5,X
; 	    		tmp|=(1<<i);   ///使第i根行线为1
	mov #1,*__r0
	lda 3,X
	and #7
	beq X3
X2:
	lsl *__r0
	dbnza X2
X3:
	lda 5,X
	ora *__r0
	sta 5,X
; 		    	KB_P=tmp;
	sta 0
; 		    	asm("NOP");            //等待,消除按键抖动
	NOP
; 	   		 	asm("NOP");
	NOP
; 	    		tmp=KB_P;
	lda 0
	sta 5,X
; 	    		tmp&=0b11110000;
	and #-16
	sta 5,X
; 	    		if(tmp==0xff){
	cmp #-1
	bne L31
; 			        if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
	lda 4,X
	cmp #-32
	bne L36
	lda 3,X
	ldx #3
	mul
	tsx
	add #1
	sta ,X
	bra L28
L36:
; 			        if(i==2)break;
	lda 3,X
	cmp #2
	bne L38
	bra L28
L38:
; 			        if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
	lda 4,X
	cmp #-48
	bne L31
	lda 3,X
	ldx #3
	mul
	tsx
	add #22
	sta ,X
	bra L28
X1:
; 			    }
; 	        }
; 	     }
L30:
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01; 
	lda 2,X
	lsla
	ora #1
	sta 2,X
L31:
L27:
	inc 3,X
L29:
	lda 3,X
	cmp #3
	bhs X5
	jmp L26
X5:
L28:
; 	 }	
; 	 return(data);					
	lda ,X
L25:
	ais #6
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

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