本次实验控制按键来控制LED灯点亮。
先看硬件原理图:
独立按键模块:
从原理图上可以看到,当按键按下时,应用51单片机的引脚检测到低电平。
- 按键1:K1对应P14
- 按键2:K2对应P15
- 按键3:K3对应P16
- 按键4:K4对应P17
LED灯模块对应的是P2引脚,也是低电平亮灯。
注意:代码注意按键需要做软件消除按键的抖动,其实就是增加个极小的延时,做一个按键低电平的确认即可 。
#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2 //宏定义P2口
sbit K1=P1^4; //位操作
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
sbit K5=P3^5;
void Delay10ms( ); //延时10ms
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
while(1)
{
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K1==0)
{
GPIO_LED = 0xfe; //1111 1110 第一个灯亮
}
}
if(K2==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K2==0)
{
GPIO_LED = 0xfd; //1111 1101 第二个灯亮
}
}
if(K3==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K3==0)
{
GPIO_LED = 0xfb;
}
}
if(K4==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K4==0)
{
GPIO_LED = 0xf7;
}
}
if(K5==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K5==0)
{
GPIO_LED = 0xef;
}
}
}
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}