51单片机学习笔记(三)独立按键
一、补充的知识点——定义单独的IO口
在上一篇文章中学习了使用位寄存器对LED小灯进行控制
#include <REGX52.H>
void main()
{
P2 = 0xFE;//1111 1110
while(1)
{
}
}
但是在许多情况下,往往需要对个别端口进行操作,每次都要直接对修改整个IO口较为麻烦且容易出错。
因此,可以采用单独定义某个端口的方式来实现
C-51的数据类型扩充定义:
sfr : 特殊功能寄存器声明
sfr16 : sfr的十六位数据声明
sbit : 特殊功能位声明
bit : 位变量声明
#include <REG52.H>
sbit Led1 = P2^0//定义P2^0端口为Led1,便于理解
void main()
{
Led1 = 0;//接入低电平使其发光
while(1)
{
}
}
注意:如果调用的库是’REG52.H’的话是需要这样自己进行定义的,而如果条调用’REGX52.H’的话,可以不用定义,直接使用就可以了,库文件中已经定义好了O(∩_∩)O
#include <REGX52.H>
void main()
{
P2_0 = 0;//对应D1,使其发光
while(1)
{
}
}
二、C语言知识补充
2.1 基本运算
类别 | 符号 | 意义 |
---|---|---|
算数运算 | ||
+ | 加 | |
- | 减 | |
* | 乘 | |
/ | 除 | |
% | 取余 | |
= | 赋值 | |
判断 | ||
> | 大于 | |
>= | 大于等于 | |
< | 小于 | |
<= | 小于等于 | |
== | 等于 | |
!= | 不等于 | |
逻辑 | ||
&& | 逻辑与 | |
逻辑或 | ||
! | 逻辑非 | |
位运算 | ||
& | 按位与 | |
按位或 | ||
! | 按位取反 | |
^ | 按位异或 | |
<< | 按位左移 | |
>> | 按位右移 |
2.2 基本语句
//分支语句
if(逻辑表达式1)
{
语句体1;
}
else if(逻辑表达式2)
{
语句体2;
}
else
{
语句体3;
}
switch(变量)
{
case 常量1:语句体1;break;
case 常量2:语句体2;break;
……
default:语句体x;break;
}
/
//循环语句
while(逻辑表达式)
{
循环体;
}
for(初始化;逻辑表达式;更改条件)
{
循环体;
}
三、独立按键的控制原理
独立按键的工作原理很简单:单片机的各端口默认为高电平,当按下按钮时电路接通,相应的端口连接到GND上,此时端口会变为低电平,可以通过检测端口的电平来判断按键是否按下。
四、独立按键控制LED
Level 1:独立按键控制LED亮灭
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0) //检测P31端口是否是低电平,如果是,则将P20端口设为低电平,使LED发光
{
P2_0=0;
}
else //检测到按键还原,则熄灭Led
{
P2_0=1;
}
}
}
Level 2:独立按键控制LED状态
按键的抖动
对于机械开关,当机械触点断开、闭合时,会产生弹性作用导致开关不能立刻打开或闭合,从而产生抖动。
在编写程序时,可以通过使用延时函数的方式消除抖动:
#include <REGX52.H>
void DelayXms(unsigned int xms)
{
unsigned char i;
unsigned char j;
while(xms--)
{
i=2,j=239;
do
{
while(--j);
}while(--i);
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
//检测一次按键周期
DelayXms(20);//用延时消抖
while(P3_0==0);//等待按键松开,当按键松开时执行下一步
DelayXms(20);//消抖
//LED状态取反
P2_0=~P2_0;
}
}
}
Level 3 独立按键控制LED实现二进制
#include <REGX52.H>
void DelayXms(unsigned int xms)
{
unsigned char i;
unsigned char j;
while(xms--)
{
i=2,j=239;
do
{
while(--j);
}while(--i);
}
}
void main()
{
unsigned char LedNum=0;
while(1)
{
if(P3_1==0)
{
DelayXms(20);
while(P3_1==0);
DelayXms(20);
LedNum++;
P2=~LedNum;//LED低电平点亮
}
}
}
Level 4 独立按键控制LED移位
#include <REGX52.H>
void DelayXms(unsigned int xms)
{
unsigned char i;
unsigned char j;
while(xms--)
{
i=2,j=239;
do
{
while(--j);
}while(--i);
}
}
void main()
{
unsigned char LedNum=0;
P2_0=0;
while(1)
{
if(P3_1==0)
{
//检测按键按下松开
DelayXms(20);
while(P3_1==0);
DelayXms(20);
//令0000 0001分别左移1,2,3……7次为一个循环
LedNum++;
if(LedNum==8)
{LedNum=0;}
P2=~(0x01<<LedNum);
}
}
}