|
/*-----------------------------------------------------* *文件描述:本文件包含了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) * *-----------------------------------------------------*/ /*[以下为子程序源代码]*/ /*[头文件]*/ #i nclude "GP32C.H" #i nclude "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 line,i,tmp; 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; 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',0x7E,'A', 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B', 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C', 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D', 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; }
|