OpenEdv-开源电子网

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

新人第一次发帖,求助一个,用矩阵键盘,控制数码管显示的问题,急用!!!!

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-7-21
在线时间
8 小时
发表于 2017-7-22 11:08:15 | 显示全部楼层 |阅读模式
1金钱
下面是具体程序:
key,h
#ifndef __KEY_H
#define __KEY_H
#include<sys.h>

#define KE1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KE2  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define KE3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)
#define KE4  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)



#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
int KEY_Scan(void);
void KEY_Init(void);
#endif

key.c
#include<key.h>
#include<delay.h>

void KEY_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//ê1&#196;üPORTCê±&#214;ó
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_11|GPIO_Pin_12;//PA  ′ó×óμ&#189;óòòà′&#206;&#206;a1 2 3 4áD
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //éè&#214;&#195;é&#207;à-
        GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIOC
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;//PC0-3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //éè&#214;&#195;3éí&#198;íì
        GPIO_Init(GPIOC, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIOC
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//PC0-3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //éè&#214;&#195;3éí&#198;íì
        GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIOA
}

void P1_Init(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_13);//μú1DD
GPIO_SetBits(GPIOA,GPIO_Pin_14);
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOC,GPIO_Pin_9);

}
void P2_Init(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_14);//μú2DD
GPIO_SetBits(GPIOA,GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOC,GPIO_Pin_9);

}
void P3_Init(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_15);//μú3DD
GPIO_SetBits(GPIOA,GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_14);
GPIO_SetBits(GPIOC,GPIO_Pin_9);
}
void P4_Init(void)
{

GPIO_ResetBits(GPIOC,GPIO_Pin_9);//μú4DD
GPIO_SetBits(GPIOA,GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_14);
GPIO_SetBits(GPIOC,GPIO_Pin_15);
}

int KEY_Scan(void)//é¨&#195;è
{
P1_Init();//μú1DD
if(KE1==0) return 1;
        else if(KE2==0) return 2;
        else if(KE3==0)  return 3;
        else if(KE4==0) return 4;

P2_Init();//μú1DD
if(KE1==0) return 5;
        else if(KE2==0) return 6;
        else if(KE3==0)  return 7;
        else if(KE4==0) return 8;

P3_Init();//μú1DD
if(KE1==0) return 9;
        else if(KE2==0) return 10;
        else if(KE3==0)  return 11;
        else if(KE4==0) return 12;

P4_Init();//μú1DD
if(KE1==0) return 13;
        else if(KE2==0) return 14;
        else if(KE3==0)  return 15;
        else if(KE4==0) return 16;


return 0;
}

LED.h

#ifndef __LED_H
#define __LED_H
#include<sys.h>
#define LED1A  PBout(5)
#define LED2A  PBout(6)
#define LED3A  PBout(7)
#define LED4A  PBout(8)
#define LED5A  PBout(9)
#define LED6A  PBout(10)
#define LED7A  PBout(11)
#define LED8A  PBout(12)
#define LED9A  PBout(13)
#define LED10A  PBout(14)
#define LED11A  PBout(15)
#define LED12A  PBout(1)

#define LED1B  PCout(0)
#define LED2B  PCout(1)
#define LED3B  PCout(2)
#define LED4B  PCout(3)
#define LED5B  PCout(4)
#define LED6B  PCout(5)
#define LED7B  PCout(6)
#define LED8B  PCout(7)
#define LED9B  PCout(8)
#define LED10B  PCout(13)
#define LED11B  PCout(10)
#define LED12B  PBout(0)

void LED_Init(void);       



#endif

LED.c
#include<led.h>

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_6|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//3&#245;ê&#188;&#187;ˉGPIOB&#184;÷IO&#191;ú
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB,&GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Pin        =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_13;//3&#245;ê&#188;&#187;ˉGPIOC2μ&#196;IO&#191;ú
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;       
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOC,&GPIO_InitStruct);
       

}
main.c

#include<key.h>
#include<led.h>
#include<delay.h>
#include<sys.h>

