黑夜里打開搖搖棒,在空中快速的左右搖晃,神奇的事情就會出現(xiàn)。如果是干木材上的一點碳火,那么搖晃出來的只會是一條弧線。搖搖棒卻可以讓棒身上的LED燈在劃過空中的適當位置顯示文字和圖形,這一奇跡就是單片機的杰作。單片機愛好者都會在《無線電》雜志或者網(wǎng)上找到關于搖搖棒制作的文章,相信許多熱血沸騰的朋友已經(jīng)著手制作了,最先要解決的問題是買到水銀開關,它并不怎么常見,雖然價格只有1元錢。接下來是要買一塊長條形洞洞板,把8個或16個LED燈并排焊在上面,然后連接LED燈與單片機之間的導線。如果你覺得這樣的制作太麻煩,何不試試精簡設計的搖搖棒,讓制作更簡單,讓外觀更簡潔。單片機、LED、電池、導線、塑料管,這5件東西可以制作什么?下面你將了解到如何用這5件材料制作可顯示漢字的搖搖棒。我為這款設計取名SHOOK16搖搖棒。
制作SHOOK16搖搖棒
SHOOK16搖搖棒制作起來非常簡單,而且它使用的是16個LED燈來顯示,可以輕松顯示中文、英文和圖型。程序設計上考慮了將來的字幕更換,可直接用取模軟件生成你需要的字幕內(nèi)容。整個制作無需PCB板,焊接容易、結(jié)構(gòu)緊湊。只要把貼片LED直接焊接在單片機的引腳上就可以了。而且一般的搖搖棒多采用微動開關來切換字幕,SHOOK16搖搖棒卻另有創(chuàng)新,它采用縱向搖動或敲擊棒身來切換字幕,字幕的數(shù)量完全取決于單片機FLASH大小,SHOOK16采用的單片機是STC12C5A60S2,內(nèi)部具有60K字節(jié)的FLASH空間,而程序本身才使用了2K字節(jié),余下的58K字節(jié)可以任你發(fā)揮。
制作SHOOK16搖搖棒 第1步 準備制作材料。制作SHOOK16搖搖棒所需要的材料少的可憐,通常的制作都不把電池和導線算到材料里面,而在這里算上它們也不過5種。電池、單片機、貼片LED都可以在電子市場或者網(wǎng)上買到,包裝單片機用的塑料管可以在賣芯片的柜臺找到,店家都是把它當垃圾處理的,而我們卻要把它變廢為寶。導線和廢棄的元器件引腳不用準備,相信每一個愛好者的桌面上都有一大堆。當然了,因為制作中使用了單片機,所以你還需要準備電腦和為STC單片機燒寫程序的ISP下載工具。有了這些就可以完成制作,是不是有些不可思議呢?原來電子制作可以這么簡單! 制作SHOO K16搖搖棒所需要的材料
好的制作其實并不需要過多的文字說明,那就發(fā)揮我的強項,用圖解的方式介紹SHOOK16搖搖棒的制作方法。首先來看一下制作SHOOK16搖搖棒所需要的材料清單。

SHOOK16搖搖棒電路原理圖 SHOOK16搖搖棒的電路原理圖也很簡單,主要有單片機、LED、慣性開關和電池。電路圖中標號相同的引腳是連接在一起的,這是網(wǎng)絡標號的表示方法,省去了密密麻麻的連接線。其實在以下的制作過程中并不需要回頭來參考原理圖,因為電路制作是如此簡單,以至于只看實物圖片就可以完成制作。下面我們就按順序?qū)χ谱鞯年P鍵節(jié)點做圖文介紹。 第2步 把單片機第21腳到第40腳一側(cè)的引腳全部用鉗子向外側(cè)彎曲,目的是為了增加單片機的寬度。為什么要這樣做呢?我在設計的時候是使用了電子市場中常見的包裝單片機的塑料管,店家多把空出來的塑料管丟掉。我覺得它們結(jié)實而且透明,應該可以制作些什么,于是就向店家要了一些。在設計搖搖棒的時候突然想到塑料管的妙用,如果用塑料管來做搖搖棒的身體應該是很理想的。可是當我把單片機放進去的時候卻發(fā)現(xiàn)單片機會左右、上下晃蕩,這樣制作出來的搖搖棒會在搖動時叮噹亂響,不知道的還以為是撥浪鼓呢。我也想過用膠帶固定或是用紙?zhí)畛淇障叮墒菚屩谱髯兊美щy,而且也不美觀。所以不是縮小塑料管的寬度就是增加單片機的寬度,于是彎曲一側(cè)引腳就可以最快速地解決問題。那為什么只彎曲第21腳到第40腳一側(cè)的引腳呢?這里面還是有門道的,下文告訴你。

