用按鍵(采用外部中斷方式)控制彩燈的運(yùn)行。通過按動(dòng)按鍵,彩燈在三種閃亮方式(左移,右移和自定義花樣)之間切換。
在主程序中,設(shè)置一個(gè)判斷的的標(biāo)志變量flag,當(dāng)沒有中斷發(fā)生時(shí),標(biāo)志flag的值沒有被改變,程序保持運(yùn)行使彩燈按其中某一種花樣閃亮顯示。若按下鍵后,使單片機(jī)產(chǎn)生中斷,中斷函數(shù)被調(diào)用,則標(biāo)志flag的值將發(fā)生一次改變(這里的中斷函數(shù)就是修改flag的值),在退出中斷后,主程序再次執(zhí)行到判斷標(biāo)志flag時(shí),由于標(biāo)志flag的值已經(jīng)是新的值,所以將執(zhí)行另一彩燈控制子程序,彩燈將按另一種花樣進(jìn)行顯示。
需要說明一點(diǎn)是:如果產(chǎn)生中斷的是低電平不是由按鍵產(chǎn)生的,而是由于其他按鍵產(chǎn)生的沒有抖動(dòng)的信號(hào),在中斷程序中則不需要消抖處理。
源程序:
#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; } }