对LED的一些操作
- 1、LED1闪烁
- 2、按键控制LED1
- 3、按键消抖
- 4、按键控制灯的2种状态
- 5、2个按键控制LED
1、LED1闪烁
要让LED灯闪烁,则要使灯呈现出亮灭,亮灭状态。亮到灭这段时间我们通过延迟函数来占用单片机的执行。
#include <REGX52.H>sbit LED1 = P3^7;void Delay500ms() //500ms的延迟函数,由STC软件自动生成
{unsigned char i, j, k;i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}void main(void)
{while(1){LED1 = 0;Delay500ms();LED1 = 1;Delay500ms();}
}
2、按键控制LED1
按下SW1按键,LED1亮,松开SW1按键,LED1灭。
由图可知,SW1连接的IO口为P2.1,SW2连接的IO口为P2.0。
由按键电路原理图可得,当按键SW1松开时,IO口输入为高电平;当SW1按键按下时,IO口输入为低电平。
#include <REGX52.H>sbit LED1 = P3^7;
sbit KEY1 = P2^1;void main(void)
{while(1){if(KEY1 == 1)//SW1松开状态LED1 = 1; //灯灭elseLED1 = 0; //灯亮}
}
3、按键消抖
按键抖动:不确定P2.1IO口变化是按键按下造成的,还是其他原因引起的。所以需要按键消抖,这里使用软件消抖。
代码①:
#include <REGX52.H>void Delay50ms() //@11.0592MHz
{unsigned char i, j;i = 90;j = 163;do{while (--j);} while (--i);
}sbit LED1 = P3^7;
sbit KEY1 = P2^1;void main(void)
{while(1){if(KEY1 == 1)//SW1松开状态{Delay50ms();//延迟150msif(KEY1 == 1)LED1 = 1; //灯灭}else{if(KEY1 == 0){Delay50ms();//消除抖动LED1 = 0; //灯亮}}}}
4、按键控制灯的2种状态
SW1按下灯亮,在按一下灯灭。
#include <REGX52.H>void Delay50ms() //@11.0592MHz
{unsigned char i, j;i = 90;j = 163;do{while (--j);} while (--i);
}sbit LED1 = P3^7;
sbit KEY1 = P2^1;void main(void)
{LED1 = 1;//上电让灯灭while(1){if(KEY1 == 1)//SW1松开{Delay50ms();//延迟50ms,按键消抖if(KEY1 == 0){Delay50ms();//延迟50ms,按键消抖LED1 = !LED1; //灯的状态翻转}}}
}
5、2个按键控制LED
SW1控制灯亮,SW2控制灯灭。
#include <REGX52.H>#define ON_STATUS 1//通过define定义2个状态
#define OFF_STATUS 0void Delay50ms() //延迟函数
{unsigned char i, j;i = 90;j = 163;do{while (--j);} while (--i);
}sbit LED1 = P3^7;
sbit KEY1 = P2^1;
sbit KEY2 = P2^0;void main(void)
{int LED1Mark = OFF_STATUS;//定义一个标志位,先让它关闭while(1){if(KEY1 == 0)//SW1被按下{Delay50ms();if(KEY1 == 0)LED1Mark = ON_STATUS; //标志位打开}if(KEY2 == 0)//SW2被按下{Delay50ms();if(KEY2 == 0)LED1Mark = OFF_STATUS; //标志位关闭 }if(LED1Mark == ON_STATUS){LED1 = 0;//灯打开}else{LED1 = 1;//灯关闭}}
}