您的位置 首页 发布

51单片机-按键

矩阵按键:实现功能按一个键,相应的灯亮。左边的是普通二极管,右边的是发光二极管。左边的二极管如果想导通,则右边要比左边电平低。

矩阵按键

完成功用按一个键,相应的灯亮。


左面的是一般二极管,右边的是发光二极管。左面的二极管假如想导通,则右边要比左面电平低。假如导通便是按键能够操控灯亮,那么按键左下的都为低电平,体系复位时默许I/O是高电平,所以给笔直方向的I/O拉低,这样假如按键按下,电路导通,那么笔直方向I/O的低电平会把水平方向的拉低。这样就能够经过检测水平方向哪个I/O为低电平来检测哪个键被按下。
开端时对程序的错误想法:被按下的键两头必定都是低电平,把它们存在一个数组里,然后检测。这样是不对的,用一个暂时变量去存P0的值,不会有相同的,开端P0的值为oxff,这样即便按下按键,那么两头的引脚仍是高电平,所以失利了。
#include <reg52.h>
sbit p2_0 = P2^0;
sbit p2_1 = P2^1;
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit p2_4 = P2^4;
sbit p2_5 = P2^5;
sbit p2_6 = P2^6;
sbit p2_7 = P2^7;
sbit L0 = P0^0;
sbit L1 = P0^1;
sbit L2 = P0^2;
sbit L3 = P0^3;
sbit H0 = P0^4;
sbit H1 = P0^5;
sbit H2 = P0^6;
sbit H3 = P0^7;
void delay(){
int i,j;
for(i = 0; i < 0xff; i++)
for(j = 0; j < 0xff; j++)
;
}
void display(){
P0 = 0xfe; //寻觅按下的是哪个按键,先让笔直的为低电平,
if(H0 == 0){p2_0 = 0; delay(); p2_0 = 1;} //然后经过检测水平的来确认,延时为了消抖
if(H1 == 0){p2_1 = 0; delay(); p2_1 = 1;}
if(H2 == 0){p2_2 = 0; delay(); p2_2 = 1;}
if(H3 == 0){p2_3 = 0; delay(); p2_2 = 1;}
P0 = 0xfd;
if(H0 == 0){p2_4 = 0; delay(); p2_4 = 1;}
if(H1 == 0){p2_5 = 0; delay(); p2_5 = 1;}
if(H2 == 0){p2_6 = 0; delay(); p2_6 = 1;}
if(H3 == 0){p2_7 = 0; delay(); p2_7 = 1;}
P0 = 0xfb;
if(H0 == 0){p2_0 = 0; delay(); p2_0 = 1;}
if(H1 == 0){p2_1 = 0; delay(); p2_1 = 1;}
if(H2 == 0){p2_2 = 0; delay(); p2_2 = 1;}
if(H3 == 0){p2_3 = 0; delay(); p2_3 = 1;}
P0 = 0xf7;
if(H0 == 0){p2_4 = 0; delay(); p2_4 = 1;}
if(H1 == 0){p2_5 = 0; delay(); p2_5 = 1;}
if(H2 == 0){p2_6 = 0; delay(); p2_6 = 1;}
if(H3 == 0){p2_7 = 0; delay(); p2_7 = 1;}
}
void main(){
while(1){
display();
}
}
独立按键:
完成功用,按一个独立按键时,一个灯亮,按另一个独立按键,另一个灯亮。图中的按键右下接地,
左面经过跳线与P1.0和P1.1想接。假如按键按下,则P1.0和P1.1会被拉低。复位时默许I/O口都
是高电平。这样能够经过检测P1.0和P1.1的电平,来查看按键是否被按下。单片机I/O口是准双向
口,没有办法操控单片机的输入输出方向。相当于咱们在每个口上都上拉了一个5V 10欧的电阻,这
样单片机上电复位是高电平的。除了P0口都上拉了,P0内部没有上拉电阻,所以外部上拉。
#include <reg52.h>
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit led1 = P2^0;
sbit led2 = P2^1;
void delay(){
int i,j;
for(i = 0; i < 0xff; i++)
for(j = 0; j < 0xff; j++)
;
}
void main(){
while(1){
if(key1 == 0){
delay(); //按键在闭合和断开时,触点处会呈现颤动,消除颤动
if(key1 == 0) //延时一段时间后假如仍是低电平,阐明不是颤动形成的,
led1 = “led1; //确实是按键被按下了,完成灯亮灭
}
if(key2 == 0){
delay();
if(key2 == 0)
led2 = “led2;
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/254670.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部