用鉗子彎曲單片機第21腳到第40腳一側(cè)的引腳 彎曲角度以單片機放入塑料管后不易左右移動為止 第3步 制作LED顯示電路。把貼片LED直接焊接在剛剛被彎曲過的單片機引腳上。從單片機的21腳(P2.0)開始焊起,貼片LED的負極連接到21腳一側(cè),后續(xù)的LED負極也都朝向這一側(cè)。16個LED分別焊接在單片機的21腳到37腳之間。焊接LED的時間不要過長,烙鐵尖不到碰到貼片LED的塑料面上,LED的排列的整齊,顯示效果才會更好。
將LED直接焊接在單片機的引腳上,LED負極都朝向單片機的21腳一側(cè)

0805型貼片LED燈
有朋友可能很少接觸這種0805型貼片LED,它的體積比大米粒還要小,亮度卻不比直插式的LED差。這種貼片LED在各大電子市場都有銷售,包裝它們的是一個大圓盤里面的黑色塑料條,好像電影膠片一樣,許多貼片元器件都是這么包裝的。 貼片式LED燈的極性說明
貼片LED和直插LED在使用上并沒有太大區(qū)別,只需要學會識別貼片LED的極性,還有就是在焊接時控制好烙鐵的溫度和焊接時間。貼片LED的兩側(cè)有兩個電極,其中標有綠色小點的一側(cè)為LED的負極。焊接時先將兩個焊盤中的其中一個上錫,用烙鐵熔化焊盤上的錫,同時用攝子輕輕地夾起貼片LED放到對應位置,撤走烙鐵等錫凝固后再用常規(guī)方法焊接另一邊的焊盤。初次焊接的朋友可以在洞洞板上練習,熟悉動作之后再正式焊接。 這種直接焊接的靈感來自于我之前設計的mini1608電子時鐘,當我把LED點陣屏直接焊接在單片機的引腳上時,我就開始對直接焊接的制作著了迷。后來的一段時間里,我總會用身邊可以找到元器件往單片機的引腳上安,其中的某一天就想到了貼片LED。但是當時并沒有想到用這個方法來制作什么東西,于是存入了大腦深處,直到在寫搖搖棒設計方案的時候才又把陳年的創(chuàng)意翻了出來。貼片LED的體積小巧,包裝單片機的塑料管又是透明的,正好可以透出LED的光.如此焊接在硬件結(jié)構(gòu)上確實不錯,可是在電路原理和單片機編程上面是否行得通呢?嗯,這里的關鍵問題就是連續(xù)16個貼片LED所連接的引腳都必須是I/O接口,并且I/O接口在輸出高、低電平時都可以直接驅(qū)動LED發(fā)光。也就是說,單片機I/O接口輸出高電平時至少需要有20mA電流的推動能力。唯一可以做到這一點的也只有I/O接口的推挽工作方式了。恰好STC公司的10、11、12系列的單片機都有這一配置,所以我選擇了手邊常用的STC12C5A60S2來實現(xiàn)。 電路原理沒了問題,那么如何編寫LED的驅(qū)動程序呢?不僅讓LED可以任意點亮,還要能控制它們在搖動過程中顯示漢字和圖形。老實講,我在設計SHOOK16搖搖棒之前并沒有了解過其他搖搖棒的原理和編程方法,所以編寫傳統(tǒng)設計的搖搖棒尚無把握,更何況這種從來沒有試過的驅(qū)動方式了!攻下這一難關確實耗費了不少精力,值得慶幸的是N次調(diào)試之后我成功了,并濾除那些挫折與失敗,僅把成功經(jīng)驗與你分享。 傳統(tǒng)的搖搖棒設計是采用傳統(tǒng)的單片機灌電流方式點亮LED的。現(xiàn)在閉上眼睛,想象一下?lián)u搖棒搖動時的1/4慢鏡頭,在搖搖棒處在最左邊的時候,16個LED燈會顯示字幕數(shù)據(jù)表里最左邊的一列,停留一段時間之后所有LED熄滅,等待搖搖棒的身體搖動到字幕數(shù)據(jù)中下一列的位置,然后顯示、停留、熄滅。如此方法一直顯示到字幕的最右邊。好了,現(xiàn)在取消慢鏡頭,變成正常速度,我們的眼睛便可以看到那星星點點的亮光在浩瀚無際的夜空中形成飄浮的文字,這種顯示方法應該叫做逐列顯示。 逐點掃描形成列數(shù)據(jù),然后再逐列掃描形成字幕

