新手入门
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2014-11-30
- 在线时间
- 0 小时
|
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=0 C14=0 C15=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=0 C14=0 C15=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=0 C14=1 C15=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=1 C14=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);
} */
}
}
|
|