4*4按键程序问题

2019-08-17 09:55发布

各位大神,原子哥,帮我看看这个程序哪里有问题,运行是没有错误的,仿真调试时主函数stmark变量一直是13,也就是mark一直13,按键按下,LED0没反应,求解惑

主函数
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"

//void keyboard_scan();
int main(void)
{       
//        u8 t=0;               
         u8 stmark=0;         u8 mark=0;
        delay_init();
        LED_Init();
//        KEY_Init();
        NVIC_Configuration();
        uart_init(9600);
        LED0=0;
        keyboard_init();
        while(1)
        {         
               
                                stmark=update_key();
                                if(stmark!=0)mark=stmark;
                if(mark==1)
                {
                        LED0=1;
                }

KEY函数
#include "key.h"
#include "delay.h"


struct io_port
{                                            
        GPIO_TypeDef *GPIO_x;                 
        unsigned short GPIO_pin;
};
static struct io_port key_output[4] = {
        {GPIOA, GPIO_Pin_15}, {GPIOA, GPIO_Pin_14},
        {GPIOA, GPIO_Pin_13}, {GPIOA, GPIO_Pin_12}
};
static struct io_port key_input[4] = {
        {GPIOC, GPIO_Pin_4}, {GPIOC, GPIO_Pin_5},
        {GPIOC, GPIO_Pin_11}, {GPIOC, GPIO_Pin_12}
};
unsigned char key[4][4];
void keyboard_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        unsigned char i;

//输入
        RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                       
    GPIO_Init(GPIOC, &GPIO_InitStructure);
//输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                //
    GPIO_Init(GPIOA, &GPIO_InitStructure);

        for(i = 0; i < 4; i++)
        {
          GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
        }
}
u8 update_key(void)
{
        unsigned char i, j;
        for(i = 0; i < 4; i++)
        {
          GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);   
          for(j = 0; j < 4; j++)  
          {
                   if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
                                key[j] = 1;
                   }else{
                                key[j] = 0;
                   }
          }
          GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
        }
        if(key[0][0]==1)return 13;
        if(key[0][1]==1)return 14;
        if(key[0][2]==1)return 15;
        if(key[0][3]==1)return 16;
        if(key[1][0]==1)return 9;
        if(key[1][1]==1)return 10;
        if(key[1][2]==1)return 11;
        if(key[1][3]==1)return 12;
        if(key[2][0]==1)return 5;
        if(key[2][1]==1)return 6;
        if(key[2][2]==1)return 7;
        if(key[2][3]==1)return 8;
        if(key[3][0]==1)return 1;
        if(key[3][1]==1)return 2;
        if(key[3][2]==1)return 3;
        if(key[3][3]==1)return 4;
       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
电脑小白
1楼-- · 2019-08-17 13:28
你配置管脚的时候怎么用RCC_AHBPeriphClockCmd  怎么用 RCC_AHBPeriphClockCmd!!!!!!
应该用:RCC_APB2PeriphClockCmd才对 啊!!!!
如果是STM32F103X的芯片如下才是正确的:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
你连时钟都没有开启。我已经彻底无语了。你对stm32芯片的时钟不太了解吧。………………
操作系统
2楼-- · 2019-08-17 15:04
问题应该在 update_key函数中的GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);  
GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
从你的代码上看的话,应该是 GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);  
才对.
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
                                key[i][j] = 1;
                   }else{
                                key[i][j] = 0;
                   }
相信你已经看明白了.哪里错了...
待机唤醒
3楼-- · 2019-08-17 18:08
KEY函数应该是这个,刚才粘贴可能设置不对,少了一些东西
#include "key.h"
#include "delay.h"


struct io_port
{                                            
        GPIO_TypeDef *GPIO_x;                 
        unsigned short GPIO_pin;
};
static struct io_port key_output[4] = {
        {GPIOA, GPIO_Pin_15}, {GPIOA, GPIO_Pin_14},
        {GPIOA, GPIO_Pin_13}, {GPIOA, GPIO_Pin_12}
};
static struct io_port key_input[4] = {
        {GPIOC, GPIO_Pin_4}, {GPIOC, GPIO_Pin_5},
        {GPIOC, GPIO_Pin_11}, {GPIOC, GPIO_Pin_12}
};
unsigned char key[4][4];
void keyboard_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        unsigned char i;

