OpenEdv-开源电子网

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

到底哪个地方出问题了(基于STM32f7驱动矩阵键盘按键扫描部分的程序)

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2018-11-16
在线时间
58 小时
发表于 2019-8-5 00:39:00 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 ljshow 于 2019-8-5 00:41 编辑

#include "key.h"
#include "delay.h"

void KEY_Init(void)    //初始化设置
{
        RCC->AHB1ENR|=1<<8;     //使能PORTI时钟;
        GPIO_Set(GPIOI,PIN0|PIN1,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI0,PI1设置下拉
        GPIO_Set(GPIOI,PIN2|PIN3,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI2,PI3设置下拉
        GPIO_Set(GPIOI,PIN4|PIN5,GPIO_MODE_IN,0,0,GPIO_PUPD_PU); //PI4,PI5设置上拉
        GPIO_Set(GPIOI,PIN6|PIN7,GPIO_MODE_IN,0,0,GPIO_PUPD_PU); //PI6,PI7设置上拉      PI0~PI3置0,PI4~PI7置1   既11110000,0xF0
}

u8 Key_scan(void)
{

        u8 Key_val =0;           // 按键扫描返回值初始化为0
        u32  a;                              
        u8 temp;
   
        /*=========================按键扫描=========================*/
   GPIOI_SET1();//设置输出引脚电平I7~I0为11110000
        delay_ms(10);
   GPIOI->ODR=0X000F;
    if(((GPIOI->IDR)&0xf0)==0X0080)           //读取按键是否按下
    {
                delay_ms(10);   // 10ms延时消抖
        if(((GPIOI->IDR)&0xf0)==0X0080)        
        {                 
                GPIOI_SET2();//设置输出引脚电平I7~I0为00001111
                delay_ms(10);
                 GPIOI->ODR=0X00F0;
                        temp = ((GPIOI->IDR)&0x000f) ;                                       
                 switch(temp)
                 {
                   case 0x08: Key_val=1;break;
                         case 0x04: Key_val=2;break;
                         case 0x02: Key_val=3;break;
                         case 0x01: Key_val=4;break;
                         default : Key_val=0;break;
                 }
                        
}
                }         
if(((GPIOI->IDR)&0xf0)==0X0040)            //读取按键是否按下
    {
                delay_ms(10);   // 10ms延时消抖
        if(((GPIOI->IDR)&0xf0)==0X0040)        
        {                 
                GPIOI_SET2();//设置输出引脚电平I7~I0为00001111
                 GPIOI->ODR=0X00F0;
                        temp = ((GPIOI->IDR)&0x000f) ;                                      
                 switch(temp)
                 {
                   case 0x08: Key_val=5;break;
                         case 0x04: Key_val=6;break;
                         case 0x02: Key_val=7;break;
                         case 0x01: Key_val=8;break;
                         default : Key_val=0;break;
                 }
                        
}
                }        
if(((GPIOI->IDR)&0xf0)==0X0020)          //读取按键是否按下
    {
                delay_ms(10);   // 10ms延时消抖
        if(((GPIOI->IDR)&0xf0)==0X0020)        
        {                 
                GPIOI_SET2();  //设置输出引脚电平I7~I0为00001111
                 GPIOI->ODR=0X00F0;
                        temp = ((GPIOI->IDR)&0x000f) ;                                       
                 switch(temp)
                 {
                   case 0x08: Key_val=9;break;
                         case 0x04: Key_val=10;break;
                         case 0x02: Key_val=11;break;
                         case 0x01: Key_val=12;break;
                         default : Key_val=0;break;
                 }
                        
}
                }         
                if(((GPIOI->IDR)&0xf0)==0X0010)            //读取按键是否按下
    {
                delay_ms(10);    // 10ms延时消抖
        if(((GPIOI->IDR)&0xf0)==0X0010)        
        {                 
                GPIOI_SET2(); //设置输出引脚电平I7~I0为00001111
                 GPIOI->ODR=0X00F0;
                        temp = ((GPIOI->IDR)&0x000f) ;                                      
                 switch(temp)
                 {
                   case 0x08: Key_val=13;break;
                         case 0x04: Key_val=14;break;
                         case 0x02: Key_val=15;break;
                         case 0x01: Key_val=16;break;
                         default : Key_val=0;break;
                 }
                                 
}
                }         
     return Key_val;



               
                }
                void GPIOI_SET1(void)
{
      GPIO_Set(GPIOI,PIN0|PIN1,GPIO_MODE_OUT,0,0,GPIO_PUPD_PU); //PI0,PI1设置上拉
            GPIO_Set(GPIOI,PIN2|PIN3,GPIO_MODE_OUT,0,0,GPIO_PUPD_PU); //PI2,PI3设置上拉
            GPIO_Set(GPIOI,PIN4|PIN5,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI4,PI5设置下拉
            GPIO_Set(GPIOI,PIN6|PIN7,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI6,PI7设置下拉
}

void GPIOI_SET2(void)
{
      GPIO_Set(GPIOI,PIN0|PIN1,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI0,PI1设置下拉
            GPIO_Set(GPIOI,PIN2|PIN3,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PI2,PI3设置下拉
            GPIO_Set(GPIOI,PIN4|PIN5,GPIO_MODE_OUT,0,0,GPIO_PUPD_PU); //PI4,PI5设置上拉
            GPIO_Set(GPIOI,PIN6|PIN7,GPIO_MODE_OUT,0,0,GPIO_PUPD_PU); //PI6,PI7设置上拉
}

               
               

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 23:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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