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

📄 kb.c

📁 飞思卡尔的电子钟和电子琴的课程设计,包括源代码
💻 C
字号:
#include "GP32C.H"
#include "DJC.h"
/*KB_Init:键盘初始化函数-------------------------------*
*功  能:初始化键盘中断的引脚,但未开放键盘中断         *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/  
void KB_Init(void)
{
	 KB_P=0x00;             //复位KB_P
	 KB_D=0b00001111;       //定定义7-4为输入,3-0为输出
	 KB_PUE=0b11110000;     //定义输入引脚有内部上拉电阻
	 INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	 INTKBIER=0b11110000;   //允许输入引脚的中断可进入
	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
}
/*KB_Scan:扫描读取键值函数-----------------------------*
*功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
*         若无按键,*p为0xff                           *
*参  数:无                                             *
*返  回:扫描到的键值                                   *
*-----------------------------------------------------*/  
unsigned char KB_Scan(void)               
 {
	 unsigned char line,i,tmp,tmp1,data=0x00,isH=0,isL=0;
	 KB_Init();
	 line=0b11110111;		//取第四行为零,先识别高低键
	 tmp=KB_P;            //取KB_P->tmp
     tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
     KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	 asm("NOP");            //等待,消除按键抖动
	 asm("NOP");
	 tmp=KB_P;
	 tmp&=0b11110000;       //看第n行是否有键按下       //看第这行是否有键按下
	 if(tmp!=0xf0)          //本行有键按下
	 {
	 	if((tmp&0b00010000)==0)	isL=10;//按下了*
	 	if((tmp&0b00100000)==0)isH=10;	 //按下了0		
	 }
     line=0b11111110;        //使第一根行线为0(低电平)
	 for(i=0;i<3;i++)       //将扫描3根行线
	  {	
        tmp=KB_P;            //取KB_P->tmp
        tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
        KB_P=tmp&line;       //令KB_P.n=0,n=0、1、2、3
	    asm("NOP");            //等待,消除按键抖动
	    asm("NOP");
	    tmp=KB_P;
	    tmp&=0b11110000;       //看第n行是否有键按下
	    if(tmp!=0xf0)          //本行有键按下
	     {
	        if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
	        if(i==2)break;
	        if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
	        if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
	     }
	     else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01; 
	 }	
	  data=data+10+isH-isL;		//自定义按键值,高为21~27,中为11~17,低为1~7
	  if((data%10)==0)   data=0xff;//没有按1~7中的任意一个时,data=0;
	  return(data);					
 }

unsigned char KB_ScanD(void) 
 {
	 unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
	 line=0b11111110;        //使第一根行线为0(低电平)
	 for(i=0;i<3;i++)       //将扫描3根行线
	  {	
        tmp=KB_P;            //取KB_P->tmp
        tmp|=0b00001111;     //KB_P.7-4保留,KB_P.3-0为1
        tmp=tmp&line;       //令KB_P.n=0,n=0、1、2、3
        KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
	    asm("NOP");            //等待,消除按键抖动
	    asm("NOP");
	    tmp1=KB_P;
	    tmp1&=0b11110000;       //看第这两行是否有键按下
	    if(tmp1!=0xf0)          //有键按下
	     {
	     	KB_P=tmp;			//使第四根行线为1
	    	asm("NOP");            //等待,消除按键抖动
	    	asm("NOP");
	    	tmp2=KB_P;
	    	tmp2&=0b11110000;    
	    	if(tmp2==0xf0) {     //看第这i行是否有独立键按下
	    		tmp&=~(1<<MOVEB);//使第四根行线为0
	    		tmp|=(1<<i);   ///使第i根行线为1
		    	KB_P=tmp;
		    	asm("NOP");            //等待,消除按键抖动
	   		 	asm("NOP");
	    		tmp=KB_P;
	    		tmp&=0b11110000;
	    		if(tmp==0xff){
			        if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
			        if(i==2)break;
			        if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
			    }
	        }
	     }
	     else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01; 
	 }	
	 return(data);					
 }

⌨️ 快捷键说明

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