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

📄 kbsub.c

📁 要用到开发工具SD-H08
💻 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)
}
/*KB_Scan:扫描读取键值函数,可以读取多个按键的按下------*
*功  能:扫描一次4*4键盘上的按键,读取键值->*p          *
*         若无按键,*p为0xff                           *
*参  数:无                                             *
*返  回:扫描到的键值                                   *
*-----------------------------------------------------*/  
unsigned char KB_Scan(void) 
 {
	 unsigned char ch,k,line,i,tmp;
     line=0b11111110;        //使第一根行线为0(低电平)
     ch=0xff;
     k=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)          //本行有键按下
	     {
	        ch&=KB_P;//ch与上一次检测得到的按键扫描码进行与操作得到按键的总值
	        k++;
	     }
	    line=(line<<1)|0x01; 
	 }	
		tmp=ch;
	 	if(k==0)   tmp=0xff;
	  	return(tmp);
 }
/*KB_Def:键值转为定义值函数----------------------------*
*功  能:键值转为定义值                                 *
*参  数:键值                                           *
*返  回:键定义值                                       *
*-----------------------------------------------------*/
//键盘定义表
const unsigned char KB_Table[]= 
{0xE6,0xC6,0xA6,0xE5,0xC5,0xA5,0xE3,//低音
0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,//中音
0xC6,0xD6,0x96,0xC5,0xD5,0x95,0xC3,//高音
0xB7,'=',//等号字符
 0x00};//其中8为退格键
const unsigned int KB_Frq[]=
{262,294,330,349,392,440,494,
523,558,660,698,784,880,988,
1046,1175,1318,1397,1568,1760,1976,0};
unsigned int KB_Def(unsigned char KB_valve)
 {
   unsigned int KeyPress;
   unsigned char i;
   unsigned char j;
   i=0;
   while(1)
   {
     j=KB_Table[i];
     //与0(定义表结束标志)相比较
     if (j==0)                   //=0,即表中无次定义值
        {KeyPress=0xffff; break;}  //返回0xff
     else
        //与键值相比较
        if (j==KB_valve)         //找到       
           {KeyPress=KB_Frq[2*i];break;} //取键定义值
        else
           i+=1;              //指向下一个键值,继续判断
    };
    return KeyPress;
 } 

  

⌨️ 快捷键说明

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