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

📄 kbsub.s

📁 基于HC908GP32的电子琴程序
💻 S
字号:
	.module KBsub.c
	.area text
_KB_Init::
; /*-----------------------------------------------------*
; *文件描述:本文件包含了H08C键盘中断子函数,分别为:       *  
; *(1)KB_Init:键盘初始化函数                             *
; *   void KB_Init(void)                                 *
; *(2)KB_Scan:扫描读取键值函数                           *
; *   unsigned char KB_Scan(void)                        *
; *(3)KB_Def:键值转为定义值函数                          *
; *   unsigned char KB_Def(unsigned char KB_valve)       *
; *-----------------------------------------------------*/
; /*[以下为子程序源代码]*/
; /*[头文件]*/
; #include "GP32C.H"
; #include "KB.h"
; /*KB_Init:键盘初始化函数--------3-----------------------*
; *功  能:初始化键盘中断的引脚,但未开放键盘中断         *
; *参  数:无                                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/  
; void KB_Init(void)
; {
; 	 KB_P=0x00;             //复位KB_P
	clr 0
; 	 KB_D=0b11110000;       //定定义3-0为输入,7-4为输出
	lda #-16
	sta 0x4
; 	 KB_PUE=0b00001111;     //定义输入引脚有内部上拉电阻
	lda #15
	sta 0xd
L1:
	.dbline 0 ; func end
	rts
;           line -> 0,X
;              i -> 1,X
;            tmp -> 2,X
_KB_Scan1::
	ais #-3
	tsx
; }
; /*KB_Scan:扫描读取键值函数-----------------------------*
; *功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
; *         若无按键,*p为0xff                           *
; *参  数:无                                             *
; *返  回:扫描到的键值                                   *
; *-----------------------------------------------------*/  
; unsigned char KB_Scan1(void) 
;  {
; 	 unsigned char line,i,tmp;
;      line=0b11101111;        //使第一根列线为0(低电平)
	lda #-17
	sta ,X
; 	 for(i=1;i<=4;i++)         //将扫描4根行线
	lda #1
	sta 1,X
	bra L6
L3:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 2,X
;         tmp|=0b11110000;     //KB_P.3-0保留,KB_P.7-4为1
	ora #-16
	sta 2,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=4、5、6、7
	and ,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 2,X
; 	    tmp&=0b00001111;       //看第n行是否有键按下
	and #15
	sta 2,X
; 	    if(tmp!=0x0f)          //本行有键按下
	cmp #15
	beq L7
; 	     {
; 	        tmp=KB_P;
	lda 0
	sta 2,X
; 		    break;
	bra L5
L7:
	lda ,X
	lsla
	ora #1
	sta ,X
L4:
	inc 1,X
L6:
	lda 1,X
	cmp #4
	bls L3
L5:
; 		    
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line<<1)|0x01; 
; 	 }	
; 	  if(i==5)   tmp=0xff;
	lda 1,X
	cmp #5
	bne L9
	lda #-1
	sta 2,X
L9:
; 	  return(tmp);
	lda 2,X
L2:
	ais #3
	.dbline 0 ; func end
	rts
;           line -> 0,X
;              i -> 1,X
;            tmp -> 2,X
_KB_Scan2::
	ais #-3
	tsx
;  }
;  
;  
; unsigned char KB_Scan2(void) 
;  {
; 	 unsigned char line,i,tmp;
;      line=0b01111111;        //使最后一根列线为0(低电平)
	lda #127
	sta ,X
; 	 for(i=1;i<=4;i++)         //将扫描4根行线
	lda #1
	sta 1,X
	bra L15
L12:
; 	  {	
;         tmp=KB_P;            //取KB_P->tmp
	lda 0
	sta 2,X
;         tmp|=0b11110000;     //KB_P.3-0保留,KB_P.7-4为1
	ora #-16
	sta 2,X
;         KB_P=tmp&line;       //令KB_P.n=0,n=4、5、6、7
	and ,X
	sta 0
; 	    asm("NOP");            //等待,消除按键抖动
	NOP
; 	    asm("NOP");
	NOP
; 	    tmp=KB_P;
	lda 0
	sta 2,X
; 	    tmp&=0b00001111;       //看第n行是否有键按下
	and #15
	sta 2,X
; 	    if(tmp!=0x0f)          //本行有键按下
	cmp #15
	beq L16
; 	     {
; 	        tmp=KB_P;
	lda 0
	sta 2,X
; 		    break;
	bra L14
L16:
	lda ,X
	lsra
	add #-128
	sta ,X
L13:
	inc 1,X
L15:
	lda 1,X
	cmp #4
	bls L12
L14:
; 	     }
; 	     else                  //本行无键按下,扫描下一行
; 		    line=(line>>1)+128; 
; 	 }	
; 	  if(i==5)   tmp=0xff;
	lda 1,X
	cmp #5
	bne L18
	lda #-1
	sta 2,X
L18:
; 	  return(tmp);
	lda 2,X
L11:
	ais #3
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

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