小白上路之51单片机(STC89C52) |
您所在的位置:网站首页 › stc单片机接口 › 小白上路之51单片机(STC89C52) |
目录
按键介绍独立按键独立按键原理源程序--独立按键
矩阵按键矩阵按键的由来矩阵按键扫描原理源程序--矩阵按键
按键介绍
实物图 VS 原理图:
下面来说一说关于按键抖动现象。 按键在闭合和断开时,触电会存在抖动现象——一般可通过软件消抖的方法解决即延时后再次判断按键是否按下。(也可通过硬件电路消抖) 按下按键K1,点亮led1,再次按下,led1被熄灭。 #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit L1=P2^0; sbit K1=P3^1; void delay(u16 i) { while(i--); } void keypros() { if(K1==0) { delay(1000);//延时 待其稳定 if(K1==0)//按键消抖 { L1=~L1;//状态翻转 } } while(!K1);//判断按键是否已经松开:按键松开时,P31管脚是默认为高电平,即退出while循环代表确实已经松开;若此时为抖动,则满足while循环,直到按键松开 } void main() { while(1) { keypros(); } } 矩阵按键 矩阵按键的由来实际上就是将独立按键重新组合,将独立按键每行按键的一个管脚连接在一起,引出一条控制线,对于每列来说,则把该列按键剩下的管脚连接到一起,引出一条控制线,最后组成独立按键。 矩阵按键扫描原理法一:逐行扫描 通过高四位(即P17、P16、P16、P15:接的是矩阵按键的每一行而引出的管脚)轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1时,则说明有按键按下,而后通过接收到的数据中哪位为0来判断时哪个按键被按下。 eg:P17-P15轮流输出低电平,若此时S14按键被按下,则S14的P14口由于轮流输入低电平而被拉低,随着按键按下,低电平会流入到另一管脚P12口,即P12口会输出低电平。 法二:行列扫描(通常采用) 通过高四位全部输出低电平,低四位输出高电平。当接收到的数据其低四位不全为高电平时,则说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下;而后再反过来,高四位输出高电平,低四位输出低电平,根据接收到的高四位的值判断是哪一行有按键按下,如此便可确定是哪一个按键按下了。 eg: 先让高四位全部输出低电平,低四位全部输出高电平:若此时S10按键被按下,则其对应的P12口会变为低电平,则此时低四位并非全为1,即可确定是哪一列有按键被按下;而后再将高四位与低四位的初始电平翻转,由于S10按键被按下,则此时P15口会导通变为低电平,于是此时的高四位并非全为高电平,即可确定是哪一行有按键被按下。 源程序–矩阵按键 #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; #define GPIO_KEY P1 #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 keyvalue; u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(u16 i) { while(i--); } void Keydown() { u8 a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) { delay(1000); if(GPIO_KEY!=0x0f) { GPIO_KEY=0x0f; switch(GPIO_KEY) { case 0x07:keyvalue=0;break;//0000 0111 case 0x0b:keyvalue=1;break;//0000 1011 case 0x0d:keyvalue=2;break;//0000 1101 case 0x0e:keyvalue=3;break;//0000 1110 } GPIO_KEY=0xf0; switch(GPIO_KEY) { case 0x70:keyvalue=keyvalue;break;//0111 0000 case 0xb0:keyvalue=keyvalue+4;break;//1011 0000 case 0xd0:keyvalue=keyvalue+8;break;//1101 0000 case 0xe0:keyvalue=keyvalue+12;break;//1110 0000 } while((a LSA=0;LSB=0;LSC=0; while(1) { Keydown(); GPIO_DIG=smgduan[keyvalue]; } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |