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