OpenEdv-开源电子网

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

4*4按键程序问题

[复制链接]

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
发表于 2017-6-1 10:00:02 | 显示全部楼层 |阅读模式
20金钱
各位大神,原子哥,帮我看看这个程序哪里有问题,运行是没有错误的,仿真调试时主函数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;
       
}


最佳答案

查看完整内容[请看2#楼]

你配置管脚的时候怎么用RCC_AHBPeriphClockCmd 怎么用 RCC_AHBPeriphClockCmd!!!!!! 应该用:RCC_APB2PeriphClockCmd才对 啊!!!! 如果是STM32F103X的芯片如下才是正确的: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 你连时钟都没有开启。我已经彻底无语了。你对stm32芯片的时钟不太了解吧。………………
奋斗才能新生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2017-6-1 10:00:03 | 显示全部楼层
你配置管脚的时候怎么用RCC_AHBPeriphClockCmd  怎么用 RCC_AHBPeriphClockCmd!!!!!!
应该用:RCC_APB2PeriphClockCmd才对 啊!!!!
如果是STM32F103X的芯片如下才是正确的:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
你连时钟都没有开启。我已经彻底无语了。你对stm32芯片的时钟不太了解吧。………………
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-1 10:16:33 | 显示全部楼层
问题应该在 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;
                   }
相信你已经看明白了.哪里错了...
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 10:57:19 | 显示全部楼层
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;
       
}
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 10:59:54 | 显示全部楼层
操作系统 发表于 2017-6-1 10:16
问题应该在 update_key函数中的GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);  
GPIO_SetBits ...

我刚才粘贴少了一部分,现在又发了一次程序,麻烦看看哪里错误,调试是没错的,仿真也通过,就是到了mark那里变成13就不变了,按键按下也不管用,麻烦了,谢谢
奋斗才能新生
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-1 11:24:29 | 显示全部楼层
待机唤醒 发表于 2017-6-1 10:59
我刚才粘贴少了一部分,现在又发了一次程序,麻烦看看哪里错误,调试是没错的,仿真也通过,就是到了mark ...

你把按键相关的初始化代码放在初始化程序的最后部分.以免其它的初始化程序重复初始化了这些引脚直接导致引脚初始化错误.另外在读取引脚之前加延时10微秒试一下.
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2017-6-1 12:03:59 | 显示全部楼层
特殊管脚你不配置竟然敢直接用来做普通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);        
       
}
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2017-6-1 12:15:19 | 显示全部楼层
void PB3PB4PA13PA14PA15_TO_Normal_IO_Mode(void)-----STM32F103X芯片上的配置。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2017-6-1 12:24:11 | 显示全部楼层
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0X00                  
void JTAG_Set(u8 mode)
{
        u32 temp;
        temp=mode;
        temp<<=25;
        RCC->APB2ENR|=1<<0;     //&#191;a&#198;&#244;&#184;¨&#214;úê±&#214;ó          
        AFIO->MAPR&=0XF8FFFFFF; //&#199;&#229;3yMAPRμ&#196;[26:24]
        AFIO->MAPR|=temp;       //éè&#214;&#195;jtag&#196;£ê&#189;
}
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 14:43:44 | 显示全部楼层
电脑小白 发表于 2017-6-1 12:24
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0 ...

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
我加了这三个,还是不行,PA12那个引脚跟这个无关,也不行
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 16:21:06 | 显示全部楼层
电脑小白 发表于 2017-6-1 12:24
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0 ...

#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_12}, {GPIOA, GPIO_Pin_11},
        {GPIOA, GPIO_Pin_10}, {GPIOA, GPIO_Pin_9}
};
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;
//        //AFIO??
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);



        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_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    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;
}
我把引脚换了,然后仿真,mark还是13,然后我把        if(key[0][0]==1)return 13;这个屏蔽,只显示14了。
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 16:24:23 | 显示全部楼层
操作系统 发表于 2017-6-1 11:24
你把按键相关的初始化代码放在初始化程序的最后部分.以免其它的初始化程序重复初始化了这些引脚直接导致 ...

改过之后还是不行,我把引脚换了一遍,令PA9,PA10,PA11,PA12作为输出,仿真的mark还是13
奋斗才能新生
回复

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-6-1 17:27:20 | 显示全部楼层
单步调试,测相应IO口电压
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 17:32:51 | 显示全部楼层
还是看不穿 发表于 2017-6-1 17:27
单步调试,测相应IO口电压