int main(void)
{
                u8 t;
KEY_Init();
LED_Init();
delay_init();

        while(1)

{
                t=KEY_Scan();                                 
switch(t)
        {
  case 1ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=0,LED6A=1,LED7A=1,LED8A=0,LED9A=0,LED10A=0,LED11A=0,LED12A=0;break;//1
  case 2ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=0,LED8A=1,LED9A=1,LED10A=0,LED11A=1,LED12A=0;break;//2       
        case 3ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=1,LED8A=1,LED9A=0,LED10A=0,LED11A=1,LED12A=0;break;        //3
  case 4ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=0,LED6A=1,LED7A=1,LED8A=1,LED9A=0,LED10A=1,LED11A=1,LED12A=0;break;//4
  case 5ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=0,LED7A=1,LED8A=1,LED9A=0,LED10A=1,LED11A=1,LED12A=0;break;//5
        case 6ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=0,LED7A=1,LED8A=1,LED9A=1,LED10A=1,LED11A=1,LED12A=0;break;//6
  case 7ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=1,LED8A=0,LED9A=0,LED10A=0,LED11A=0,LED12A=0;break;//7
  case 8ED1A=1;LED2A=1;LED3A=1;LED4A=0;LED5A=1;LED6A=1;LED7A=1;LED8A=1;LED9A=1;LED10A=1;LED11A=1,LED12A=0;break;        //8
  case 9ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=1,LED8A=1,LED9A=0,LED10A=1,LED11A=1,LED12A=0;break;//9
  case 10ED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=1,LED8A=1,LED9A=1,LED10A=1,LED11A=0,LED12A=0;break;//0
  case 11:LED1A=0,LED2A=1,LED3A=1,LED4A=1,LED5A=1,LED6A=1,LED7A=1,LED8A=1,LED9A=1,LED10A=1,LED11A=0,LED12A=0;delay_ms(10);//0
                      LED1A=1,LED2A=0,LED3A=1,LED4A=1,LED5A=0,LED6A=1,LED7A=1,LED8A=0,LED9A=0,LED10A=0,LED11A=0,LED12A=0;delay_ms(10);//1
                      LED1A=1,LED2A=1,LED3A=0,LED4A=0,LED5A=1,LED6A=1,LED7A=0,LED8A=1,LED9A=1,LED10A=0,LED11A=1,LED12A=0;delay_ms(10);//2
                      LED1A=1,LED2A=1,LED3A=1,LED4A=0,LED5A=1,LED6A=1,LED7A=1,LED8A=1,LED9A=0,LED10A=0,LED11A=1,LED12A=0;delay_ms(10);//3
                LED1B=0,LED2B=1,LED3B=1,LED4B=1,LED5B=0,LED6B=1,LED7B=1,LED8B=1,LED9B=0,LED10B=1,LED11B=1,LED12B=0;delay_ms(10);//4
                LED1B=1,LED2B=0,LED3B=1,LED4B=1,LED5B=1,LED6B=0,LED7B=1,LED8B=1,LED9B=0,LED10B=1,LED11B=1,LED12B=0;delay_ms(10);//5
                            LED1B=1,LED2B=1,LED3B=0,LED4B=1,LED5B=1,LED6B=0,LED7B=1,LED8B=1,LED9B=1,LED10B=1,LED11B=1,LED12B=0;delay_ms(10);//6
                      LED1B=1,LED2B=1,LED3B=1,LED4B=0,LED5B=1,LED6B=1,LED7B=1,LED8B=0,LED9B=0,LED10B=0,LED11B=0,LED12B=0;delay_ms(10);break;//7


        }
}
}

程序运行之后数码管完全没反应。。。。开发板STM32F103RC,,,,求大佬解决急用!!!!万分感谢!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-22 23:32:59 | 显示全部楼层
拆分问题,一点点解决。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-22 23:33:03 | 显示全部楼层
拆分问题,一点点解决。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-7-21
在线时间
8 小时
 楼主| 发表于 2017-7-23 08:07:51 | 显示全部楼层
正点原子 发表于 2017-7-22 23:33
拆分问题,一点点解决。

......知道问题在哪,我就不来问了。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-3-16
在线时间
21 小时
发表于 2017-7-23 10:14:43 | 显示全部楼层
。。。。。。。你这个不是有例程吗 醉了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-7-24
在线时间
7 小时
发表于 2017-7-24 18:16:11 | 显示全部楼层
问题在哪里 我也需要这个 楼主 求帮忙
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:16:41 | 显示全部楼层
STM32 的 矩阵键 盘跟51 不一样;
原理没工夫跟你说;
发一个只查两次的, 4X4矩阵键盘给你, 几百年前写的,  综合了STM32 无法像51 一样使用 矩阵键盘的问题;
\\;
注: 键盘不能有任何较强 的 虚短 , 漏电的 情况;
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:17:03 | 显示全部楼层
#include "stm32f10x.h"
#include "KEY_Driver.h"



/*******************************************************/
/****delay_key(专用)****/       

void delay_key(vu16 dkey_temp)
  {
  for(dkey_temp;dkey_temp>0;dkey_temp--);
  }
/*******************************************************/
/****KEY_SCAN****/

