找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2448|回复: 3
打印 上一主题 下一主题
收起左侧

STM32矩阵键盘出现问题,无法检测键位,可是逻辑上没有什么问题啊

[复制链接]
跳转到指定楼层
楼主
ID:136423 发表于 2016-10-24 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lliuxin88 于 2016-10-24 14:29 编辑

#include "stm32f10x.h"
#include "keyscan.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_gpio.h"
#include"systick.h"
/**********************************************************
****************** 配置GPIO输出口**************************
**********************************************************/
void keyscan_OUTInit(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;                                                                                          //通用接口配置               
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD ,ENABLE);                                                          //初始化PD引脚时钟                          
     GPIO_InitStructure.GPIO_Pin = JPA|JPB|JPC;                                        // 按键检测
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                                 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                                //推挽输出
     GPIO_Init(GPIOD, &GPIO_InitStructure);     
}
                                                                                                

/**********************************************************
****************** 配置GPIO输入口**************************
**********************************************************/
void keyscan_INInit(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;                                                                                                  //通用接口配置               
         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD ,ENABLE);                                                                  //初始化PD引脚时钟                          
     GPIO_InitStructure.GPIO_Pin = JPD|JPE|JPF|JPG;                                                                        // 按键检测
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                                 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                                                 //上拉输入
     GPIO_Init(GPIOD, &GPIO_InitStructure);

}
/**********************************************************
****************** 配置LED GPIO输出口*********************
**********************************************************/
void LED_GPIOInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;                                                                                          //通用接口配置               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);                                                          //初始化PB引脚时钟                          
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;                                // 按键检测
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                                 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                         //推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);     
}

/**********************************************************
********************* 键盘检测*****************************
**********************************************************/
void key_scan(void)
{
  uint8_t KEY=0;
  keyscan_INInit();
  keyscan_OUTInit();
  LED_GPIOInit();
  SysTick_Init();                                

   GPIO_SetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

  /************************检测第一行********************************************/  
        GPIO_Write(GPIOD,GPIOD->ODR|0xfeff);                      //置低JPA
    if((GPIOD->IDR&0x7800)!=0x7800)
        {
          Delay_ms(20);                                                //sysTick 延时子程序(去抖程序)20ms   
          if((GPIOD->IDR&0x7800)!=0x7800)                     
          {
                  //KEY=0;
            switch (GPIOD->IDR&0x7800){                        
                case 0x7000:
                      KEY=3;
                          break;
             case 0x6800:
                      KEY=6;
                          break;
                case 0x5800:
                      KEY=9;
                          break;
                case 0x3800:
                      KEY='#';
                          break;
              default:
                      break;
                          }
         while((GPIOD->IDR&0x7800)!=0x7800){                          //等待键盘释放   
             GPIOD->IDR&=0x7800;
                         }
          if(KEY==3)
           GPIO_ResetBits(GPIOB, GPIO_Pin_7);        //灯亮
                }  
            }
      keyscan_INInit();
      keyscan_OUTInit();
      LED_GPIOInit();
  /************************检测第二行******************************************/               
      //Delay_ms(2);                                                
   GPIO_Write(GPIOD,GPIOD->ODR|0xfdff);                                //置低JPB
    if((GPIOD->IDR&0x7800)!=0x7800)
        {
                  Delay_ms(20);                                                             //sysTick 延时子程序(去抖程序)20ms   
          if((GPIOD->IDR&0x7800)!=0x7800)
          {
             //KEY=0;
            switch (GPIOD->IDR&0x7800){
                case 0x7000:
                      KEY=2;
                          break;
            case 0x6800:
                      KEY=5;
                          break;
                case 0x5800:
                      KEY=8;
                          break;
                case 0x3800:
                      KEY=0;
                          break;
            default:
                      break;
                          }
          while((GPIOD->IDR&0x7800)!=0x780000){                                         //等待键盘释放
                         GPIOD->IDR&=0x7800;
          }
           if(KEY==2)
           GPIO_ResetBits(GPIOB, GPIO_Pin_6);        //灯亮                              
          }
            }
    keyscan_INInit();
    keyscan_OUTInit();
    LED_GPIOInit();         
/************************检测第三行******************************************/                                               
          //Delay_ms(2);
   GPIO_Write(GPIOD,GPIOD->ODR|0xfbff);                                           ////置低JPC
    if((GPIOD->IDR&0x7800)!=0x7800)
        {
                  Delay_ms(20);                     //sysTick 延时子程序(去抖程序) 20ms   
          if((GPIOD->IDR&0x7800)!=0x7800)
          {         
              //KEY=0;                                                        
            switch (GPIOD->IDR&0x7800)
                {
                case 0x7000:
                      KEY=1;
                          break;
            case 0x6800:
                      KEY=4;
                          break;
                case 0x5800:
                      KEY=7;
                          break;
                case 0x3800:
                      KEY='*';
                          break;
                default:
                      break;
                          }                    
                 while(GPIOD->IDR&0x7800!=0x7800){                                 //等待键盘释放
                       GPIOD->IDR&=0x7800;
                 }
                         if(KEY==1)
           GPIO_ResetBits(GPIOB, GPIO_Pin_5);        //灯亮        
                }   
          }
        }                              

JP.zip

38.11 KB, 下载次数: 10

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:136423 发表于 2016-10-24 13:26 | 只看该作者
希望大神们能指导指导
回复

使用道具 举报

板凳
ID:136423 发表于 2016-10-24 14:29 | 只看该作者
原理图见附件
回复

使用道具 举报

地板
ID:161929 发表于 2017-7-26 10:57 | 只看该作者
看你的原理图怎么有些地方有节点有些地方没有啊
是不是原理图有问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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