[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;//点亮LED1while(1){if(P3_1==0){Delay_time(20);//消抖//按键按下while(P3_1==0){}Delay_time(20);//消抖P2_0=~P2_0;}}
}
(4)
LED1亮,按下按钮,LED2亮,,,再按,LED8亮,然后,LED1亮。
都不亮,1111 1111
LED1亮,1111 1110
LED2亮,1111 1101
LED3亮,1111 1011
LED8亮,0111 1111
#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亮。
都不亮,1111 1111
LED1亮,1111 1110
LED8亮,0111 1111
LED7亮,1011 1111
LED3亮,1111 1011
LED2亮,1111 1101
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个灯的变化
0000 0000
0000 0001
0000 0010
0000 0011
......
1111 1111
0000 0000
#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;}}
}