某一I/O 接口為低電平時負極與之連接的LED點亮
SHOOK16搖搖棒在1/4慢鏡頭的時候看起來是逐列顯示的,可是在1/16慢鏡頭的時候卻又有不同。SHOOK16搖搖棒中單片機與LED的連接方式注定讓16個LED不能同時點亮,它們必須逐一點亮。同一時間內(nèi)只能有1個引腳為低電平,其余引腳都必須為高電平。在搖搖棒的身體搖動到某一位置時,這一列的字幕數(shù)據(jù)表會被送入顯示程序,顯示程序要怎么做呢?有點麻煩,它要從上到下依次檢查這一列數(shù)據(jù)中需要點亮的LED。首先檢查最上邊第1個LED,這一列的數(shù)據(jù)中不需要它亮,那所有I/O接口輸出高電平,停留一段時間再檢查第2個LED。嗯,第2個LED需要亮,于是連接第2個LED負極的引腳輸出低電平,其他I/O接口輸出高電平。這時第2個LED正極是高電平,負極是低電平,LED點亮。因為LED 反向不導通,所以第3個LED不亮,其他的LED兩極都是高電平也不亮。點亮一段時間后再依此方法檢查其他LED。在1/16慢鏡頭時,16個LED就好像單片機實驗板上的流水燈程序一樣逐一點亮又逐一熄滅。在1/4 慢鏡頭的時候逐點掃描只是一瞬間的事,所以看起來它們是同時點亮的,因為它們處在不同的速度等級上。 編寫驅(qū)動硬件的工作就只是循環(huán)將17個I/O接口中的某一個變成低電平而已了。解決了貼片LED驅(qū)動的問題卻又產(chǎn)生了新問題,我們?nèi)绾巫寙纹瑱C知道在搖動時哪一時刻搖搖棒的身體處在最左邊呢? 第4步 制作三向慣性開關。將一支廢棄元器件引腳對折并焊接在彈性導線的一端上,彈性導線的另一端焊接在單片機的第20腳(GND)內(nèi)側(cè),注意掌握導線長度。將第4腳(P1.3)引腳向內(nèi)彎曲至芯片底部,形成慣性開關的一個觸點。再用廢棄元器件引腳向上延長第5腳(P1.2),使之形成與第4腳(P1.3)平行且相對的另一個觸點。把第6腳(P1.4)稍微向內(nèi)彎曲一點,使它可以在導線向這一側(cè)撞擊時首先接觸到第6腳,這樣就形成了3個觸點。3個觸點分別對應SHOOK16搖搖棒的三個方向,所以叫三向慣性開關。彈性導線指的是在輕微的外力作用后能夠恢復原狀的普通導線,也可以用細鐵絲代替。調(diào)整彈性導線使之在靜止狀態(tài)時處于上、下兩個觸點的中間。導線懸空的一端應該有一定重量,增加慣性的作用力。 彈性導線的另一端焊接在單片機的第20腳內(nèi)側(cè) 調(diào)整彈性導線使之在靜止狀態(tài)時處于上、下兩個觸點的中間

