OpenEdv-开源电子网

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

矩阵按键程序怎么会影响到数码管的显示?请大师们帮忙分析下!

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-11-30
在线时间
0 小时
发表于 2014-12-24 22:10:00 | 显示全部楼层 |阅读模式
5金钱





自己写了一个矩阵按键扫描程序,在主函数里面一直扫,
但是一开机数码管就显示异常,之前六个数码管显示的是1,1,0,1,0,1;
现在六个数码管共用的PB14、PB15也都被点亮,显示成 4,4,8,4,8,4;
PB14、PB15分别对应数码管的段 F 和 G。按键程序里面并没有操作PB14、PB15
不知道是什么原因,请原子哥和大家帮忙看下,谢谢!

key.c如下:
#define PA0 PAin(0)    //PA0   
#define PA1 PAin(1)    //PA1
#define PA2 PAin(2)    //PA2
#define PA3 PAin(3)    //PA3  

#define PC13 PBout(13)   // PC13     
#define PC14 PBout(14)   // PC14      
#define PC15 PBout(15)   // PC15  

void Key_Init(void)

{  
    RCC->APB2ENR|=1<<2;     //使能 PORTA 时钟
    GPIOA->CRL&=0XFFFF0000; //清除PA0,1,2,3位置上原来的设置
GPIOA->CRL|=0X00008888;  //PA0,1,2,3做输入

RCC->APB2ENR|=1<<4;        //使能 PORTC 时钟
GPIOC->CRH &=0X000FFFFF;   //PC13,14,15设置成输出 2MHz 推挽输出   
    GPIOC->CRH |=0X22200000;   
}
u8  key_down(void) 
{
   C13=0C14=0C15=0; //行线全部输出低电平
   if((PA0==0)||(PA1==0)||(PA2==0)||(PA3==0))  //有键被按下
     {
   delay_ms(5);
if((PA0==0)||(PA1==0)||(PA2==0)||(PA3==0))  // 
return 1;                          //按键被按下了
else 
 return 0;
}
else 
return 0;
}

u8 key_up(void)
{
     C13=0C14=0C15=0; //行线全部输出低电平
if((PA0==1)&&(PA1==1)&&(PA2==1)&&(PA3==1)) //按键弹起
{
   delay_ms(5);
if((PA0==1)&&(PA1==1)&&(PA2==1)&&(PA3==1))
             return 1;    //按键弹起
        else 
    return 0;    //按键没弹起
}
else 
  return 0;  //按键没弹起

}


u8 Key_scan(void)
{
    u8 key_press;
key_press=0;
   if( key_down()==1)   //判断有键按下
   {
       C13=0C14=1C15=1;  //行线1输出低电平
  if(PA0==0)  key_press=5;  //按键5按下
  if(PA1==0)  key_press=8;
  if(PA2==0)  key_press=15;
  if(PA3==0)  key_press=18;
  
  PC13=1C14=0;PC15=1;  //行线2输出低电平
  if(PA0==0)  key_press=6;   //按键6按下
  if(PA1==0)  key_press=13;
  if(PA2==0)  key_press=16;
  if(PA3==0)  key_press=19;
  
  PC13=1;PC14=1;PC15=0; //行线3输出低电平
  if(PA0==0)  key_press=7;
  if(PA1==0)  key_press=14;
  if(PA2==0)  key_press=17;
  if(PA3==0)  key_press=20;
  
  while(key_up()!=1);     //等待按键弹起
  return  key_press;
   }
   else return 0; //判断无按键按下
  
}

主函数
extern int a;
extern int b;
int main(void)
{
    u8 t = 0 ;
   Stm32_Clock_Init(9);  //72M
   delay_init(72);
   JTAG_Set(SWD_ENABLE);
    Smg_Init();
    Key_Init();
   //以下用两个中断做数码管扫描
    TIM3_Int_Init(9,7199);//计数10次为1ms,中断间隔时间
    TIM2_Int_Init(9,7199);//计数20次为2ms  

while(1)
   { 
          t=Key_scan() ;//得到键值
       /*switch(t)
         {  
             case 6:     b =0 ;      //显示            
                            break;
            case 13:     b=1;    //显示             
                             break;
           default:
                         delay_ms(10);
          } */
    }

}





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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11560
金钱
11560
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-24 23:31:40 | 显示全部楼层
硬件,6个数码管的显示是扫描方式吧?
软件,显示程序在哪里?

背景内容不够,难以判断。

感觉是按键判断占用时间太长,干扰显示的扫描,造成这样的视觉效果。
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-11-30
在线时间
0 小时
 楼主| 发表于 2014-12-25 10:41:37 | 显示全部楼层
已经查出来是哪里问题了,谢谢大家!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 15:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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