AD按键-矩阵按键:

2023-06-25,,

原理:利用数组分压+AD采集;

优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来);可备用作为AD基准输入。

缺点:不能做成组合按键(或者电阻要精确选择);且离IO口越近优先级越高。按键的识别收到精度的影响(消兜:抖动时间几毫秒到几十毫秒,所以连续读4次(每次8ms)直到读到值都相同。按键的识别是靠AD值的容差范围而非具体的AD值来识别)。基准电压的获得(IO或TL431)

参考http://www.ednchina.com/ART_46350_11_0_OA_6f4d5e96.HTM

http://blog.sina.com.cn/s/blog_7a9b7c4c0100sohh.html

http://wenku.baidu.com/link?url=-vUPz14ryQnsrXNIJdfbOn1qw1JsJqIFRG9VUhxbaGjy80GEzZz8judHw1WRubzAsb-KOUzGfZQ-zVpOKu2PVH-SvRerysWsd-F_kTzivwS

--------------------------矩阵按键程序---------------------------------------------

矩阵键盘是否接上拉电阻:网友说法对于哪些弱上拉驱动能力弱的准3态IO的需要加,为了抗干扰也需要加;否则就不需要加。

/**************************************************************
*按键的键值分布图:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
***************************************************************/
/**************************************************************
* 功能:P3外接4×4按键, 按照查表法读出键值,使用时需要添加延时消抖动
* 返回:按键值0~15/如无键按下, 返回16
***************************************************************/
/*uchar keyscan(void)
{
uchar code K_Tab[4][4] = {
0xee, 0xde, 0xbe, 0x7e, //扫描码为0xfe时(仅第一行为0)第一行4列4个按键可能按下时的值
0xed, 0xdd, 0xbd, 0x7d, //扫描码为0xfd时(仅第二行为0)第二行4列4个按键可能按下时的值
0xeb, 0xdb, 0xbb, 0x7b,
0xe7, 0xd7, 0xb7, 0x77};
uchar temp1 = 0xfe, temp2, i, j;
for(i = 0; i < 4; i++)
{ //扫描低四位
P3 = temp1; //输出一行0
temp2 = P3; //马上就读入
if((temp2 & 0xf0) != 0xf0) //如果有键按下
{
for(j = 0; j < 4; j++) //就扫描高四位
if(temp2 == K_Tab[i][j]) //查表
return i * 4 + j; //查到了就返回按键的数值
}
else temp1 = _crol_(temp1, 1);//非51的循环移位处理:(uchar)~(1<<i)
}
return 16; //没有查到,返回按键松开的代码
} */ //呵呵,实质性的语句不过9行,就是这么简练!

/**************************************************************
* 功能: 按照反转计算法读出键值(IO必须是双向的或能切换),不用循环结构
* 输出:按键值0~15/如无键按下, 返回16
***************************************************************/
uchar keyscan(void)
{
uchar temH, temL,hang,lie;
uchar key_value;
P3 = 0xf0;
if(P3 != 0xf0)
{
delay(5); //消抖
if(P3 != 0xf0) //的确是有按键被按下
{
P3 = 0xf0; temH = P3; //低四位先输出0;读入,高四位含有按键信息
P3 = 0x0f; temL = P3; //然后反转输出0;读入,低四位含有按键信息
switch(temH) {
case 0xe0: lie = 0; break;
case 0xd0: lie = 1; break;
case 0xb0: lie = 2; break;
case 0x70: lie = 3; break;
default: lie = 16;//按下的不是上述按键,就当是没有按键
}
switch(temL)
{
case 0x0e: hang = 0; break;
case 0x0d: hang = 1; break;
case 0x0b: hang = 2; break;
case 0x07: hang = 3; break;;
default: hang = 16;//按下的不是上述按键,就当是没有按键
}
retrun (hang -1)*4 + lie;
}
}
}

定时器的消抖法(裸奔程序):初始化keyvalue=一个不可能存在的值。

1当有按键按下时(keyolder),启动定时器定时10MS(systick),然后退出;

2定时到后置位Flag_10MS,并读按键值keynew

3if((Flag_10MS)&&(keyoder==keynew)) keyvalue=keynew;

4键值使用:

  if(keyvalue!=一个不可能存在的值)

  {

          ....

 }

AD按键-矩阵按键:的相关教程结束。

《AD按键-矩阵按键:.doc》

下载本文的Word格式文档,以方便收藏与打印。