提前说说:
上周四学姐们给我们讲了矩阵键盘的原理,然后让我们自己动手进行矩阵焊接和代码编写调试。矩阵键盘焊了整整一下午(我动手能力实在太差了),闻锡的味道是实在难受,还好矩阵键盘成功焊好。代码的编写是看了学长学姐们的代码后,自己重新编写了一个(实在是太糙了,不过明天要验收实在也不怎么想改了)。虽说代码写的不好,但是我觉得我写的代码对我们这样的新手是十分友好的,因为一看就明白==,废话不多说,开始吧!
矩阵键盘的原理:
因为实验室的按键比较少,所以这次实验是2x2的矩阵键盘。
先来看看按键
如图所示,按键上侧两个头和下侧两个头是接通的,而上下侧是不通的,当按键按下后,按键的上下两侧才接通。
咳咳(画的比较丑,用铅笔图的四个圆圈代表一个按键),那么如图所示,1是第一列(如上所说,按键的一排是接通的),2是第二列,3是第一行,4是第二行。
原理就是,先让1、2口(或者3、4口)输出高电平,然后扫描,如果3、4号口(或1、2号口)其中的一个口检测到高电平,那么就可以检测到是哪一行。接下来翻转,先让3、4口(或者1、2口)输出高电平,然后扫描,如果1、2口(或者3、4口)其中的一个口检测到高电平,那么就可以检测到是哪一列,从而就可以确定是哪一个按键了。
这个是博主焊的键盘:
按键实验代码:
(博主是直接操作寄存器写的,当然也可以用库函数写)
key.c文件
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
u8 KEY_Init(void)
{
u8 i,j;
RCC->APB2ENR|=1<<3; //使能GPIOB
GPIOB->ODR&=~(1<<7); //先关闭PB7,PB8
GPIOB->ODR&=~(1<<8);
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00800000;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X08000000; // PB5.6为输入
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X30000000;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000003; // PB7.8为输出
GPIOB->ODR&=1<<7;
GPIOB->ODR&=1<<8;
PBout(7)=1;
PBout(8)=1; //给PB7,8为高电平
if(PBin(5)==1||PBin(6)==1)
{
delay_ms(100); //防抖
if(PBin(5)==1) i=1;
if(PBin(6)==1) i=2; //确定列数
}
else return 0; //如果没有按下则返回0
GPIOB->ODR&=~(1<<5);
GPIOB->ODR&=~(1<<6); //同上对应即可
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X03000000; //5.6输出
GPIOB->ODR&=1<<5;
GPIOB->ODR&=1<<6;
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X80000000;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000008; //7.8输入
PBout(5)=1;
PBout(6)=1;
if(PBin(7)==1||PBin(8)==1)
{
delay_ms(100);
if(PBin(7)==1) j=3;
if(PBin(8)==1) j=4; //确定行数
}
else return 0;
if(i==1)
{
if(j==3) return 1; // 确定按键,返回相对应的值
if(j==4) return 2;
}
else
{
if(j==3) return 3;
if(j==4) return 4;
}
}
key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
u8 KEY_Init(void);
#endif
main.c文件
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "key.h"
int main(void)
{
u8 t;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600); //波特率为9600
LED_Init();
LED0=0;
while(1)
{
t=KEY_Init();
switch(t)
{
case 1:
printf("1\r\n"); //左上键
break;
case 2:
printf("2\r\n"); //右上键
break;
case 3:
printf("3\r\n"); //左下键
break;
case 4:
printf("4\r\n"); //右下键
break;
default:
delay_ms(10);
}
}
}
按键实验大概就是这样(代码写的实在难看==),显示结果如下:
最后说说:
一开始把矩阵键盘和原子哥的按键实验搞混了,却产生了意想不到的结果,下期博客就来好好说说吧(实际上我还没有搞明白·=-=·)