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

📄 kbsub.c

📁 飞思卡尔U08开发平台下可以自由运行
💻 C
字号:
/*-----------------------------------------------------*
*文件描述:本文件包含了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:键盘初始化函数-------------------------------*
*功  能:初始化键盘中断的引脚,但未开放键盘中断         *
*参  数:无                                             *
*返  回:无                                             *
*-----------------------------------------------------*/  
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)
}
void KB_Init1(void)
{
	 KB_P=0x00;             //复位KB_P
	 KB_D=0b11110000;       //定定义3-0为输入,7-4为输出
	 KB_PUE=0b00001111;     //定义输入引脚有内部上拉电阻
	 INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
	 INTKBIER=0b00001111;   //允许输入引脚的中断可进入
	 INTKBSCR|= (1<<ACKKBit);  //清键盘中断请求(ACKK=1)
}
/*KB_Scan:扫描读取键值函数-----------------------------*
*功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
*         若无按键,*p为0xff                           *
*参  数:无                                             *
*返  回:扫描到的键值                                   *
*-----------------------------------------------------*/  
unsigned char KB_Scan(void) 
 {
     
	 unsigned char line,i,j,tmp,tmp1,line1;
	 KB_Init();
     line=0b11111110;        //使第一根行线为0(低电平)
	 for(i=1;i<=4;i++)         //将扫描4根行线
	  {	
       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)          //本行有键按下
	     {
	        tmp=KB_P;
	        if(KB_P==0xE7||KB_P==0xB7)
	        {
	        while(1)
	        {
	        //*/
	        KB_Init1();
	        line1=0b11101111;        //使第一根列线为0
	 for(j=1;j<=3;j++)         //扫描3列,确定有无1~~~7键按下
	  {	
	    tmp1=KB_P;            //取KB_P->tmp
        tmp1|=0b11110000;     //KB_P.1-3保留,KB_P.4-7为1
        KB_P=tmp&line1;       //令KB_P.n=0,n=0、1、2、3
	    asm("NOP");            //等待,消除按键抖动
	    asm("NOP");
	    tmp1=KB_P;
	    tmp1&=0b00001111;       //看第n行是否有键按下
	    if(tmp1!=0x0f)          //本行有键按下
	     {  
	        
	        if(KB_P==0xEE&&tmp==0xE7)  tmp=0xE6;
	        else if(KB_P==0xED&&tmp==0xE7)tmp=0xE5;
	        else if(KB_P==0xEB&&tmp==0xE7)tmp=0xE3;
	        else if(KB_P==0xBE&&tmp==0xE7)tmp=0xA6;
	        else if(KB_P==0xBD&&tmp==0xE7)tmp=0xA5;
	        else if(KB_P==0xDD&&tmp==0xe7)tmp=0xc5;
	        else if(KB_P==0xDE&&tmp==0xe7)tmp=0xc6;
	       
	        else if(KB_P==0xEE&&tmp==0xB7)tmp=0xAA;
	        else if(KB_P==0xED&&tmp==0xB7)tmp=0x55;
	        else if(KB_P==0xEB&&tmp==0xB7)tmp=0xA3; 
	        else if(KB_P==0xBE&&tmp==0xB7)tmp=0xB6;
	        else if(KB_P==0xBD&&tmp==0xB7)tmp=0xB5;
	        else if(KB_P==0xDD&&tmp==0xB7)tmp=0x95;
	        else if(KB_P==0xDE&&tmp==0xB7)tmp=0x96;
	        
		    break;
	     }
	     
	     else                  //本行无键按下,扫描下一列
		    line1=(line1<<1)+0x10; 
		 
	 }	
	 
	
	  if(j==4)   tmp=0xff;
	  break;
	 }
	  return(tmp);
	        
	        //*/
	        }
		    break;
	     }
	     else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01; 
	 }	
	  if(i==5)   tmp=0xff;
	  return(tmp);
 }
/*KB_Def:键值转为定义值函数----------------------------*
*功  能:键值转为定义值                                 *
*参  数:键值                                           *
*返  回:键定义值                                       *
*-----------------------------------------------------*/
//键盘定义表
const unsigned char KB_Table[]= 
{0xEE,'1',0xDE,'2',0xBE,'3',0xED,'4',0xDD,'5',0xBD,'6',0xEB,'7',0xE7,'*',0xB7,'#',
 0xE6,'a',0xC6,'b',0xA6,'c',0xE5,'d', 0xC5,'e', 0xA5,'f',0xE3,'g',//按键*1,*2,*3,*4,*5,*6,*7
 0xAA,'A',0x96,'B',0xB6,'C',0x55,'D', 0x95,'E', 0xB5,'F',0xA3,'G',//按键#1,#2,#3,#4,#5,#6,#7
 0x00};
unsigned char KB_Def(unsigned char KB_valve)
 {
   unsigned char KeyPress;
   unsigned char i;
   unsigned char j;
   i=0;
   while(1)
   {
     j=KB_Table[i];
     //与0(定义表结束标志)相比较
     if (j==0)                   //=0,即表中无次定义值
        {KeyPress=0xff; break;}  //返回0xff
     else
        //与键值相比较
        if (j==KB_valve)         //找到       
           {KeyPress=KB_Table[i+1];break;} //取键定义值
        else
           i+=2;              //指向下一个键值,继续判断
    };
    return KeyPress;
 } 

  

⌨️ 快捷键说明

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