学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp
开发板实图:
文章目录
独立按键
独立按键在开发板的左下角
相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
不按下时,图中圈出的金属弹片凸起,不会连通电路,按下后变得扁平,将电路连通
独立按键在开发板中原理图如下:
- GND表示接地,表示负极
- P30~P33是I/O口 ,CPU通过控制I/O口来实现电路是否连通,详细原理可参看!!!
- 因为GND一端为负极,所以
K1等为0,代表按键被按下,为1代表松开(没按下)
- 该开发板的
K1连接的是P31,K2连接的是P30
,应该是连反了。理应按顺序,K1接0,K2接1,K3接2,K4连3
练习
通过独立按键控制LED亮起/熄灭
LED灯可以参看单片机第一个程序
此处简单介绍:P2_0 ~ P2_7控制D1 ~ D8,0为亮起,1为熄灭
要想实现该需求,我们可以通过检测独立按键的状态,按下让灯亮起,松开让灯熄灭。
因为我们要一直检测,所以需要在外层套个循环
代码如下:
c
//按下按键灯亮,松开按键灯灭
void test1()
{
//可以通过P2_0单独控制寄存器的一个比特位
//独立按键K4->P3_3,K3->P3_2,K2->P3_0,K1->P3_1
//按键1和2反了
while(1)
{
if(P3_1 == 0)//K1按键按下
P2_0 = 0;//D1亮灯
else//K1没按下
P2_0 = 1;//D1灭灯
}
}
按键的抖动
按键的按下,对应电路的连通其实是一下就连通稳定的,如下图:
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
这些抖动可能会影响按键状态的判断,要想消除这些抖动,我们可以手动进行延迟来过滤这些抖动
延迟的函数可以通过STC-ISP
生成
注意选择符合的系统频率、指令集
我们可以生成延迟1ms的函数,然后稍加改动,变成可以指定延迟任意时间的方法
c
//等待指定毫秒数
void Delayms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
消除抖动的代码如下:
c
//按下独立按键K1,再松开后改变D1灯的状态
void test2()
{
while(1)
{
if(P3_1 == 0)
{
Delayms(20);//按键的抖动------5~10ms,通过等待20ms,获取稳定的信号
while(P3_1 == 0);//等待松开
Delayms(20);//同样消除松开的抖动
P2_0 = ~P2_0;//改变LED灯状态
}
}
}
独立按键实现LED二进制亮起
因为LED灯是0亮起,1熄灭,所以我们可以通过控制其他变量从1开始累加,然后P2为其取反的值 即可
代码如下:
c
//通过独立按键K1,使LED呈二进制++亮起
void test3()
{
unsigned char LEDNum = 1;
while(1)
{
if(P3_1 == 0)
{
Delayms(20);//消除按下抖动
while(P3_1 == 0);//等待松开
Delayms(20);//消除松开抖动
P2 = ~LEDNum;
LEDNum++;
}
}
}
独立按键实现LED左右移动
按下K1按键让LED灯往左,按下K2按键让LED灯往右
因为博主开发板的LED灯从左往右是D1~D8,注意辨别方向
代码如下:
c
//K1按键让LED灯往左走,K2按键让LED灯往右走
void test4()
{
unsigned char LEDNum = 1;
P2 = 0xFE;//起始第一个灯亮起
while(1)
{
if(P3_1 == 0)//K1按下,LED灯往左
{
Delayms(20);
while(P3_1 == 0);
Delayms(20);
if(LEDNum == 1)//已经来到最左边,下一步直接跳到右边
LEDNum = 0x80;
else
LEDNum >>= 1;
P2 = ~LEDNum;
}
else if(P3_0 == 0)//K2按下,LED灯往右
{
Delayms(20);
while(P3_0 == 0);
Delayms(20);
LEDNum <<= 1;
if(LEDNum == 0)//LEDNum为unsigned,溢出后会变成0
LEDNum = 1;
P2 = ~LEDNum;
}
}
}
注意点: P2 = ~LEDNum
- 当要向左移动时,如果当前LEDNum为1时,此时P2 = 0xFE,最后一位为0,只有D1亮。要想再往左,那么要让D8亮,即P2只有最高位为0,相反的LEDNum只有最高位为1,所以LEDNum = 0x80
- 当要向右移动时,因为
LEDNum为unsigned,溢出会变成0
,移位完为0,说明接下来要变成D1亮。此时P2 = 0xFE,则LEDNum = 1
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。