OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5823|回复: 6

第一次学习4×4矩阵键盘写的代码,可能有很多错误,请求大家指出

[复制链接]

5

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
852
金钱
852
注册时间
2018-10-11
在线时间
69 小时
发表于 2020-5-15 08:35:49 | 显示全部楼层 |阅读模式
5金钱
老师布置的作业是编写矩阵键盘的代码
这个是自己写的逐行扫描的过程
IMG_20200515_083122.jpg

第一次学习矩阵键盘,可能有不对的地方,希望大家指出
下面是代码

#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//行
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//列
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,有按键按下则被拉低
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);

GPIO_SetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
/* 1  2  3  4
   5  6  7  8
   9  10 11 12
   13 14 15 16 */
u8 KEY_Scan(void)//扫描函数
{
u8 KeyVal=0,i;
u16 Scan[4]={0x00fe,0x00fd,0x00fb,0x00f7};

if(i==4) i=0;
for(i=0;i<4;i++)
{
  GPIO_Write(GPIOF,Scan);//1111 1110,1111 1101,1111 1011,1111 0111 逐行扫描
  
  if( (GPIOF->IDR & 0x00F0) != 0x00F0) //有按键按下 Pin_4到Pin_7之间存在按键按下被拉低的情况
  {
   delay_ms(10);//去抖动
   
   switch(GPIOF->IDR & 0x00FF)
   {
    case 0x00EE: KeyVal=1; break; //1110 1110 第一行 第一列
    case 0x00DE: KeyVal=2; break; //1101 1110 第一行 第二列
    case 0x00BE: KeyVal=3; break; //1011 1110 第一行 第三列
    case 0x007E: KeyVal=4; break; //0111 1110 第一行 第四列
   
    case 0x00ED: KeyVal=5; break; //1110 1101 第二行 第一列
    case 0x00DD: KeyVal=6; break; //1101 1101 第二行 第二列
    case 0x00BD: KeyVal=7; break; //1011 1101 第二行 第三列
    case 0x007D: KeyVal=8; break; //0111 1101 第二行 第四列
   
    case 0x00EB: KeyVal=9; break; //1110 1011 第三行 第一列
    case 0x00DB: KeyVal=10; break; //1101 1011 第三行 第二列
    case 0x00BB: KeyVal=11; break; //1011 1011 第三行 第三列
    case 0x007B: KeyVal=12; break; //0111 1011 第三行 第四列
   
    case 0x00E7: KeyVal=13; break; //1110 0111 第四行 第一列
    case 0x00D7: KeyVal=14; break; //1101 0011 第四行 第二列
    case 0x00B7: KeyVal=15; break; //1011 0111 第四行 第三列
    case 0x0077: KeyVal=16; break; //0111 0111 第四行 第四列
   }
   while( (GPIOF->IDR & 0x00F0) != 0x00F0 )//松手检测
   {
    delay_ms(1);
   }
   return KeyVal;
  }
}
return 0;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2016-1-5
在线时间
1 小时
发表于 2020-5-15 08:35:53 | 显示全部楼层
回复

使用道具 举报

5

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
852
金钱
852
注册时间
2018-10-11
在线时间
69 小时
 楼主| 发表于 2020-5-15 08:39:17 | 显示全部楼层
testacount 发表于 2020-5-15 08:35
帮顶!!!!!!

谢谢你
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-5-15 11:43:18 | 显示全部楼层
可以可以
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2711
金钱
2711
注册时间
2019-8-14
在线时间
414 小时
发表于 2020-5-15 15:29:29 | 显示全部楼层
干得漂亮
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-5-28
在线时间
3 小时
发表于 2020-5-28 12:18:18 | 显示全部楼层
厉害&#128077;
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2021-8-1
在线时间
11 小时
发表于 2021-8-11 00:59:11 | 显示全部楼层
多谢大佬,正在用32做课设,你救了我的命啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表