freescale
来自「Freescale 系列单片机常用模块与综合系统设计」· 代码 · 共 89 行
TXT
89 行
#include "KEY.h"
#include "KEY_LINE.h"
#include "LCD1602.h"
//键盘定义表
const Uchar 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};
/*----------------------------------------------------------------------------*
* 函数: KB_Scan:扫描读取键值函 *
* 功 能: 扫描一次4*4键盘上的按键,读取键值->*p *
* 若无按键,*p为0xff *
*参 数: 无 *
*返 回: 扫描到的键值 *
*-----------------------------------------------------------------------------*/
Uchar KB_Scan(void)
{
Uchar line,i,tmp;
line=0b11111110; //使第一根行线为0(低电平)
for(i=1;i<=4;i++) //将扫描4根行线
{
tmp=KEY_GetVal(); //取列线输入值
tmp <<=4;
tmp |= KEY_LINE_GetVal(); //取行线值
tmp |= 0b00001111; //行线全为1
KEY_LINE_PutVal(tmp&line);
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp=KEY_GetVal();
tmp&=0b11110000; //看第n行是否有键按下
if(tmp!=0xf0) //本行有键按下
{
tmp=KEY_GetVal();
break;
}
else //本行无键按下,扫描下一行
{
line=(line<<1)|0x01;
}
}
if(i == 5)
{
tmp=0xff;
}
return(tmp);
}
/*--------------------------------------------------------------------*
*函 数: KB_Def:键值转为定义值函数 *
*功 能: 键值转为定义值 *
*参 数: 键值 *
*返 回: 键定义值 *
*----------------------------------------------------------------------*/
Uchar KB_Def(Uchar KB_value)
{
Uchar KeyPress;
Uchar i;
Uchar j;
i=0;
while(1)
{
j=KB_Table[i];
//与0(定义表结束标志)相比较
if (j==0) //=0,即表中无次定义值
{
KeyPress=0xff; //返回0xff
break;
}
else //与键值相比较
{
if (j==KB_value) //找到
{
KeyPress=KB_Table[i+1]; //取键定义值
break;
}
else
{
i+=2; //指向下一个键值,继续判断
}
}
};
return KeyPress;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?