![]() |
發布時間: 2019-12-28 22:39
正文摘要:新手想請假一下各位大佬,要怎么樣才能做到讓數碼管其中一位以1Hz閃動,其他三位正常顯示,已經卡在這個步驟好多天了,是需要用到中斷定時器什么的嗎,希望大佬可以講一下具體思路 |
這個最好還是用中斷,因為有長延時容易造成程序時間阻塞!!! 思路:就兩個方向解決 1:控制數據線,掃描線不變。這個樓上有人已經說過就是沒點通而已,需要寫兩個函數,一個正常的掃描函數;另一個根據設置位的標志將相應位寫全1或全0關閉(取決于共陰還是共陽),兩個函數交叉調用即可。調用時間就是頻率,自己決定。如果要退出設置狀態,就只調用正常掃描的函數。 2:數據線不變,控制掃描線。同樣設置位標志決定哪一位閃爍,相應位位選線的開啟用閃爍周期決定, 比如前500MS開啟,后500MS關閉。其它的和正常掃描一樣。多申明一組變量來賦給位選,不要直接控制,這樣就很方便了。 |
Rei 發表于 2019-12-29 12:43 除了加分的那個思路,其他的很麻煩,貼程序的沒聽懂你的意思基本在忽悠。 |
定時器中斷 |
Rei 發表于 2019-12-29 12:43 勘誤: if(Twinkle==1 && key==i)//閃爍標志與鍵值條件符合 P0=0x00; //保持消隱狀態 else P0=dis_buf; //送段碼,dis_buf[ ]顯示緩存數組 |
Rei 發表于 2019-12-29 12:43 這是一個動態顯示的數碼管驅動程序 void display() { static uchar i=0;//靜態變量 P0=0x00; //消隱 switch(i) //送位碼 { case 0: led138a=0;led138b=0;led138c=0; break; case 1: led138a=1;led138b=0;led138c=0; break; case 2: led138a=0;led138b=1;led138c=0; break; case 3: led138a=1;led138b=1;led138c=0; break; case 4: led138a=0;led138b=0;led138c=1; break; case 5: led138a=1;led138b=0;led138c=1; break; case 6: led138a=0;led138b=1;led138c=1; break; case 7: led138a=1;led138b=1;led138c=1; break; } P0=dis_buf; //送段碼 i++; i%=8; } 在上述程序基礎改為鍵控逐位閃爍的數碼管驅動程序 void display() { static uchar i=0;//靜態變量 P0=0x00; //消隱 switch(i) //送位碼 { case 0: led138a=0;led138b=0;led138c=0; break; case 1: led138a=1;led138b=0;led138c=0; break; case 2: led138a=0;led138b=1;led138c=0; break; case 3: led138a=1;led138b=1;led138c=0; break; case 4: led138a=0;led138b=0;led138c=1; break; case 5: led138a=1;led138b=0;led138c=1; break; case 6: led138a=0;led138b=1;led138c=1; break; case 7: led138a=1;led138b=1;led138c=1; break; } if(Twinkle==1 && key==i)//閃爍標志與鍵值條件符合 P0=0xff; //保持消隱狀態 else P0=dis_buf; //送段碼,dis_buf[ ]顯示緩存數組 i++; i%=8; } |
說明:以上兩種方法都是要先在中斷中設置閃爍標志的,閃爍標志是否有效 由是否進入設置狀態的標志決定。所以其實寫一個函數更方便,但是你必須先理解邏輯是什么樣的。 |
首先確定數碼管共陰還是共陽,然后確定位選和段選IO口,再考慮動態數碼管的消影,最后結合定時器完事 |
wulin 發表于 2019-12-29 07:09 大佬能說的再詳細一點嗎,看的有點懵= = |
樓主只要搞清楚數碼管在什么條件下可以點亮,什么條件下不亮,再按0.5秒間隔交替提供這兩個條件不就成了?如果對閃動周期要求精確當然使用定時器中斷為佳。 |
寫兩個顯示函數,把它們分開來顯示 |