我现在就在测量按键电压,按键K1摁下,PC12的电平变为高电平,但是LED0没有变化
int main(void)
{       
//        u8 t=0;               
         u8 stmark=0;         u8 mark=0;
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        LED_Init();                                   //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
//        KEY_Init();                  //3&#245;ê&#188;&#187;ˉó&#235;°′&#188;üá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        NVIC_Configuration();// éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é  
        uart_init(9600);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600         
        LED0=0;                                        //μ&#227;ááLED
        keyboard_init();
        while(1)
        {         
               
                                stmark=update_key();
                                if(stmark!=0)mark=stmark;
                if(mark==1)
                {
                        LED0=!LED0;
                        delay_ms(1000);
                }
               
奋斗才能新生
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2017-6-1 20:33:36 | 显示全部楼层
你的程序还有问题啊。应该是如下:[mw_shl_code=applescript,true]for(i = 0; i < 4; i++)           
        {
          GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
delay_ms(2);   //------------这个要有延时的,不然反应不过来2ms估计够用 不行的话 你改成5ms
for(j = 0; j < 4; j++)            
          {
                   if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
                                key[j] = 1; //-------------[j]改成[j]
                   }else{
                                key[j] = 0;//--------------
                   }
          }
          GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
        }[/mw_shl_code]
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 21:30:34 | 显示全部楼层
本帖最后由 待机唤醒 于 2017-6-1 21:35 编辑
电脑小白 发表于 2017-6-1 20:33
你的程序还有问题啊。应该是如下:[mw_shl_code=applescript,true]for(i = 0; i < 4; i++)           
    ...

[mw_shl_code=applescript,true]#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_12}, {GPIOA, GPIO_Pin_11},
        {GPIOA, GPIO_Pin_10}, {GPIOA, GPIO_Pin_9}
};
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_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    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++)             //iê&#199;ê&#228;3&#246;&#191;ú£&#172;òà′&#206;&#214;&#195;μíμ&#231;&#198;&#189;
        {
          GPIO_ResetBits(key_output.GPIO_x, key_output.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[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;
}
[/mw_shl_code]
这个网页老是漏掉一些东西,这个才是完整的,我按照你的加了延时还是不行。
奋斗才能新生
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-10-12
在线时间
21 小时
发表于 2017-6-1 21:42:43 | 显示全部楼层
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} };看不懂啥意思
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-1 21:49:45 | 显示全部楼层
命运枷锁 发表于 2017-6-1 21:42
struct io_port  {                                                     GPIO_TypeDef *GPIO_x;          ...

建立的结构体
奋斗才能新生
回复

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-6-2 08:04:37 | 显示全部楼层
待机唤醒 发表于 2017-6-1 17:32
我现在就在测量按键电压,按键K1摁下,PC12的电平变为高电平,但是LED0没有变化
int main(void)
{       

你的PC12和哪个PA口连的K1呀?按照你的代码意思应该是PA12和PC4连的K1把
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-2 09:27:24 | 显示全部楼层
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin); 改成 GPIO_ResetBits(key_output[i].GPIO_x, key_output.[i]GPIO_pin);  试试
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 10:24:49 | 显示全部楼层
dozm 发表于 2017-6-2 09:27
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin); 改成 GPIO_ResetBits(key_output.GPIO_x, key_o ...

我的程序就是后面那个,但是上传后总是缺了这个数组的括号,不知道怎么回事
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 10:36:26 | 显示全部楼层
还是看不穿 发表于 2017-6-2 08:04
你的PC12和哪个PA口连的K1呀?按照你的代码意思应该是PA12和PC4连的K1把

应该是按K16,我摁了也没有反应,所有的按键都按过,全部没有反应
奋斗才能新生
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-2 11:14:55 | 显示全部楼层
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
                                key[i][j] = 1;
                   }else{
                                key[i][j] = 0;
                   }

你这个代码是按下去的时候,是低电平,松开时为高电平.修改这里就好了.


if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) != 0)
                   {
                                key[i][j] = 1;
                   }else{
                                key[i][j] = 0;
                   }


== 0 修改 为  != 0 应该就可以正常运行了.
一般人的硬件按钮都是按下为低电平.你怎么接一个按下时为高电平..??
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-2 11:27:45 | 显示全部楼层
输入引脚配置成带下拉模式试试
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 11:58:41 | 显示全部楼层
操作系统 发表于 2017-6-2 11:14
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
   ...

这个程序就是按下为低电平啊,检测低电平才返回值
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 12:04:34 | 显示全部楼层
dozm 发表于 2017-6-2 11:27
输入引脚配置成带下拉模式试试

