首页>问题汇总>矩阵键盘 - 赵一锦
矩阵键盘 - 赵一锦

4*4矩阵键盘:

 

AVR接线的矩阵键盘内部接线图如图1,图2所示:



图1 矩阵内部接线图

 


图2 矩阵键盘接AVR单片机

 

接线图解释:
4*4矩阵键盘的行接在PD口的高四位,列接在PD口的低四位。
控制思想:
将PD口的高四位(或低四位)作为输入,并使能上拉,低四位(或高四位)作为输出,并输出高电平。对PD口的低四位(或高四位)的输出进行循环拉低,同时对PD的高四位(低四位)进行循环扫描,输入值有为0的即可通过行列来确定。
即:
1.将所有的行线都置为高电平
2.依次将所有的列线都置为低电平,然后读取行线状态
3.如果对应的有行列线上有按键被按下,则读入的行线为低电平
4.根据行列键盘的输出将按键编码并且输出
5.当扫描到对应的按键后,则对其进行相应的处理

 

矩阵键盘可参考的源代码(key.h和key.c,延时函数delay参见延时函数链接)

/*----------key.h---------*/

#ifndef _DELAY_H_
#define _DELAY_H_

unsigned char read_key(void);

#endif

 

/*---------key.c---------*/

#include <iom64v.h>
#include <macros.h>
#include "delay.h"
#include "key.h"

unsigned char read_key(void)
{
unsigned char i,j,keynum,key;
unsigned char const key_table[]=
{
'1','2','3','A',
'4','5','6','B',
'7','8','9','C',
'*','0','#','D'
};
DDRD=0xf0;
PORTD=0x0f;
if((PIND&0x0f)==0x0f)
{
keynum=0xFF;
}
else
{
delay_ms(10);
if((PIND&0x0f)==0x0f)
{
keynum=0xFF;
}
else
{
for(i=4;i<8;i++)
{
PORTD=~(1<<i)|0x0f;
for(j=0;j<4;j++)
{
if((PIND&(1<<j))==0)
{
keynum=(i-4)*4+j;
}
}
}
}
}
if(keynum==0xFF)
{
return keynum;
}
else
{
key=key_table[keynum];
return key;
}
}

Copyright © 2019 作者:张泽zzhang1@gzu.edu.cn. 大学教师. 网站备案号:黔ICP备18012493号