目录
一、独立按键模块原理图详解
右边接地,左边四个口分别连接到单片机的P3.0~P3.3;
要注意RXD与TXD的顺序与上面不一致。K1对应P3.1,K2对应P3.0,K3对应P3.2,K4对应P3.3
因为单片机上电时,I/O默认为高电平,所有按键没有按下时,则I/O口为高电平;按键按下时,I/O变为低电平。
二、独立按键控制LED亮灭
1、编写程序
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0) //如果K1按键按下,P3.1口为低电平
{
P2_0=0; //则P2.0口为低电平,LED灯D1亮
}
else
{
P2_0=1; //K1按键没有按下,P3.1口为高电平
} //则P2.O为高电平,LED灯D1灭
}
}
2、实物展示
独立按键控制LED灯亮灭
三、独立按键控制LED状态
1、按键抖动
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
所以需要用软件延时消除按键抖动。
2、编写程序
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz,延迟1ms,x为无符号整数参数
{
unsigned char i, j; //定义i、j为无符号字符
while(xms) //将延迟1ms函数循环x次
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i); //将程序延迟1ms
xms--; //每循环一次,x自动减1
}
}
void main()
{
while(1)
{
if(P3_1==0) //如果独立按键K1被按下,则P3_1==0
{
Delay(20); //延时20ms,为了消除按键抖动
while(P3_1==0); /*如果延时后,K1还是被按下,程序会一直执行空循环
循环体不执行程序,则等同while后加分号*/
Delay(20); //程序跳出循环,说明K1按键被松手
P2_0=~P2_0; //将D1灯取反
}
}
}
3、实物展示
独立按键控制LED状态
四、独立按键控制LED显示二进制
1、编写程序
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--) //--在后,则是操作完xms的循环体,自动减1
{
i = 2;
j = 239;
do
{
while (--j); //--在前,则是在操作j前,自动减1
} while (--i);
}
}
void main()
{
unsigned char LEDNum=0; //无符号字符型,正好是8位二进制
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++; //每按键一次,LEDNum就自动加1
P2=~LEDNum; //因为LED灯是0才亮,1为灭,所以需要取反才是刚好显示二进制
}
}
}
2、实物展示
独立按键控制LED显示二进制
五、独立按键控制LED移位
1、编写程序
#include <REGX52.H>
void Delay(unsigned int xms); //函数放后面,一定要再前面声明这个函数
unsigned char LEDNum; //全局变量,所有函数都可用
//没有给初始值,默认为0
void main()
{
P2=~0x01;
while(1)
{
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
LEDNum++; //每按键一次,LEDNum自动加1
if( LEDNum>=8)
LEDNum=0; //如果中括号中只有一句程序,可以省略
P2=~(0x01<<LEDNum); //每按键一次K2,就将0000 0001中的1向左移一位
//每按键一次K2,就将D1灯向右移一位
}
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--; //每按键一次,LEDNum自动减1
P2=~(0x01<<LEDNum); //每按键一次K1,就将0000 0001中的1向右移一位
//每按键一次K1,就将D1灯向左移一位
}
}
}
void Delay(unsigned int xms) //@12.000MHz,延迟1ms,x为无符号整数参数
{
unsigned char i, j; //定义i、j为无符号字符
while(xms--) //将延迟1ms函数循环x次
{ //--在后,则是操作完xms的循环体,自动减1
i = 2;
j = 239;
do
{
while (--j); //--在前,则是在操作j前,自动减1
} while (--i); //将程序延迟1ms
}
}
2、实物展示
独立按键控制LED移位