设计原理:
1.行线检测到按键触发
行线设置为下拉输入,列线设置为上拉输入。当有键按下时,行线所对应的中断号产生上升沿触发。
2.列线检测具体哪一列
有键按下时,把行线设置为推挽输出,输出低电平。列线设置为上拉输入。同过检测那一根列线是低电平来确定列线。
结果用液晶显示数字   A.0--PA.3单独接高点平 也不能正确显示 ,键盘根本就没效果,能帮忙看看吗???
u8 nnum;
void EXTI0_IRQHandler(){
delay_ms(10);//消抖
nnum=ReadColumn();
EXTI->  R=1<<0;
}
void EXTI1_IRQHandler(){
delay_ms(10);//消抖
nnum=(ReadColumn()+4);
EXTI->  R=1<<1;
}
void EXTI2_IRQHandler(){
delay_ms(10);//消抖
nnum=(ReadColumn()+8);
EXTI->  R=1<<2;
}
void EXTI3_IRQHandler(){
delay_ms(10);//消抖
nnum=(ReadColumn()+12);
EXTI->  R=1<<3;
}
//外部中断初始化程序
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
GPIO_Config();
Ex_NVIC_Config(GPIO_A,0,RTIR); //0上升沿触发
Ex_NVIC_Config(GPIO_A,1,RTIR);//1上降沿触发
Ex_NVIC_Config(GPIO_A,2,RTIR);//2上降沿触发
Ex_NVIC_Config(GPIO_A,3,RTIR);//4
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,2,EXTI1_IRQChannel,2);//抢占2,子优先级1,组2
MY_NVIC_Init(2,2,EXTI3_IRQChannel,2);
MY_NVIC_Init(2,2,EXTI4_IRQChannel,2);
}
void GPIO_Config(){
GPIOD->CRL&=0x00000000;
GPIOD->CRL|=0x88888888;
GPIOD->ODR|=0x000000F0;
}
//检测列
u8 ReadColumn(){
u8 c=0;
u32 temp;
GPIOD->CRL&=0x00000000;
GPIOD->CRL|=0x88883333;
GPIOD->ODR|=0x000000F0;
temp=(GPIOD->IDR&0x000000F0)>>4;
if(temp==0x0000000E) c=1;
if(temp==0x0000000D) c=2;
if(temp==0x0000000B) c=3;
if(temp==0x00000007) c=4;
GPIO_Config();
return c;
}
|