熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2020-10-5 10:32
正文摘要:本帖最后由 武。。。。 于 2020-10-5 16:07 編輯 按下按鍵一后(短按),8個(gè)led燈全部亮(死循環(huán));按下按鍵二后,8個(gè)led燈進(jìn)行流水(死循環(huán));按下按鍵三后,8個(gè)led燈同時(shí)做呼吸(2秒亮,4秒暗)(利用pwm占空 ... |
daemondong 發(fā)表于 2020-10-9 19:15 我試著那樣去仿真,發(fā)現(xiàn)按了呼吸燈的按鍵后就無(wú)法按其他按鍵了,會(huì)一直停留在呼吸燈那里。 |
呼吸比較好實(shí)現(xiàn) 定時(shí)器中斷里面做10毫秒時(shí)基,計(jì)數(shù)延時(shí) ,燈也加上閃爍秒計(jì)數(shù)2之前亮 到6滅燈清0 就好了 |
呼吸死在 140行 while(1); 修改如下: 1. 去掉 140行 2. 110行 case 3 如下 case 3: //led燈進(jìn)行閃爍 huxi(); break; |
這種情況下我就不想用定時(shí)器了,當(dāng)然,用定時(shí)器延時(shí)ok的。既然是51,直接讀取按鍵對(duì)應(yīng)口,根據(jù)讀取到的值執(zhí)行不同的程序。所以寫(xiě)四個(gè)現(xiàn)象的函數(shù),然后根據(jù)IO口讀取條件調(diào)用 |
武。。。。 發(fā)表于 2020-10-7 00:46 上面例程是各一秒左右,修改下參數(shù)很容易實(shí)現(xiàn)的 |
tyrl800 發(fā)表于 2020-10-6 10:10 你好,請(qǐng)問(wèn)您的呼吸燈部分是亮兩秒暗四秒嗎? |
//***********硬件底層定義************** #define K1 P14 #define K2 P15 #define K3 P16 #define K4 P17 //***********軟件層定義************* #define KEY1_PRES 1 //KEY1按下 #define KEY2_PRES 2 //KEY2按下 #define KEY3_PRES 3 //KEY3按下 #define KEY4_PRES 4 //KEY4按下 #define KEY5_PRES 5 //KEY3和KEY4同時(shí)按下 擴(kuò)展用 //***********按鍵檢測(cè)函數(shù)************** unsigned char Key_Scan(unsigned char mode) { static unsigned char Key_Up = 1; //按鍵按松開(kāi)標(biāo)志 if(mode) //支持連按 { Key_Up = 1; } if(Key_Up && (K1==0 || K2==0 || K3==0 || K4==0)) { Key_Up = 0; if(K1 == 0) return KEY1_PRES; else if(K2 == 0) return KEY2_PRES; else if(K3 == 0 && K4 == 0) return KEY5_PRES; else if(K3 == 0) return KEY3_PRES; else if(K4 == 0) return KEY4_PRES; } else if(K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1) { Key_Up = 1; } return 0; //無(wú)按鍵按下 } //*************按鍵處理函數(shù)**************** Key_Deal() { key = Key_Scan(1); //key外部變量, 1:支持連按, 0:不支持連按, switch(key) { case 1: KeyFlag = 1; //KeyFlag 外部變量 break; case 2: KeyFlag = 2; break; case 3: KeyFlag = 3; break; case 4: //關(guān)定時(shí)器,熄燈; break; default: break; } } main() { Key_Deal(); switch(KeyFlag) { case 1: //關(guān)定時(shí)器 //全亮操作 break; case 2: //關(guān)定時(shí)器 //跑馬燈操作 break; case 3: //呼吸燈,開(kāi)定時(shí)器; break; } } |
你的呼吸燈是通過(guò)定時(shí)器實(shí)現(xiàn)的,開(kāi)啟后,定時(shí)器會(huì)常態(tài)一直工作,當(dāng)鍵值改變后,你有判斷后去改變 “ET0 = 0; 或者 EA = 0;”操作么? |
#include<reg52.h> #define uchar unsigned char #define uint unsigned int #define Kport P3 #define Ledport P1 uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移 unsigned char kscancnt; //記錄進(jìn)入中斷的次數(shù),滿一個(gè)周期清零 void timer0_init(); //定時(shí)器0初始化 void delayMS(uint x); //延時(shí)函數(shù) void KeyProcess(uchar Key); //按鍵處理函數(shù) bit flag; uchar knum; uint F3cnt,F2cnt,Pwmcnt,T0cnt; uchar temp=0xff,temp1; uchar sh_cnt; //延時(shí)函數(shù) void delayMS(uint x) { uchar i; while (x--) for(i=0;i<120; i++) ; } /*************************************************** * 定時(shí)器0初始化子函數(shù) * 工作方式2,每1000us中斷一次 ****************************************************/ void timer0_init(void) { TMOD = 0x01; //采用定時(shí)器0,工作方式2, TH0 = (65536-1000)/256; //定時(shí)器設(shè)置,每隔20us發(fā)起一次中斷。 TL0 = (65536-1000)%256; ET0 = 1; //開(kāi)定時(shí)器0中斷 EA = 1; //開(kāi)總中斷 TR0 = 1; //打開(kāi)定時(shí)器 } //檢測(cè)按鍵 uchar GetKey(uchar kscancnt) { uchar ktmp; if(kscancnt==0) { temp=(Kport&0xf0)>>4; ktmp=~temp &(temp1); if(ktmp)knum=ktmp; temp1=temp; } return knum; } //鍵盤(pán)按鍵處理 void KeyProcess(uchar Key) { switch (Key) { case 1:Ledport=0x00; break; case 2:if(F2cnt==200){sh_cnt=++sh_cnt%8;F2cnt=0;} Ledport=table0[sh_cnt]; break; case 4:if(T0cnt==300) {F3cnt=F3cnt+10;T0cnt=0;} if(F3cnt==130){F3cnt=0;flag=!flag;} Pwmcnt=++Pwmcnt%100; if(flag) {if(Pwmcnt>F3cnt)Ledport=0x00;else Ledport=0xff;} else {if(Pwmcnt>F3cnt)Ledport=0xff;else Ledport=0x00;} break; case 8:Ledport=0xff; //全部關(guān)閉 break; } } /*************************************************** * 中斷服務(wù)子函數(shù) *****************************************************/ void time0(void) interrupt 1 { TH0 = (65536-1000)/256; //定時(shí)器設(shè)置,每隔20us發(fā)起一次中斷。 TL0 = (65536-1000)%256; kscancnt=++ kscancnt%10; if(knum==2) {F2cnt++; } if(knum==4) {T0cnt++; } } //-------------------------------------------------------------------- void main(void) { uchar Key; P0=P1=0xFF; timer0_init(); while(1) { Key=GetKey(kscancnt); KeyProcess(Key); } } |
Powered by 單片機(jī)教程網(wǎng)