用按键(采用外部中断方式)控制彩灯的运行。通过按动按键,彩灯在三种闪亮方式(左移,右移和自定义花样)之间切换。
在主程序中,设置一个判断的的标志变量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;
}
}