找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3040|回復(fù): 3
收起左側(cè)

STM32矩陣鍵盤出現(xiàn)問題,無法檢測鍵位,可是邏輯上沒有什么問題啊

[復(fù)制鏈接]
ID:136423 發(fā)表于 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, 下載次數(shù): 10

回復(fù)

使用道具 舉報

ID:136423 發(fā)表于 2016-10-24 13:26 | 顯示全部樓層
希望大神們能指導(dǎo)指導(dǎo)
回復(fù)

使用道具 舉報

ID:136423 發(fā)表于 2016-10-24 14:29 | 顯示全部樓層
原理圖見附件
回復(fù)

使用道具 舉報

ID:161929 發(fā)表于 2017-7-26 10:57 | 顯示全部樓層
看你的原理圖怎么有些地方有節(jié)點(diǎn)有些地方?jīng)]有啊
是不是原理圖有問題
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表