用按鍵(采用外部中斷方式)控制彩燈的運行。通過按動按鍵,彩燈在三種閃亮方式(左移,右移和自定義花樣)之間切換。
在主程序中,設置一個判斷的的標志變量flag,當沒有中斷發生時,標志flag的值沒有被改變,程序保持運行使彩燈按其中某一種花樣閃亮顯示。若按下鍵后,使單片機產生中斷,中斷函數被調用,則標志flag的值將發生一次改變(這里的中斷函數就是修改flag的值),在退出中斷后,主程序再次執行到判斷標志flag時,由于標志flag的值已經是新的值,所以將執行另一彩燈控制子程序,彩燈將按另一種花樣進行顯示。
需要說明一點是:如果產生中斷的是低電平不是由按鍵產生的,而是由于其他按鍵產生的沒有抖動的信號,在中斷程序中則不需要消抖處理。
源程序:
#include "reg51.h"
#define uchar unsigned char
uchar flag;
uchar light,assum;
void delay05s()
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=200;j>0;j--)
for(k=250;k>0;k--);
}
void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=250;j>0;j--)
}
void left()
{
light=light<<1;
if(light==1) light=0x01;
P2=~light;
}
void right()
{
light=light>>1;
if(light==0) light=0x80;
P2=~light;
}
void assum()
{
uchar code dispcode[8]={0x7e,0xbd.0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
if(assum==7) assum=0;
else
assum++;
}
void main()
{
IT0=1;
EX0=1;
EA==1;
flag=1;
light=0x01;
assum=0;
while(1)
{
switch(flag)
{
case 1: left(); break;
case 2: right(); break;
case 3: assum() break;
}
delay05s();
}
}
void int-0() interrupt 0
{
delay10ms();
if(INT0==0)
{
flag++;
if(flag>3) flag=1;
}
}
