[3-1] 独立按键控制LED亮灭_哔哩哔哩_bilibili
按下的时候连接,松开的时候断开。
一头接GND(电源负极),另一头接I/O口。
单片机上电时,所有I/O口为高电平。
按键没有按下,I/O口为高电平。
按键按下,I/O口为低电平。
寄存器会检测I/O口的值,读入寄存器中。
直接读寄存器,值应该为1.
按键按下,寄存器值应该为0.
(1)
直接对位进行操作:
#include <REGX52.H>
#include <INTRINS.H>
void main()
{
P2_0=0;
while(1)
{
}
}
(2)
按下K1,LED1亮,松开,LED1灭。
#include <REGX52.H>
#include <INTRINS.H>
void main()
{
while(1)
{
if(P3_1==0){
P2_0=0;
}
else{
P2_0=1;
}
}
}
(3)
按键按下,灯亮,再按下,灯灭:
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_time(int x)//ms
{
int i;
for(i=0;i<x;i++)
{
Delay1ms();
}
}
void main()
{
P2_0=0;//点亮LED1
while(1)
{
if(P3_1==0){
Delay_time(20);//消抖
//按键按下
while(P3_1==0)
{
}
Delay_time(20);//消抖
P2_0=~P2_0;
}
}
}
(4)
LED1亮,按下按钮,LED2亮,,,再按,LED8亮,然后,LED1亮。
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_time(int x)//ms
{
int i;
for(i=0;i<x;i++)
{
Delay1ms();
}
}
void main()
{
P2=0xFE;
while(1)
{
if(P3_1==0){
Delay_time(20);
while(P3_1==0)
{
}
Delay_time(20);
P2<<=1;
P2=P2|0x01;
if(P2==0xFF)P2=0xFE;
}
}
}
(5)
LED1亮,按下按钮,LED8亮,按下按钮,LED7亮,,,再按,LED1亮,然后,LED8亮。
LED1--->LED8--->LED7--->LED6--->LED1(逆循环)
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_time(int x)//ms
{
int i;
for(i=0;i<x;i++)
{
Delay1ms();
}
}
void main()
{
P2=0xFE;
while(1)
{
if(P3_0==0)
{
Delay_time(20);
while(P3_0==0)
{
}
Delay_time(20);
P2>>=1;
P2=P2|0x80;
if(P2==0xFF)P2=0x7F;
}
}
}
(6)
按下K1,LED1--->LED2--->LED8--->LED1
按下K2,,LED1--->LED8--->LED7--->LED1
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_time(int x)//ms
{
int i;
for(i=0;i<x;i++)
{
Delay1ms();
}
}
void main()
{
P2=0xFE;
while(1)
{
if(P3_1==0){
Delay_time(20);
while(P3_1==0)
{
}
Delay_time(20);
P2<<=1;
P2=P2|0x01;
if(P2==0xFF)P2=0xFE;
}
if(P3_0==0)
{
Delay_time(20);
while(P3_0==0)
{
}
Delay_time(20);
P2>>=1;
P2=P2|0x80;
if(P2==0xFF)P2=0x7F;
}
}
}
(7)
使用LED8---LED1,8个灯表示数a的二进制形式。
开始时a=0
按下按钮,a++
a=255时,按下按钮,a=0。
观察8个灯的变化
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_time(int x)//ms
{
int i;
for(i=0;i<x;i++)
{
Delay1ms();
}
}
void main()
{
unsigned char a=0x00;
while(1)
{
if(P3_1==0){
Delay_time(20);
while(P3_1==0)
{
}
Delay_time(20);
a=a+1;
P2=~a;
if(a==256)a=0x00;
}
}
}