前言
大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
一.前置操作
1.独立按键介绍
- 如图三所示,红色和黄色区域接触部分;当按钮按下时,图二中所示的金属片会将两部分(四引脚)链接;
2.独立按键的原理图图与电平状态
- 独立按键的原理图,注意
- 我们在MCU的原理图中可以找到与其链接的L口
- 单片机上电时,所有L口默认是 高电平;所以当按键按下时,L口就变为 低电平(接了独立按键的地线)
3.开发板图查询:对应独立按键,LED和MCU的原理图,找对应接口控制
- 我们根据开发图,发现P3.0~3.3控制按键;P2控制LED
4.按键寄存器:利用【寄存器检测IO电平并返回的性质】
- 寄存器写一个值,它会送到L口上
- 寄存器也会检测这个L口的电平,然后再重新读回寄存器中
- 在这次独立按键实验中的现象就是:独立按键按下,寄存器值为0;松开寄存器值为1;
- 反应到代码中即是
5.LED:寄存器P2——>8位控制,P2_n——>1位控制
- 右击头文件,点击打开
- 我们可以看到P2_0~7分别单独控制1位,一共控制8位
- 我们既可以通过8位控制LED,也可以1位1位单独控制
- 1位控制:
- 8位控制: (不支持二进制直接转换,要换成十六进制)
二.【控制LED亮灭】
- 完整代码如下所示:
- 烧写步骤可见博主【LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)】关于烧写的部分:传送门
#include <REGX52.H> void main() { while(1)//保持不间断的执行流 { if(P3_1==0)//按下 { P2_0=0;//灯灭 } else//松手 { P2_0=1;//灯亮 } } }
- 现象:我们烧写入单片机后,可以发现按下k1按键,d1灯亮;松开,d1灯灭;
三.【控制LED状态】
1.按键抖动问题
- 我们发现中间存在:
- 2个抖动时间段(按下时)(松开时)
- 1个中间时间段
- 我们要采用【时间延迟】的原理规避这一现象
2.我们要采用【时间延迟】的原理规避这一现象
- 自定义延时子程序传送门:传送门
- 我们在第一个抖动时间段(按下时)设置一个延时程序
- 在中间时间段时,设置一个判断按键状态的while循环
while(P3_1==0);
,使他实现【到达中间时间段,停下等待按钮状态:实现按下进入循环,松手跳出循环继续程序】 - 我们在第二个抖动时间段(松手时)设置一个延时程序
#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { while(1) { if(P3_1==0)//按下 { Delay(20);//在前一段抖动时间延时 while(P3_1==0);//到达中间时间段,停下等待按钮状态:实现按下进入循环,松手跳出循环继续程序 Delay(20);//在后一段抖动时间延时 P2_0=~P2_0;//取反 } } }
- 现象:我们烧写入单片机后,可以发现按下k1按键,d1灯亮并保持;再次按下,d1灯灭并保持;
四.【控制LED二进制式显示】
- 要让LED二进制式显示,那就是要对整个LED模块进行控制,意味着我们要用 8位的形式控制P2寄存器 ,而不是1位1位控制;
- 我们设置一个
unsigned char LEDNum=0;
,让其在按下松开后++;控制LED模块的P2寄存器对其取反即可 - 当LEDNum满了以后,即P2内状态为
1111 1111
,再次++,变为0000 0000
,取反后变成1111 1111
,灯灭;
#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { unsigned char LEDNum=0; while(1) { if(P3_1==0) { Delay(20); while(P3_1==0); Delay(20); LEDNum++; P2=~LEDNum; } } }
- 现象:我们烧写入单片机后,可以发现不断按下k1按键,LED灯呈2进制形式亮
五.【控制LED不断移位】
- 我们要设计两个按钮,根据线路图,我们挑选P3.1和P3.0
要确保两个按钮共同控制,因此要设置:
- 一个常量
unsigned char LEDNum=8;
- P2寄存器初始地址
0x01;
,左右变换都从初始地址出发#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } unsigned char LEDNum=8;//常量 void main() { P2=~0x01; while(1) { if(P3_1==0) { Delay(20); while(P3_1==0); Delay(20); if(LEDNum>=8) { LEDNum=0; } else { LEDNum++; } P2=~(0x01<<LEDNum); } if(P3_0==0) { Delay(20); while(P3_0==0); Delay(20); if(LEDNum==0) { LEDNum=7; } else { LEDNum--; } P2=~(0x01<<LEDNum); } } }
- 现象:我们烧写入单片机后,可以发现不断按下k1按键,LED往左移一格亮;按下k2按键,LED往右移一格亮