第一篇文章先从简单的矩阵键盘开始吧~
源代码下载
本文提及的部分代码已上传到Github:戳这里
键盘外观
键盘外观一般是这个样子的,淘宝上常见的有4x4和4x3的,也有不是薄膜而是按键矩阵的键盘,但是原理都大同小异。
键盘原理图
一般来说,键盘有多少行多少列,就有行数+列数这么多的管脚。当按钮按下后,按钮所在行列开关合上,行列之间的管脚就连通了。
单片机实现
4x3键盘
根据键盘的原理图,不难想到我们要用管脚扫描的方式来检测哪个键按下。
将行管脚设为输入,列管脚设为输出(当然也可以反着来),每次只让一个列管脚为高电平,再检测行管脚的电平高低情况,即可检测键盘是哪个键按下了。
初始化管脚
void keyboard_init(){
//设置行管脚为输入
P3DIR &= ~BIT6; //P3.6端口设为输入
P3REN |= BIT6; //使P3.6能上拉/下拉电阻
P3OUT &= ~BIT6; //置P3.6为下拉电阻模式
P3SEL &= ~BIT6; //P3.6为I/O接口
P7DIR &= ~BIT0; //P7.0端口设为输入
P7REN |= BIT0; //使P7.0能上拉/下拉电阻
P7OUT &= ~BIT0; //置P7.0为下拉电阻模式
P7SEL &= ~BIT0; //P7.0为I/O接口
P6DIR &= ~BIT4; //P6.4端口设为输入
P6REN |= BIT4; //使P6.4能上拉/下拉电阻
P6OUT &= ~BIT4; //置P6.4为下拉电阻模式
P6SEL &= ~BIT4; //P6.4为I/O接口
P6DIR &= ~BIT3; //P6.3端口设为输入
P6REN |= BIT3; //使6.3能上拉/下拉电阻
P6OUT &= ~BIT3; //置P6.3为下拉电阻模式
P6SEL &= ~BIT3; //P6.3为I/O接口
//设置列管脚为输出
P6DIR |= BIT2+BIT1+BIT0; //P6.2,1,0端口设为输出
P6OUT &=~(BIT2+BIT1+BIT0);
}
扫描管脚
思路是在一个do-while循环里面,依次设置第一列、第二列……为高电平,然后检测第一行、第二行……的电平是否为高,如果为高则说明有按键按下,行列导通,跳出循环,返回按键值。
char scanKey(){
//扫描列
char key_value=0;
unsigned char state=0;
do{
key_value=0;
if(state==0){
P6OUT |= BIT0;
P6OUT