用按鍵(采用外部中斷方式)控制彩燈的運行。通過按動按鍵,彩燈在三種閃亮方式(左移,右移和自定義花樣)之間切換。
在主程序中,設置一個判斷的的標志變量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; } }