stm32学习笔记(六)矩阵键盘的焊接及按键试验

提前说说:

上周四学姐们给我们讲了矩阵键盘的原理,然后让我们自己动手进行矩阵焊接和代码编写调试。矩阵键盘焊了整整一下午(我动手能力实在太差了),闻锡的味道是实在难受,还好矩阵键盘成功焊好。代码的编写是看了学长学姐们的代码后,自己重新编写了一个(实在是太糙了,不过明天要验收实在也不怎么想改了)。虽说代码写的不好,但是我觉得我写的代码对我们这样的新手是十分友好的,因为一看就明白==,废话不多说,开始吧!

矩阵键盘的原理:

因为实验室的按键比较少,所以这次实验是2x2的矩阵键盘。

先来看看按键

stm32学习笔记(六)矩阵键盘的焊接及按键试验_第1张图片
如图所示,按键上侧两个头和下侧两个头是接通的,而上下侧是不通的,当按键按下后,按键的上下两侧才接通。stm32学习笔记(六)矩阵键盘的焊接及按键试验_第2张图片
咳咳(画的比较丑,用铅笔图的四个圆圈代表一个按键),那么如图所示,1是第一列(如上所说,按键的一排是接通的),2是第二列,3是第一行,4是第二行。

原理就是,先让1、2口(或者3、4口)输出高电平,然后扫描,如果3、4号口(或1、2号口)其中的一个口检测到高电平,那么就可以检测到是哪一行。接下来翻转,先让3、4口(或者1、2口)输出高电平,然后扫描,如果1、2口(或者3、4口)其中的一个口检测到高电平,那么就可以检测到是哪一列,从而就可以确定是哪一个按键了。

这个是博主焊的键盘:
stm32学习笔记(六)矩阵键盘的焊接及按键试验_第3张图片
stm32学习笔记(六)矩阵键盘的焊接及按键试验_第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);
		}
		
	}
	
}

按键实验大概就是这样(代码写的实在难看==),显示结果如下:
stm32学习笔记(六)矩阵键盘的焊接及按键试验_第5张图片

最后说说:

一开始把矩阵键盘和原子哥的按键实验搞混了,却产生了意想不到的结果,下期博客就来好好说说吧(实际上我还没有搞明白·=-=·)

你可能感兴趣的:(stm32基础,stm32)