我刚刚写了个STM32矩阵按键扫描程序 ,理论上没问题了 就是不正确 请大家指导一下

2019-07-14 20:56发布

这是按键初始化  和按键扫描程序


void KEY_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
          
               
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
               
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOB,GPIO_Pin_13);
               
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);       
               
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_15);
       
       
       
       
       
       
       
       
}





void KEY_Scan(void)
{       
       
           GPIOB->ODR=0x0F18;
           if(GPIOB->IDR!=0x0F18)
                 {
                          delay_ms(50);
                         if(GPIOB->IDR!=0x0F18)
                         {
         
         
         GPIOB->ODR=0X0100;
                           switch(GPIOB->IDR&0XF000)
                                 {
                                         case 0x1000 :  KeyValue=0;break;
                                         case 0x2000 :  KeyValue=1;break;
                                         case 0x4000 :  KeyValue=2;break;
                                         case 0x8000 :  KeyValue=3;break;
                                         default :break;
                                 }
                           GPIOB->ODR=0X0200;
                                 switch(GPIOB->IDR&0XF000)
                                 {
                 case 0x1000 :  KeyValue=4;break;
                                         case 0x2000 :  KeyValue=5;break;
                                         case 0x4000 :  KeyValue=6;break;
                                         case 0x8000 :  KeyValue=7;break;
                                         default :break;
                                 }
       
                                  GPIOB->ODR=0X0400;
                                 switch(GPIOB->IDR&0XF000)
                                 {
                 case 0x1000 :  KeyValue=8;break;
                                         case 0x2000 :  KeyValue=9;break;
                                         case 0x4000 :  KeyValue=10;break;
                                         case 0x8000 :  KeyValue=11;break;
                                         default :break;
                                 }
                                 
                                   GPIOB->ODR=0X0800;
                                 switch(GPIOB->IDR&0XF000)
                                 {
                 case 0x1000 :  KeyValue=12;break;
                                         case 0x2000 :  KeyValue=13;break;
                                         case 0x4000 :  KeyValue=14;break;
                                         case 0x8000 :  KeyValue=15;break;
                                         default :break;
                                 }
                         }
                 }
         }
               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。