三向慣性開關分別對應SHOOK16搖搖棒的3個方向 為什么要制作慣性開關呢?其實慣性開關的出現(xiàn)就是為了解決我們前面出現(xiàn)的問題——讓單片機知道搖搖棒身體所處的位置。在判斷棒身位置的設計中,除了為搖搖棒安裝全球衛(wèi)星定位系統(tǒng)(GPS)之外,還可以使用慣性開關。關于慣性還有這樣一個笑話,話說一公共汽車里站著一個美女和一個丑男,司機突然剎車,丑男措手不及向前一擁撞到了美女,美女白了丑男一眼說:“哼,德性!”。丑男不好意思的笑了笑說:“嘿嘿,不是德性,是慣性。”在SHOOK16搖搖棒上有三個美女和一個丑男,雖然這個比喻會讓大家感覺妒忌,但事實就是如此。由焊接在單片機第20腳的彈性導線充當著丑男的角色,經(jīng)過彎曲的第3、4、5腳分別充當著美女的角色。當向右搖晃的時候,由于慣性的作用,丑男(慣性開關柄)就會撞到左邊的美女(慣性開關2),向左搖晃的時候就會撞到右邊的美女(慣性開關1),向前搖晃的時候就會撞到后邊的美女(字幕切換開關)。他們相撞的時候就是速度剛剛開始改變的時候,他們分開的時候也就是速度趨于穩(wěn)定的時候。更多關于慣性的原理解釋可以致電你的中學物理老師。單片機正是利用了這個原理來判斷棒身所處的位置的,其中“慣性開關1”和“慣性開關2”兩個觸點是用來判斷棒身左右位置的,那“字幕切換開關”讓搖搖棒多了一樣功能——前后搖晃或敲擊時切換字幕。所以這種用彈性導線制作的慣性開關不但不需要使用水銀開關,而且還獨具特色。 第5步 制作電源電路。取一段導線將一端焊接在單片機的第20腳(GND)上。導線另一端的接頭處掛上大量的錫,作為電池負極的接觸點。用膠帶固定導線,使之在搖動時不易亂竄。再把一支廢棄的元器件引腳焊接在單片機的第40腳(VCC)上,使引腳與單片機上方的導線平行且相對,它們之間的空隙就用來安放電池。將單片機連同電池一并塞進塑料管中,可用透明膠帶纏繞單片機一圈并在塑料管開口處留出膠帶頭以方便拉出電池和單片機,搖搖棒不用時可拉出電池(或把紙片塞在兩塊電池中間)。最后用透明膠帶把開口處包好。因搖動時的離心力向上,加之電池塞入塑料管時本來就已經(jīng)很緊了,所以單片機及電池不會向下滑落,不需要設計單片機下方固定。 取一段導線將一端焊接在單片機的第20腳上 把一支廢棄的元器件引腳焊接在單片機的第40腳上

將鈕扣電池重疊后放入正、負極接口處

