首先要说明的一点,矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。 0XFE变成二进制是1111 1110,为了方便使用,记得每四个数之间加一个空格。1111 1110这个数据放到PA口上,假设这个时候S1被按下了,会出现什么情况?因为PA0是低电平,S1被按下之后S1导通,导致PA4的电平从1降到0,于是PA端口的数据就变成了1110 1110,换算成16进制就是0XEE。于是我们知道S1被按下了。 假设是S3被按下,会出现什么情况?没错,PA6的电平被拉低,PA的端口数据变成了1011 1110,也就是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。这就是矩阵键盘的扫描原理! 具体的IO口定义,详见源码中的IO定义。
实现的功能:在STM32上实现类似于51单片机上IO的双向输入输出; 程序源码见附件:
主程序调用功能实现: extern uchar k_num; //按键值 while(k_c==0){ KEY_Scan(); if(k_num==6){//enter k_c=2; }else if(k_num==7){//cancel k_c=1; }else if(k_num==8){//up temp=temp+1; delay_ms(100); }else if(k_num==9){//down if(temp>0){ temp=temp-1; } delay_ms(100); }else if(k_num==10){//left if(temp>100){ temp=temp-5; } delay_ms(100); }else if(k_num==11){//right temp=temp+5; delay_ms(100); }else{ if((temp>500)||(temp<150)){ temp=214; } } ge=temp%10; shi=temp%100/10; bai=temp/100; delay_ms(10); disp_8x16(4,3,1,0,bai); disp_8x16(5,3,1,0,shi); disp_8x16(6,3,1,0,ge); k_num=0;//按键值清零 delay_ms(10); }
|