【STM32小案例 08 】STM32调用4*4矩阵键盘,未完待续

因为项目需要控制的设备和电机有点多,本来准备使用上位机直接控制下位机的。

实现原理是通过下位机的串口发送指令调用功能函数,但是重点还是如何在STM32的main程序中调用。

所以需要先写好STM32的下位机程序,那就使用矩阵键盘先实现按键调用把,到时候直接把按键触发更改为串口命令触发即可。

花了一个小时写了一段程序代码,明天再完善。


---------------------------------------------------------------------------------------


/***********************************/
// teavamc仿写的4*4矩阵键盘程序
// 1, 本程序中使用的引脚口是GPIOG PG0 ~ PG7
// 2.  GPIOG | PG0 到 PG3 固定为推挽输出
// 3.  GPIOG | PG4 到 PG7 固定为下拉输入
// 4.  实现效果:
// 	   无按键被按下时;PG4 - PG7 为0,为低电平状态
// 	   有按键被按下时:PG0 - PG3 相应的引脚显示为高电平
// 	   
// 5.  本程序暂时未经过测试
// 制作时间: 2017 - 10 - 9 
// 制作人  : teavamc CSDN|博客
/************************************/


#include "stm32f10x.h"       //导入官方头文件
#include "delay_other.h"     //导入延时函数

void Init44Key(void)  //声明初始化矩阵键盘初始化函数
{
	GPIO_InitTypeDef GPIO_InitStructure;  //声明GPIO结构体,用于引脚定义
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); //开启GPIOG时钟,使能时钟

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //定义推挽输出,对应的引脚是PG0 - PG3
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速率 50MHz 标准
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //引脚为 PG0 - PG3
	GPIO_Init(GPIOG,&GPIO_InitStructure);  //初始化

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      //定义下拉输入, 对应的引脚为 PG4 - PG7
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_Init(GPIOG,&GPIO_InitStructure); //初始化
}

int Value44Key(void)  //定义矩阵键盘的返回值,返回值对应相关功能,
{
	int KeyValue = 0;  //KeyValue是最后返回的按键数值
	u16 WriteVal = 0;  //为写给PG口的数据

	GPIO_Write(GPIOG,(GPIOG->ODR & 0xfff0 | 0xf));  //先让PG0 - PG3全部输出高

	if((GPIOG->IDR & 0x00f0) == 0x0000)  //先设置 PG4 - PG7 为0,如果没有按键按下,返回值为-1
	{
		return -1;
	}
	else  //有按键按下
	{
		delay_ms(5);  //延时5ms去抖动
		if((GPIOG->IDR & 0x00f0) == 0x0000)  //如果延时5ms后 PG4 - PG7 又全为0, 则刚刚是抖动产生的
		{
			return -1;  //所以还是返回 -1
		}
	}

	GPIO_Write(GPIOG, (GPIOG->ODR & 0xfff0 | 0x1 ));  //要让 PG0 - PG3 输出二进制的 0001
	switch(GPIOG->IDR & 0x00f0)  //对应的 PG4 - PG7 的值进行判断,输出不同的按键值
	{
		case 0x0010:KeyValue = 15;
		break;

		case 0x0020:KeyValue = 11;
		break;

		case 0x0040:KeyValue = 7;
		break;

		case 0x0080:KeyVal = 3;
		break;
	}

	GPIO_Write(GPIOG, (GPIOG->ODR & 0xfff0 | 0x2));  //要让 PG0 - PG3 输出二进制的 0010
	switch(GPIOG->IDR & 0x00f0)  //对应的 PG4 - PG7 的值进行判断,输出不同的按键值
	{
		case 0x0010:KeyValue = 14;
		break;
		
		case 0x0020:KeyValue = 10;
		break;
		
		case 0x0040:KeyValue = 6;
		break;

		case 0x0080:KeyValue = 2;
		break; 
	}

	GPIO_Write(GPIOG, (GPIOG->ODR & 0xfff0 | 0x4));  //要让 PG0 - PG3 输出二进制的 0100
	switch(GPIOG->IDR & 0x00f0)  //对应的 PG4 - PG7 的值进行判断,输出不同的按键值
	{
		case 0x0010:KeyValue = 13;
		break;
		
		case 0x0020:KeyValue = 9;
		break;
		
		case 0x0040:KeyValue = 5;
		break;

		case 0x0080:KeyValue = 1;
		break; 
	}

	GPIO_Write(GPIOG, (GPIOG->ODR & 0xfff0 | 0x8));  //要让 PG0 - PG3 输出二进制的 1000
	switch(GPIOG->IDR & 0x00f0)  //对应的 PG4 - PG7 的值进行判断,输出不同的按键值
	{
		case 0x0010:KeyValue = 12;
		break;
		
		case 0x0020:KeyValue = 8;
		break;
		
		case 0x0040:KeyValue = 4;
		break;

		case 0x0080:KeyValue = 0;
		break; 
	}

	return KeyValue;
}


你可能感兴趣的:(【STM32】,日常学习【STM32】,stm32,测试)