51单片机之按键控制RGB灯
描述:利用KEIL5编程,使AT89C52通过按键输入控制RGB灯显示不同颜色。
硬件:
电路仿真图(未运行)

电路仿真图(运行)

程序:
主要是按键消抖,机械按键按下有一定的抖动时间,按下时需要延时一段时间再次判断。
仿真软件的按键波形



#include <REGX52.H>
sbit KEY1 = P3^0; //°´¼ü
sbit LED_R = P2^0; //ºì
sbit LED_G = P2^1; //ÂÌ
sbit LED_B = P2^2; //˦
unsigned char LED_Mode = 0;
unsigned char Key_Flag = 0;
//ÑÓʱ1ms(?? 12MHz)
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--); // 12MHz???110? ˜ 1ms
}
void LED_RGB(unsigned char i)
{
switch(i)//¿ØÖÆLEDÏÔʾÑÕÉ<<
{
case 0: LED_R = 1; LED_G = 1; LED_B = 1; break; //black
case 1: LED_R = 0; LED_G = 1; LED_B = 1; break; //red
case 2: LED_R = 1; LED_G = 0; LED_B = 1; break; //green
case 3: LED_R = 1; LED_G = 1; LED_B = 0; break; //blue
case 4: LED_R = 0; LED_G = 0; LED_B = 1; break; //yellow
case 5: LED_R = 0; LED_G = 1; LED_B = 0; break; //violet
case 6: LED_R = 1; LED_G = 0; LED_B = 0; break; //cyan
case 7: LED_R = 0; LED_G = 0; LED_B = 0; break; //white
default: break;
}
}
void Button_Trigger()//°´¼ü´¥·¢
{
//Åжϰ´¼ü°´ÏÂÇÒ°´¼ü±êÖ¾Î>>ÊÇÃ>>Óд¥·¢µÄ״̬
if(KEY1 == 0&&Key_Flag == 0)
{
delay_ms(10); //>>úе°´¼üÏû¶¶
if(KEY1 == 0&&Key_Flag == 0)
{
Key_Flag = 1; //°´¼ü±êÖ¾Î>>ÖÃ1£¬È·¶¨°´¼üÒѾ°´ÏÂ
++LED_Mode;
LED_Mode %= 8;
}
}
else if(KEY1 == 1&&Key_Flag == 1)//°´¼üËÉ¿ªÇÒ°´¼ü֮ǰ°´Ï¹ý
{
Key_Flag = 0;//°´¼ü±êÖ¾Î>>ÖÃ0
}
}
void main()
{
while(1)
{
Button_Trigger();
LED_RGB(LED_Mode);
}
}
以上都是个人练习经验。