熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-3-7 18:59
正文摘要:如圖,想用一個(gè)按鍵切換流水燈的多種流動(dòng)模式,但是單片機(jī)程序不會(huì),不知道是否需要用到中斷。新手不是很會(huì)中斷,求教程序如何編寫 |
可以定義一個(gè)變量記錄按下的次數(shù)來控制流動(dòng)方式 |
我這里有一個(gè)與你說的類似的程序,它是用外部中斷來切換點(diǎn)陣顯示的程序,你自己看看,學(xué)習(xí)學(xué)習(xí),再變成你自己的程序吧。 #include <reg52.h> #define uchar unsigned char #define uint unsigned int //宏定義 sbit KEY=P3^4; //定義畫面切換按鍵,可以不定義,外部中斷會(huì)自己認(rèn)的 uchar KY; uchar disp; uchar pic=0,num=0; //pic為按鍵次數(shù);num為中斷次數(shù) uchar code love[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x20, 0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F, 0x04,0x10,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0xF8,0x0F,0x00,0x00, 0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x10, 0x00,0x08,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x82,0x20,0x82,0x20, 0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*LOVE*/ }; uchar code loveyou[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0xFC,0x3F, 0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0xFC,0x00, 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*心形圖案*/ }; uchar code hehe[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00, 0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00, 0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20, 0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00, 0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0x08,0x10, 0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*呵呵o(∩_∩)o圖案*/ }; unsigned char code hanzi[] = { 0x80,0x40,0x40,0x40,0x30,0x42,0x1E,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0xFF,0x7F, 0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x40,0x00,0x40,0x00,0x00,/*"生",0*/ /* (16 X 16 , 宋體 ) */ 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40, 0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/ /* (16 X 16 , 宋體 ) */ 0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31, 0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*"快",2*/ /* (16 X 16 , 宋體 ) */ 0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F, 0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*"樂",3*/ /* (16 X 16 , 宋體 ) */ 0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,0xFE,0x7F,0x23,0x02,0x22,0x41,0x20,0x40, 0x20,0x20,0xFF,0x13,0x20,0x0C,0x22,0x14,0x2C,0x22,0xA0,0x41,0x20,0xF8,0x00,0x00,/*"我",4*/ /* (16 X 16 , 宋體 ) */ 0x80,0x00,0x64,0x41,0x2C,0x21,0x34,0x91,0x24,0x89,0x24,0x87,0xEC,0x4D,0x32,0x55, 0x22,0x25,0x22,0x25,0x32,0x55,0x2E,0x4D,0x23,0x81,0xA2,0x80,0x60,0x80,0x00,0x00,/*"愛",5*/ /* (16 X 16 , 宋體 ) */ 0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x10,0x20,0x0C,0x18,0x03, 0x0F,0x40,0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01,0x28,0x06,0x18,0x18,0x00,0x00,/*"你",6*/ /* (16 X 16 , 宋體 ) */ 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",7*/ /* (16 X 16 , 宋體 ) */ }; //漢字編碼 /********顯示編碼END*******************/ /**********函數(shù)聲明******************/ void display1(void); //顯示漢字子函數(shù) void display2(void); //顯示LOVE圖案子函數(shù) void display3(void); //顯示心形圖案子函數(shù) void display4(void); //顯示笑臉圖案子函數(shù) /*********n(us)延時(shí)子程序***********/ void DelayUs(uint M) { uint x; for(x=0;x<=M;x++); } /**********INT0中斷服務(wù)程序***********/ void intersvr0(void) interrupt 0 using 1 { KY=~KY; //每個(gè)搖動(dòng)來回水銀開關(guān)會(huì)在擺幅兩端分別產(chǎn)生下降沿中斷,只提取其中一次(從左向右搖才顯示) if(KY==0) { num++; //計(jì)算中斷次數(shù) switch(pic) //選擇畫面 { case 0: display1();break; case 1: display2();break; case 2: display3();break; case 3: display4();break; default: display1(); } } } /*********顯示子程序1(漢字)*********/ void display1(void) { uchar i; if(num>10) { disp++; num=0; } //12個(gè)漢字分為3次顯示完(每次顯示4個(gè)),每中斷10次切換 if(disp>=2) disp=0; DelayUs(3400); //此處延時(shí)時(shí)間依各硬件差別而各不相同,試著調(diào)整使得顯示內(nèi)容居中即可 for(i=0;i<64;i++) { P1=~hanzi[disp*128+i*2]; P2=~hanzi[disp*128+i*2+1]; DelayUs(95); P2=0xff; P1=0xff; } } /***********顯示子程序2(LOVE)********/ void display2(void) { uchar i; DelayUs(2000); for(i=0;i<64;i++) { P1=~love[i*2]; P2=~love[i*2+1]; DelayUs(130); } } /*******顯示子程序3(心形圖案)*******/ void display3(void) { uchar i; DelayUs(1100); for(i=0;i<64;i++) { P1=~loveyou[i*2]; P2=~loveyou[i*2+1]; DelayUs(200); } } /********顯示子程序4(呵呵o(∩_∩)o圖案)********/ void display4(void) { uchar i; DelayUs(2500); for(i=0;i<64;i++) { P1=~hehe[i*2]; P2=~hehe[i*2+1]; DelayUs(120); } } /*****主函數(shù)*****/ void main(void) { IT0=1; EX0=1; EA=1; //開中斷,下降沿中斷 KY=0; while(1) //主程序中只檢測(cè)按鍵 { if(KEY==0) //畫面切換鍵按下 { DelayUs(10000); //按鍵去抖 if(KEY==0); pic++; if(pic>3)pic=0; while(KEY==0); } } } |
新手求教啊![]() |
Powered by 單片機(jī)教程網(wǎng)