一.认识独立按键
对单片机中独立按键的区域进行学习,位于单片机左下角
内部构造:
原理图:按下的时候连接(相当于导线相连),反之断开连接
二.实例学习
1.独立按键控制LED亮灭
上一节的控制LED开关是通过对寄存器的操作来实现的,寄存器八个为一组,如果只操作P2的话需要同时为八个赋值,但是现在只想要操作最低位。
进入头文件中
每位单独的操作,位寄存器
P2_0 相当于是单片机上的一个端口,这个端口就是链接右边第一个LED灯的,等于左边第七个LED直接不给信号,只给右边第一个一个亮灯的信号
一位的只需要0和1,而不需要和之前的0xEF一样满足进制数
在stc中运行发现可以达到独立按键K1控制第一个LED灯的开关。
2.独立按键控制LED状态
通过软件来达到消除按键延时的周期,达到按键按下才亮灯的效果,减少按键抖动的效果。
单片机通电后P2_0,默认为高电平,需要进行取反
3.独立按键控制LED显示二进制
前提准备:独立按键控制功能 延时函数
//延时函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
主函数循环体
不能对P2口直接进行操作,达不到想要的功能,取反有限制,需要引入一个变量来进行操作,再将这个变量给P2口
最终能实现显示LED二进制
4.独立按键控制LED移位
仍需要延时函数,复制3.独立按键控制LED显示二进制中的延时函数即可
需要左移
等于8时需要回到0,重新开始
完整代码如下:
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
void main()
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
}
}
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
用于初始化,效果是让LED灯从D1开始亮,而不是D2.
5.如何实现多个按键移位
在4的基础上进行操作,对不同的接口操作。
为什么是左移?
因为每次移位取反后P都是重新赋值0x01再移位取反的。
比如: LEDNum = 0,LEDNum++后LEDNum=1,那P = ~(0x01 << 1)点亮第二个灯