unsigned char KEY_Scan(void)
  {
  vu8 KEY_SData;KEY_SData = 0x00;

  GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff;        //GPIOB  复位引脚; 并恢复原状;

  GPIOB -> ODR = 0xf0ff;delay_key(300);                  //置位,等待引脚电荷分布稳定

  GPIOB -> CRH = 0x33338888;          //PB0-PB3 推挽_50M(0x3); PB4-PB7 浮空_输入(0x4);

//  RCC -> APB2RSTR |= 0x0008;RCC -> APB2RSTR &= ~0x0008;   //GPIOB  复位    清除复位;                   (普中方式无法通过测试)

//  GPIOB -> ODR = 0xf0ff;delay_key(200);             //置位,等待状态判定;

  KEY_SData = (((GPIOB->IDR)>>8)&0x0f);

  GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff;        //GPIOB  复位引脚; 并恢复原状;
/*****************/                                                                                          
  GPIOB -> ODR = 0x0fff;delay_key(300);                 //置位,等待引脚电荷分布稳定

  GPIOB -> CRH = 0x44443333;        //PB0-PB3 浮空输入(0x4); PB4-PB7 推挽_50M(0x3);

//  RCC -> APB2RSTR |= 0x0008;RCC -> APB2RSTR &= ~0x0008;   //GPIOB 复位     清除复位;                        (普中方式无法通过测试)

//  GPIOB -> ODR = 0x0fff;delay_key(200);           //置位,等待状态判定;

  KEY_SData |= (((GPIOB->IDR)>>8)&0xf0);

  GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff;        //GPIOB  复位引脚; 并恢复原状;

  return KEY_SData;
  }
/*******************************************************/
/***KEY_DOWN***/

unsigned char KEY_DOWN(void)
  {
  unsigned char KEY_Status;KEY_Status = 0x00;

  KEY_Status = KEY_Scan();
  
  if(KEY_Status==0x00);     

  return KEY_Status;
  }
/********************************************************/
/****KEY_****/







回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:17:40 | 显示全部楼层
#ifndef __KEY_Driver_H_
#define __KEY_Driver_H_




unsigned char                                                        KEY_Scan                                                                  (void);
unsigned char                           KEY_DOWN                                  (void);





#endif


回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:18:28 | 显示全部楼层
main 下的;
///;
#include "stm32f10x.h"
#include "RCC_Config.h"
#include "Timer1_Config.h"
#include "Usart1_Driver.h"
#include "LCD_Driver.h"
#include "POS_Driver.h"
#include "KEY_Driver.h"

//============================================================
// DELAY_US

void delayus(vu32 countus)
  {for(countus;countus>0;countus--);}

/*************************************************************/
/****主函数****/
/*************************************************************/

int main(void)
  {
  vu16 time1;
  RCC_Config();
  
  Timer1_Init();

  Usart1_Init();

  GPIOA -> CRL = 0x33333333;                           //推挽输出 50MHZ
  GPIOA -> CRH = 0x333338b3;                           //PA9 复用推挽(0xb); PA10 上下拉输入(0x8);
  GPIOB -> CRL = 0x33333333;
  GPIOB -> CRH = 0x33333333;

  LCD_Init();
  
  time1 = 0;
  
  BMP16bit_8bit();                                 //8位彩显示

  RCC -> APB2ENR |= 0x0800;           //开定时器1
  while(1)
    {
        if(TIM1->CNT>999)
          {TIM1->CNT=0;
          if(KEY_Scan()!=0x00)POS_Printer();
//          GPIOB->ODR=~(GPIOB->ODR);
//          Usart1_Send(KEY_DOWN());
          }
        Usart1_Relay();
        }
  }

回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:19:03 | 显示全部楼层
这年代都没谁会矩阵键盘啦;
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:21:26 | 显示全部楼层
原理: 电容法;  类似踩 泥潭; 一脚一个坑, 你只需查坑就可以了, 这不是扫描法, 这叫交叉查询法, 所以只需要查两次, 速度超快;
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:23:08 | 显示全部楼层
查出来的是: 阴码 : 0xee;  阳码: 0x 11(_ 11_); 之类; 多建可以运算出来;
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:25:15 | 显示全部楼层
还有一种叫 交叉置位 传导法, 也是两次就能 出来, 抗干扰强; 没工夫跟你说;
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:25:42 | 显示全部楼层
李奇峰和周周 发表于 2017-7-24 18:16
问题在哪里 我也需要这个 楼主 求帮忙

想要就来拿, 没人用这个了
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2017-7-24 20:26:16 | 显示全部楼层
能不能用看你的实力, 反正我是能用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-23 07:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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