刚才试了,还是不行
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 12:15:46 | 显示全部楼层
操作系统 发表于 2017-6-2 11:14
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
                   {
   ...

不过我摁下时,输入引脚用电压表测试确实高电平,可是程序应该检测低电平才是
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 12:27:03 | 显示全部楼层
dozm 发表于 2017-6-2 11:27
输入引脚配置成带下拉模式试试

我设置的上拉输入,可是用电压表检测PC4,PC5,PC11,PC12都是低电平,按键按下变成高电平了,与程序直接反着来了
奋斗才能新生
回复

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-6-2 13:05:41 | 显示全部楼层
待机唤醒 发表于 2017-6-2 10:36
应该是按K16,我摁了也没有反应,所有的按键都按过,全部没有反应

你不进行仿真,一步一步运行,直接去测肯定测出来是高电平的。
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-2 13:13:17 | 显示全部楼层
我分析你的问题应该是,当按键按下时,输入引脚和输出引脚接通,这个时候,输入检测到的就是输出引脚的电平,也就是高,但是你的程序里想要检测低电平,跟实际的硬件是反着的。23楼说的是对的。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-2 13:27:36 | 显示全部楼层
其实这个问题好简单的.检测时不能用万用表.万用表检测不到高速变化的信号.换逻辑分析仪来整.或者示波器.自己动脑筋找问题的答案吧.
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 13:28:31 | 显示全部楼层
dozm 发表于 2017-6-2 13:13
我分析你的问题应该是,当按键按下时,输入引脚和输出引脚接通,这个时候,输入检测到的就是输出引脚的电平 ...

对,就是这样,程序跟硬件反着,而且输入引脚明明上拉了,却一直显示低电平,我都不知道怎么改了
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 13:39:52 | 显示全部楼层
dozm 发表于 2017-6-2 13:13
我分析你的问题应该是,当按键按下时,输入引脚和输出引脚接通,这个时候,输入检测到的就是输出引脚的电平 ...

如果我把==0改为!=0,主函数的mark就只有0了,也不行
奋斗才能新生
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-2 14:13:11 | 显示全部楼层
把输入引脚改成下拉。其实很简单,看看引脚的不同模式的电路,保证按下时输入引脚是高,松掉是低。这个手册上都有的。
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 14:17:49 | 显示全部楼层
dozm 发表于 2017-6-2 14:13
把输入引脚改成下拉。其实很简单,看看引脚的不同模式的电路,保证按下时输入引脚是高,松掉是低。这个手册 ...

我试过下拉,仍然没效果
奋斗才能新生
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-2 14:31:01 | 显示全部楼层
输出引脚推挽输出,输入引脚下拉输入。我觉得这样应该是可以的。不行的话,得你自己找找原因了。另外程序里加上消抖试试。
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 14:43:55 | 显示全部楼层
dozm 发表于 2017-6-2 14:31
输出引脚推挽输出,输入引脚下拉输入。我觉得这样应该是可以的。不行的话,得你自己找找原因了。另外程序里 ...

你说的这些,我都加了,还是不行,主函数的mark一直是13,这个程序在别的板子可以运行,我只是换了换引脚
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 15:17:12 | 显示全部楼层
yklstudent 发表于 2017-6-2 15:07
楼主感觉要被大家玩坏了

调试了一顿,现在已经懵比了,我感觉配置没问题,输入是上拉输入,初始高电平,输出是推挽输出,设置高电平,检测时输出的四个引脚依次给低电平,输入的检测低电平然后返回值,主函数判断并点灭led,找不到哪里有问题
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 15:58:26 | 显示全部楼层
dozm 发表于 2017-6-2 14:31
输出引脚推挽输出,输入引脚下拉输入。我觉得这样应该是可以的。不行的话,得你自己找找原因了。另外程序里 ...

我设置上拉输入,不是应该高电平么,我的检测却显示低电平,这个是哪里的问题
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 16:27:04 | 显示全部楼层
yklstudent 发表于 2017-6-2 16:20
降低难度,先测1*4按键是否有问题

刚才写了一个简单的1*4的,和4*4效果一样,然后我什么都不接,测了PC4,PC5,PC11,PC12,电平都是低电平,我是上拉的,为啥是低电平,换了个最小系统,还是一样
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 16:38:30 | 显示全部楼层
电脑小白 发表于 2017-6-2 16:25
你配置管脚的时候怎么用RCC_AHBPeriphClockCmd  怎么用 RCC_AHBPeriphClockCmd!!!!!!
应该用:RCC_A ...

谢谢谢谢,解决了,一语惊醒梦中人啊
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2017-6-2 16:40:10 | 显示全部楼层
yklstudent 发表于 2017-6-2 16:30
那先确认你的硬件电路设计是否有问题了

解决了,时钟那里没注意,应该是RCC_APB2PeriphClockCmd。还是谢谢之前的指点
奋斗才能新生
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 15:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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