/* &#188;ü&#197;ìDDé¨&#195;èê&#228;3&#246;&#207;&#223; ê&#228;3&#246;&#184;&#223;μ&#231;&#198;&#189; */
/* PA0 PA1 PA2 PA3 ê&#228;è&#235;*/
        RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);         //ê1&#196;üPB,PC&#182;&#203;&#191;úê±&#214;ó
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                       
    GPIO_Init(GPIOC, &GPIO_InitStructure);
/* &#188;ü&#197;ìáDé¨&#195;èê&#228;è&#235;&#207;&#223; &#188;ü±&#187;°′ê±ê&#228;è&#235;&#184;&#223;μ&#231;&#198;&#189; ·&#197;&#191;aê&#228;è&#235;μíμ&#231;&#198;&#189; */
/* PA4 PA5 PA6 PA7 ê&#228;3&#246;*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                //
    GPIO_Init(GPIOA, &GPIO_InitStructure);

        for(i = 0; i < 4; i++)
        {
          GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
        }
}
u8 update_key(void)
{
        unsigned char i, j;
        for(i = 0; i < 4; i++)             //iê&#199;ê&#228;3&#246;&#191;ú£&#172;òà′&#206;&#214;&#195;μíμ&#231;&#198;&#189;
        {
          GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);   
          for(j = 0; j < 4; j++)            //jê&#199;ê&#228;è&#235;&#191;ú£&#172;μ±&#188;ü°′&#207;&#194;ê±μ&#188;í¨±&#187;&#214;&#195;&#206;aμíμ&#231;&#198;&#189;  
          {
                   if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
                                key[i][j] = 1;
                   }else{
                                key[i][j] = 0;
                   }
          }
          GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
        }
        if(key[0][0]==1)return 13;
        if(key[0][1]==1)return 14;
        if(key[0][2]==1)return 15;
        if(key[0][3]==1)return 16;
        if(key[1][0]==1)return 9;
        if(key[1][1]==1)return 10;
        if(key[1][2]==1)return 11;
        if(key[1][3]==1)return 12;
        if(key[2][0]==1)return 5;
        if(key[2][1]==1)return 6;
        if(key[2][2]==1)return 7;
        if(key[2][3]==1)return 8;
        if(key[3][0]==1)return 1;
        if(key[3][1]==1)return 2;
        if(key[3][2]==1)return 3;
        if(key[3][3]==1)return 4;
       
}
待机唤醒
4楼-- · 2019-08-17 23:03
操作系统 发表于 2017-6-1 10:16
问题应该在 update_key函数中的GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);  
GPIO_SetBits ...

我刚才粘贴少了一部分,现在又发了一次程序,麻烦看看哪里错误,调试是没错的,仿真也通过,就是到了mark那里变成13就不变了,按键按下也不管用,麻烦了,谢谢
操作系统
5楼-- · 2019-08-18 02:24
 精彩回答 2  元偷偷看……
电脑小白
6楼-- · 2019-08-18 06:33
特殊管脚你不配置竟然敢直接用来做普通io口了。仔细看芯片规格书了没有啊。
PA13-----------------JTMS
PA14-----------------JTCK
PA15-----------------JTDI
这仨货可不能直接当作普通io口来使用的。

void PB3PB4PA13PA14PA15_TO_Normal_IO_Mode(void)
{
        /*
   PB3-----------------JTDO
   PB4-----------------JNTRST
   PA13-----------------JTMS
   PA14-----------------JTCK
   PA15-----------------JTDI
       
          GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
          GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
          GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
  
        */
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
        //3&#245;ê&#188;&#187;ˉGPIOB  í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_4);
        //3&#245;ê&#188;&#187;ˉGPIOA  í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_15);
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
//        GPIO_Init(GPIOA, &GPIO_InitStructure);
//        GPIO_SetBits(GPIOA, GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);        
       
}

一周热门 更多>