將單片機連同電池一并塞進塑料管中
選擇適合的電池是決定整個設計成敗的又一關鍵。最初的我采用的是3節(jié)5號堿性電池,因為我總覺得堿性電池的能量是很大的,可以讓SHOOK16搖搖棒使用的更長久一些。于是我在單片機的正、負極上引出兩條導線,通過中空塑料管延長到手柄握著的一端,然后把大大的電池盒用膠帶綁在塑料管上。這樣一來既不美觀也不好操作,和前面的巧妙設計形成了很大的反差。必須重新設計電池方案,那怕做出一些犧牲。正巧手邊有前不久為錄制LED點陣屏測試方法視頻節(jié)目時而購買的鈕扣電池,型號是CR2032。我拿出電池往塑料管里塞了塞,雖然有點緊,可以還是可以牢固的塞進去。我大喜!這不正是我想要的樣子嗎?馬上用短一點的導線把兩節(jié)鈕扣電池夾在中間,一并塞進塑料管里。哈哈,那電池、那塑料管、那單片機,就好像老天爺為它們保了媒一樣,那么的般配、適合。不過兩節(jié)CR2032串聯(lián)的電壓是6V,單片機的工作電壓是4.5~5.5V,這樣連接會不會損壞單片機呢?其實并不會,首先電路中存在一定壓降,加之鈕扣電池可提供的電流并不大,二者相配有驚無險。而且因為單片機第21腳到第40腳向外彎曲,使得另外一側(cè)的引腳緊貼塑料管內(nèi)壁,讓引腳內(nèi)側(cè)空出一大塊空間,正好是給慣性開關預留的位置。這也正是我要彎曲單片機第21腳到第40腳一側(cè)引腳的原因。 SHOOK16搖搖棒在夜間的顯示效果
現(xiàn)在,SHOOK16搖搖棒制作完成。在寧靜的夜晚,招集家里的親朋好友坐在沙發(fā)上,關燈,然后把搖搖棒上LED的一面對著他們勻速搖晃,那空中飄浮的文字一定會讓在場的觀眾驚嘆不已。敲擊棒身,“啪”的一聲,字幕改變了內(nèi)容,再敲擊——“啪”——又變了。表演結(jié)束后,打開燈,其中某位觀眾站起身來氣憤的說:“你要換字幕就換嘛,為什么用棒子打我的頭?!”沒錯,SHOOK16搖搖棒可以為你的生活帶來更多精彩和樂趣。
除文章中的提示外,你還需要注意以下幾個問題: 1. 在開始制作之前,先要將SHOOK16搖搖棒的HEX文件燒寫到單片機里。 3. 用STC-ISP軟件燒寫HEX文件時需要有“步驟4”中選擇“內(nèi)部RC振蕩器”。 4. 本制作采用STC12C5A60S2單片機,不可使用其他系列的單片機替代。 5. 如果遇到制作上的問題可以在網(wǎng)上向我提問,我會盡量幫助你解決。
- /*********************************************************************************************
- 程序名: SHOOK16搖搖棒控制程序
- 編寫人: 杜洋
- 編寫時間: 11月12日
- 硬件支持: STC12C5A60S2 內(nèi)部RC時鐘
- 接口說明: 單片機P0、P2側(cè)并行排列16個貼片LED(自P2.0開始(-))
- 修改日志:
- [TEST測試版]
- 1-200911122244 在主函數(shù)寫入簡單程序測試慣性開關是否正常,通過測試并備份。(備)
- 2-200911130112 往返搖動雙重顯示實驗成功,目前已經(jīng)達到搖搖棒功能的基本要求。(備)
- [V1正式版]
- 3-200911130309 加入了3個字幕內(nèi)容,通過敲擊切換字幕。(備)
- 4-200911131910 為網(wǎng)站照片重新設計方案并重定義了IO接口。(備)
- /*********************************************************************************************
- 說明:
- 了解字幕的修改方法,請參考《mini1608字模設計方法》
- V1正式版
- # 硬件制作只需要單片機、LED、電池和導線,制作非常簡單。
- # 采用STC增強型單片機。
- /*********************************************************************************************/
- #include <STC12C5A60S2.H> //單片機頭文件
- unsigned char MENU;
- #define DY_DELAY 5 //設置每一個點顯示的時間長度(1~20)
- sbit KEY1 = P1 ^ 2; //搖動慣性開關
- sbit KEY2 = P1 ^ 3;
- sbit KEY3 = P1 ^ 4; //選擇鍵(大力橫向碰擊觸發(fā))
- sbit LED1 = P0 ^ 3; //LED燈定義,低電平時亮(自上到下)
- sbit LED2 = P0 ^ 4;
- sbit LED3 = P0 ^ 5;
- sbit LED4 = P0 ^ 6;
- sbit LED5 = P0 ^ 7;
- sbit LED6 = P4 ^ 6;
- sbit LED7 = P4 ^ 5;
- sbit LED8 = P4 ^ 4;
- sbit LED9 = P2 ^ 7;
- sbit LED10 = P2 ^ 6;
- sbit LED11 = P2 ^ 5;
- sbit LED12 = P2 ^ 4;
- sbit LED13 = P2 ^ 3;
- sbit LED14 = P2 ^ 2;
- sbit LED15 = P2 ^ 1;
- sbit LED16 = P2 ^ 0;
- /*********************************************************************************************/
- unsigned char code logo[] = { // (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x10,0x0E,0xD0,0x01,0xFF,0xFF,//杜
- 0xFF,0xFF,0x90,0x01,0x10,0x43,0x40,0x40,
- 0x40,0x40,0x40,0x40,0xFF,0x7F,0xFE,0x7F,
- 0x40,0x40,0x60,0x40,0x40,0x60,0x00,0x40,
- 0x00,0x00,0x10,0x04,0xE1,0x78,0x4E,0xFE,//洋
- 0x8C,0x63,0x60,0x00,0x00,0x04,0x49,0x04,
- 0x4A,0x04,0x4E,0x04,0xF8,0xFF,0xFC,0xFF,
- 0x4E,0x04,0x6B,0x04,0x4A,0x06,0x00,0x04,
- 0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,//工
- 0x04,0x40,0x04,0x40,0x04,0x40,0xFC,0x7F,
- 0xFC,0x7F,0x04,0x40,0x04,0x40,0x04,0x40,
- 0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00,
- 0x00,0x00,0x80,0x00,0x60,0x00,0xF8,0xFF,//作
- 0xEF,0x7F,0x06,0x00,0x40,0x00,0x30,0x00,
- 0x1C,0x00,0xFF,0xFF,0xFA,0xFF,0x48,0x04,
- 0x48,0x04,0x68,0x04,0x4C,0x06,0x08,0x04,
- 0x00,0x00,0x08,0x00,0x1C,0x80,0x0E,0x81,//室
- 0x94,0x8B,0xD4,0x89,0x75,0x89,0x37,0xFF,
- 0x16,0xFF,0x34,0x89,0xD4,0x89,0x94,0x8B,
- 0x1C,0x81,0x0E,0xC0,0x04,0x80,0x00,0x00
- };
- /*********************************************************************************************/
- unsigned char code logo1[] = { // “DoYoung” (取碼:從上到下從左到右,縱向8位下高位)
- 0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08, // -D-
- 0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0x00,0x00,0x3C,0x00,0x7C,0x08,0xC0,0x0F, // -Y-
- 0xC0,0x0F,0x7C,0x08,0x3C,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x20,0x00, // -n-
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00,
- 0xC0,0x27,0xE0,0x6F,0x20,0x48,0x20,0x48, // -g-
- 0xC0,0x7F,0xE0,0x3F,0x20,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
- 0x18,0x06,0x3C,0x0E,0x64,0x08,0x44,0x08, // -S-
- 0xC4,0x08,0x9C,0x0F,0x18,0x07,0x00,0x00,
- 0x20,0x00,0x20,0x00,0xF8,0x07,0xFC,0x0F, // -t-
- 0x20,0x08,0x20,0x0C,0x00,0x04,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x80,0x07,0xC0,0x0F,0x60,0x08,0x24,0x08, // -d-
- 0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x20,0x08,0xEC,0x0F, // -i-
- 0xEC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- };
- /*********************************************************************************************/
- unsigned char code logo2[] = { // “與電子愛好者同行” (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x00,0x08,0x00,0x08,0x80,0x08,
- 0xFF,0x09,0xFE,0x08,0x88,0x08,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x0C,0x88,0x48,
- 0x88,0xC0,0x8C,0x7F,0xC8,0x3F,0x80,0x00,
- 0x00,0x00,0x00,0x00,0xF8,0x0F,0xF0,0x07,
- 0x90,0x04,0x90,0x04,0x90,0x04,0xFF,0x7F,
- 0xFE,0xFF,0x90,0xC4,0x90,0xC4,0x90,0xC4,
- 0xF0,0xCF,0xF8,0xC7,0x10,0xF0,0x00,0x40,
- 0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
- 0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x40,
- 0xE2,0xFF,0xF2,0x7F,0x9A,0x00,0x8E,0x00,
- 0x87,0x00,0x82,0x00,0xC0,0x00,0x80,0x00,
- 0x00,0x00,0x40,0x00,0xE0,0x40,0x74,0x20,
- 0xA4,0x98,0xAC,0x8E,0xFA,0x47,0xE2,0x6F,
- 0xBE,0x3A,0xAA,0x12,0xB2,0x3A,0xBF,0x6E,
- 0xAB,0x67,0xE2,0xC2,0x70,0xC0,0x20,0x40,
- 0x00,0x00,0x20,0x80,0x20,0x63,0xF8,0x37,
- 0xFF,0x1C,0x26,0x0F,0xF0,0x7B,0xE0,0x30,
- 0x82,0x00,0x82,0x20,0x82,0x40,0xF2,0xFF,
- 0xEA,0x7F,0x8E,0x00,0xC7,0x00,0x82,0x00,
- 0x00,0x00,0x40,0x04,0x40,0x04,0x44,0x02,
- 0x44,0xFF,0x44,0x7F,0xC4,0x49,0xFF,0x49,
- 0x7F,0x49,0x64,0x49,0x66,0x49,0x54,0xFF,
- 0xD8,0x7F,0x4E,0x01,0x64,0x00,0x40,0x00,
- 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x7F,
- 0x12,0x00,0xD2,0x1F,0x92,0x0F,0x92,0x08,
- 0x92,0x08,0x92,0x1F,0xDA,0x4F,0x92,0x40,
- 0xFE,0xFF,0xFF,0x7F,0x02,0x00,0x00,0x00,
- 0x00,0x00,0x20,0x04,0x10,0x02,0x8C,0xFF,
- 0xE7,0x7F,0x42,0x00,0x00,0x00,0x20,0x00,
- 0x22,0x00,0x22,0x40,0x22,0x40,0xE2,0xFF,
- 0xE2,0x7F,0x23,0x00,0x32,0x00,0x20,0x00
- };
- /*********************************************************************************************
- 函數(shù)名:LED顯示用延時函數(shù)
- 調(diào) 用:delay(?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無
- 結(jié) 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
- 備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
- /*********************************************************************************************/
- void delay (unsigned int a){ // 用于點掃描的延時
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 1; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:毫秒級CPU延時函數(shù)
- 調(diào) 用:DELAY_MS (?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無
- 結(jié) 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
- 備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
- /*********************************************************************************************/
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:關閉所有LED燈(操作硬件)
- 調(diào) 用:DISPLAY_OFF();
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:所有LED燈熄滅
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_OFF (void){
- delay(DY_DELAY);//顯示停留
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:單幀數(shù)據(jù)送入顯示(操作硬件)
- 調(diào) 用:DISPLAY_PIN(?,?);
- 參 數(shù):16位顯示數(shù)據(jù)(下高位)(d:上面8位,e:下面8位)
- 返回值:無
- 結(jié) 果:點亮對應數(shù)據(jù)的LED燈
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){LED1 = 0;}DISPLAY_OFF();
- i = d & 0x02;
- if(i == 0x02){LED2 = 0;}DISPLAY_OFF();
- i = d & 0x04;
- if(i == 0x04){LED3 = 0;}DISPLAY_OFF();
- i = d & 0x08;
- if(i == 0x08){LED4 = 0;}DISPLAY_OFF();
- i = d & 0x10;
- if(i == 0x10){LED5 = 0;}DISPLAY_OFF();
- i = d & 0x20;
- if(i == 0x20){LED6 = 0;}DISPLAY_OFF();
- i = d & 0x40;
- if(i == 0x40){LED7 = 0;}DISPLAY_OFF();
- i = d & 0x80;
- if(i == 0x80){LED8 = 0;}DISPLAY_OFF();
- i = e & 0x01;
- if(i == 0x01){LED9 = 0;}DISPLAY_OFF();
- i = e & 0x02;
- if(i == 0x02){LED10 = 0;}DISPLAY_OFF();
- i = e & 0x04;
- if(i == 0x04){LED11 = 0;}DISPLAY_OFF();
- i = e & 0x08;
- if(i == 0x08){LED12 = 0;}DISPLAY_OFF();
- i = e & 0x10;
- if(i == 0x10){LED13 = 0;}DISPLAY_OFF();
- i = e & 0x20;
- if(i == 0x20){LED14 = 0;}DISPLAY_OFF();
- i = e & 0x40;
- if(i == 0x40){LED15 = 0;}DISPLAY_OFF();
- i = e & 0x80;
- if(i == 0x80){LED16 = 0;}DISPLAY_OFF();
- }
- /*********************************************************************************************
- 函數(shù)名:初始化程序
- 調(diào) 用:init();
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:設計IO接口為強推方式并全部置1
- 備 注:
- /**********************************************************************************************/
- void init (void){
- P4SW = 0xff; //啟動P4接口
- P0M0 = 0xff; //接口設置為強推
- P2M0 = 0xff;
- P4M0 = 0xff;
- P1 = 0xff; //初始IO接口狀態(tài)
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:主函數(shù)
- 調(diào) 用:無
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:程序開始處,無限循環(huán)
- 備 注:
- /**********************************************************************************************/
- void main (void){
- unsigned char a,c;
- init();//初始程序
- while(1){
- if(MENU > 2){
- MENU = 0;
- }
- if(MENU == 0){ //字幕1
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<80;a++){ //這里的“80”是這個字幕需要掃描的列數(shù),修改字幕時必須修改此參數(shù)。
- DISPLAY_PIN (logo[c],logo[c+1]); //“LOGO”是第一個字幕的數(shù)據(jù)表名
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 158;
- for(a=1;a<80;a++){
- DISPLAY_PIN (logo[c],logo[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 1){ //字幕2
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 214;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 2){ //字幕3
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 254;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- }
- }
- /**********************************************************************************************
- /**********************************************************************************************/
- /*************************************************************
- * 杜洋工作室 DoYoung Studio
- * 與電子愛好者同行 www.DoYoung.net
- /*************************************************************/
復制代碼
原理圖:
SHOOK16_SCH.jpg (196.87 KB, 下載次數(shù): 72)
下載附件
2016-6-19 16:19 上傳
單片機源代碼和hex文件下載:
|