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

来源:互联网 发布:qq飞车猛禽数据 编辑:程序博客网 时间:2024/06/07 04:42

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

实现原理是通过下位机的串口发送指令调用功能函数,但是重点还是如何在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 - PG3GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速率 50MHz 标准GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //引脚为 PG0 - PG3GPIO_Init(GPIOG,&GPIO_InitStructure);  //初始化GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      //定义下拉输入, 对应的引脚为 PG4 - PG7GPIO_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 输出二进制的 0001switch(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 输出二进制的 0010switch(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 输出二进制的 0100switch(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 输出二进制的 1000switch(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;}


原创粉丝点击