it编程 > 硬件开发 > stm32

【STM32-矩阵键盘】

121人参与 2024-08-06 stm32

目录

1.矩阵键盘简介

2.原理描述

3.代码编写

4.自我总结

1.矩阵键盘简介

在这里插入图片描述

2.原理描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.代码编写

key.c

#include "stm32f10x.h"                  // device header
#include "delay.h"

void key_init1(void){
	rcc_apb2periphclockcmd(rcc_apb2periph_gpiod,enable);
	
	gpio_inittypedef gpio_initstructure;
	//pd0,1,2,3作为输出,pd4,5,6,7作为输入,且上拉,默认为1
	gpio_initstructure.gpio_mode=gpio_mode_out_pp;
	gpio_initstructure.gpio_pin=gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3;
	gpio_initstructure.gpio_speed=gpio_speed_50mhz;
	gpio_init(gpiod,&gpio_initstructure);
	//0,1,2,3置低电位,即0
	gpio_resetbits(gpiod,gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3);
	
	gpio_initstructure.gpio_mode=gpio_mode_ipu;
	gpio_initstructure.gpio_pin=gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7;
	gpio_initstructure.gpio_speed=gpio_speed_50mhz;
	gpio_init(gpiod,&gpio_initstructure);
}

void key_init2(void){
	rcc_apb2periphclockcmd(rcc_apb2periph_gpiod,enable);
	//pd0,1,2,3作为输入,且上拉,默认为1;pd4,5,6,7作为输出,且置0
	gpio_inittypedef gpio_initstructure;
	gpio_initstructure.gpio_mode=gpio_mode_ipu;
	gpio_initstructure.gpio_pin=gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3;
	gpio_initstructure.gpio_speed=gpio_speed_50mhz;
	gpio_init(gpiod,&gpio_initstructure);
	
	gpio_initstructure.gpio_mode=gpio_mode_out_pp;
	gpio_initstructure.gpio_pin=gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7;
	gpio_initstructure.gpio_speed=gpio_speed_50mhz;
	gpio_init(gpiod,&gpio_initstructure);
	gpio_resetbits(gpiod,gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7);
}

uint16_t key_scan(void){
	uint16_t row,col,res;//row为行值,col为列值,res=row|col,用于主函数判断
	key_init1();//此时pd7...pd0为0x11110000,即0xf0
	col=gpio_readinputdata(gpiod);	//读取上面的0xf0
	col=col&0xf0;//没有任何按键按下那么col必然与0xf0相等
	if(col!=0xf0)//说明可能有按键按下,需要消除抖动,进一步确定
	{
		delay_ms(20);//消除抖动
		col=gpio_readinputdata(gpiod);
		col=col&0xf0;
		if(col!=0xf0)//若还是不相等,表示必然有按键按下
		{
			col=gpio_readinputdata(gpiod);
			col=col&0xf0;//如果s1按下,那此处就是0xe0&0xf0=0xe0
		}
		key_init2();//此时pd7...pd0为0x00001111,即0x0f
		row=gpio_readinputdata(gpiod);//读取上面的0x0f
		row=row&0x0f;//没有任何按键按下那么row必然与0x0f相等
		if(row!=0x0f)//说明可能有按键按下,需要消除抖动,进一步确定
		{
			delay_ms(20);//消除抖动
			row=gpio_readinputdata(gpiod);
			row=row&0x0f;
			if(row!=0x0f)//若还是不相等,表示必然有按键按下
			{
				row=gpio_readinputdata(gpiod);
				row=row&0x0f;//若s1按下,那此处就是0x0e&0x0f=0x0e
			}
			res=row|col;//0xe0|0x0e=0xee,表示按键s1对应的键值为0xee
		}
	}		
		return res;
}

key.h

#ifndef __key_h
#define __key_h
void key_init1(void);//获取列值
void key_init2(void);//获取行值
uint16_t key_scan(void);//获取按键值
#endif

main

#include "stm32f10x.h"                  // device header
#include "delay.h"
#include "key.h"


uint16_t keyvalue=0;
int main(void)
{
	
	while(1)
	{
		keyvalue=key_scan();//获取按键的键值
		switch(keyvalue)			//根据键值确定按下的按钮
		{
			case 0xee:/**待调用函数**/;break;
			case 0xde:;break;
			case 0xbe:;break;
			case 0x7e:;break;
			
			case 0xed:;break;
			case 0xdd:;break;
			case 0xbd:;break;
			case 0x7d:;break;
			
			case 0xeb:;break;
			case 0xdb:;break;
			case 0xbb:;break;
			case 0x7b:;break;
			
			case 0xe7:;break;
			case 0xd7:;break;
			case 0xb7:;break;
			case 0x77:;break;
			
			default:break;
			
		}
	}
}
4.自我总结
(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

英飞凌最新MCU之TC4XX系列量产介绍2024

08-06

【STM32】GPIO口以及EXTI外部中断

08-06

J-Link:STM32使用J-LINK烧录程序,其他MCU也通用

08-06

第八章-PID 速度控制 PID控制 PID调参 PID温度控制 蓝桥杯 单片机 串级PID 模糊PID STM32f103c8t6最小系统板 STM32项目 STM32cubemx正点原子 江科大协

08-06

lwip:使用lwip UDP分包发送大量数据所遇问题以及解决方法(HPM6750、STM32)

08-06

STM32CubeMX使用说明

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论