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

📄 kb.c

📁 为苏州一家公司所做的的恒温恒湿车间控制 系统
💻 C
字号:
/*------------------------------------------------------------------------*
*文件描述:本文件包含了对外接口的4子程序,分别为:                           *
*(1)KB_Init:键盘初始化                                                    *
*(2)KB_Scan:扫描读取键值                                                  *
*(3)KB_Def:键值转为定义值                                                 *
*------------------------------------------------------------------------*/
#include "KB.h"     //键盘头文件
/* KB_Init:键盘初始化------------------------------------------------------*
*功  能:初始化键盘中断的引脚,但未放开键盘中断                             *
*参  数:无                                                                 *
*返  回:无                                                                 *
*-------------------------------------------------------------------------*/
void KB_Init(void)          //键盘初始化
{
    //定义2根列线的引脚为输入(0)并有内部上拉电阻(1)。(引脚7-6)
    KB_D&=0b00111111;       //(不干预本程序未用引脚)
    KB_PUE|=0b11000000;   
    //定义两根行线的引脚为输出(1) (引脚5-4)
    KB_D|=0b00110000;        //(不干预本程序未用引脚) 
    KB_P&=0b11001111;     //令KBRow_P.4-5=0,不干预本程序未用引脚
    //键盘中断设置
	INTKBSCR|= (1<<IntBit);  //屏蔽键盘中断(IMASKk=1)
	INTKBIER|=0b11000000;    //允许PTA7-6作为中断输入引脚
	INTKBSCR|= (1<<ACKKBit); //清键盘中断请求(ACKK=1)   
}
/* KB_Scan:扫描读取键值函数------------------------------------------------*
*功  能:扫描2*2键盘上的按键,读取键值返回,若无按键返回0xff                  *
*参  数:无                                                                 *
*返  回:键值,若无按键返回0xff                                             *
*-------------------------------------------------------------------------*/
INT8U KB_Scan(void)    //扫描读取键值
{
     INT8U line,i,tmp;
     line=0b11101111;        //使第一根行线为0(低电平)
	 for(i=1;i<=2;i++)        //将扫描2根行线
	 {	
        tmp=KB_P;            //取KB_P->tmp
        tmp|=0b00111111;     //KB_P.7-6保留,KB_P.5-4为1
        KB_P=tmp&line;       //令KB_P.n=0,n=4、5	    
	    asm("NOP");          //等待,消除按键抖动
	    asm("NOP");
	    tmp=KB_P;
	    tmp&=0b11000000;       //看第n行是否有键按下
	    if(tmp!=0xC0)          //本行有键按下
	     {
	        tmp=KB_P;
		    break;
	     }
	     else                  //本行无键按下,扫描下一行
		    line=(line<<1)|0x01; 
	 }	
	  if(i==3)   tmp=0xff;
	    return(tmp);
}

/* KB_Def:键值转为定义值---------------------------------------------------*
*功  能:键值转化为定义值                                                   *
*参  数:KBKey-键值                                                        *
*返  回:键定义值(返回0x00,表示无此定义值)                                  *
*-------------------------------------------------------------------------*/
const INT8U KB_Table[]= 
{
    0xA0,'A',0x60,'B',
    0x90,'C',0x50,'D',
    0x00
};  
INT8U KB_Def(INT8U KBKey)   //键值转化为定义值
{
	INT8U KeyPress;
	INT8U i;
	INT8U j;
	i=0;
	while(1)
	{
	 j=KB_Table[i];
	 //与0(定义表结束标志)相比较
	 if (j==0)                   //=0,即表中无次定义值
	    {KeyPress=0xff; break;}  //返回0xff
	 else
	    //与键值相比较
	    if (j==KBKey)         //找到       
	       {KeyPress=KB_Table[i+1];break;} //取键定义值
	    else
	       i+=2;              //指向下一个键值,继续判断
	}
	return KeyPress;    
}

⌨️ 快捷键说明

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