51单片机独立按键检测的学习笔记
时间:10-02
整理:3721RD
点击:
51单片机独立按键的结构图:
当按下开关后,由于开关的两端是线与关系,因此导线上的电平时0,也就是说如果我们初始化与开关连接的IO口电平为1,当我们按下去以后,我们只要检测这个IO口的电平是否为0,即可检测到是否按了键。
按键按下去的电压变化曲线:
程序如下 :
上面的这个程序实现的是:刚开始的时候第一个发光二极管没有点亮且第一个数码管显示的是0,然后是独立键盘按键的检测,当我们按下第一个键后num的值变为1,且发光二极管点亮,松开手后数码管显示的就是1,然后发光二极管熄灭。第二次按下去的时候num的值变为2,且发光二极管点亮,松开手后数码管显示的就是2.。
当按下开关后,由于开关的两端是线与关系,因此导线上的电平时0,也就是说如果我们初始化与开关连接的IO口电平为1,当我们按下去以后,我们只要检测这个IO口的电平是否为0,即可检测到是否按了键。
按键按下去的电压变化曲线:
程序如下 :
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit d1=P1^0; //声明第一个发光二极管的位
- sbit dula=P2^6; //声明锁存器的锁存端的位
- sbit wela=P2^7; //声明锁存器的锁存端的位
- sbit key1=P3^4; //声明第一个按键的位
- uchar num; //定义一个unsigned char型变量num,用来计数(记下按键的次数,不过最多到9)
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void delay(uint z); //延时函数声明
- void main()
- {
- wela=1; //打开位选锁存端
- P0=0xfe; //选定第一个数码管工作
- wela=0; //关闭位选锁存端
- P3=0xff; //初始化P3的8个口的电平为高电平
- while(1) //进入死循环,扫描按键
- {
- if(key1==0) //检测第一个按键是否按下去了,这里是如果按下去了
- {
- delay(5); //延时5ms,来消除按下去的抖动,也就是让这5ms啥都不做,一直到稳定电平
- if(key1==0) //再次检测是否按下去了,这里是如果确实是人给按下去了的话,不是其他的干扰信号
- {
- d1=0; //点亮第一个发光二极管
- num++; //同时num自加1
- if(num==10) //判断是否加到了10,因为一个数码管最多只能显示0-9
- num=0; //重新赋值num=0
- }
- while(!key1); //松手
- delay(5); //消除松手的抖动
- while(!key1); //稳定时候的松手检测,跳出执行else后面的语句
- }
- else
- d1=1;
- dula=1; //数码管显示num
- P0=table[num];
- dula=0;
- }
- }
- void delay(uint z) //延时程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
上面的这个程序实现的是:刚开始的时候第一个发光二极管没有点亮且第一个数码管显示的是0,然后是独立键盘按键的检测,当我们按下第一个键后num的值变为1,且发光二极管点亮,松开手后数码管显示的就是1,然后发光二极管熄灭。第二次按下去的时候num的值变为2,且发光二极管点亮,松开手后数码管显示的就是2.。
来支持的
:P
发个资料文件
这样看的不舒服
说的还不错吗,
顶一个
顶一个,这个问题困扰我很久了,如梦初醒,谢谢分享
谢谢小编分享
我用的是来科5单片机,是独立按键,可是将上面的程序写进去为什么没有反应,数码管也不亮
应该是缺少使能端吧
如梦初醒,谢谢分享
简单直接