回到柳州后,雖然他的工作不是電子技術(shù),但是業(yè)余生活中還是和電機(jī)技術(shù)混在一起。呵呵。早在一年前就在論壇上看見(jiàn)有網(wǎng)友用單片機(jī)做了旋轉(zhuǎn)LED時(shí)鐘,當(dāng)時(shí)就心癢癢的想做一個(gè),但是由于時(shí)間和材料問(wèn)題,一直沒(méi)有做成。這次有了點(diǎn)陣屏的數(shù)據(jù)算法經(jīng)驗(yàn),做LED旋轉(zhuǎn)屏就容易多了。我和張魁分工合作,他負(fù)責(zé)機(jī)械設(shè)計(jì),我負(fù)責(zé)程序編寫(xiě)�?蓜e小看機(jī)械這一塊。難度是相當(dāng)大的,主要處理好旋轉(zhuǎn)時(shí)的平衡和供電就很難了。今天機(jī)械樣本已經(jīng)做出,我們通過(guò)一天的努力,終于讓旋轉(zhuǎn)LED屏顯示出了內(nèi)容。 #include <reg52.h> sbit hall = P2^7;//霍爾信號(hào),低電平unsigned char dang_qian_lie;//當(dāng)前掃描到哪一列 unsigned char wei_fan_zhuan,wei_fz;//P0口位反轉(zhuǎn)臨時(shí)變量 unsigned int pian_yi_liang;//控制走字偏移量 unsigned char code LEDDOT[]={點(diǎn)陣數(shù)據(jù)}; void delay(unsigned time) { while(time--);//延時(shí) } void main(void) { while(1) { while(hall);//等待霍爾信號(hào)變低 dang_qian_lie=0;//當(dāng)前掃描列復(fù)位 pian_yi_liang++;//走屏偏移量+1 if(pian_yi_liang>1245){pian_yi_liang=0;}//判斷掃過(guò)一圈了沒(méi)有,736是圖片寬度 while(dang_qian_lie<=200)//掃描一圈的圖像寬度 { dang_qian_lie++;//當(dāng)前掃描列+1 P3=LEDDOT[dang_qian_lie+pian_yi_liang];//P3口LED數(shù)據(jù)=當(dāng)前列+偏移量 P1=LEDDOT[dang_qian_lie+1245+pian_yi_liang];//P1口數(shù)據(jù)=當(dāng)前列+圖片寬度+偏移量 wei_fz=LEDDOT[dang_qian_lie+2490+pian_yi_liang];//P0口數(shù)據(jù)=當(dāng)前列+圖片寬度X2+偏移 量 wei_fan_zhuan=0;//臨時(shí)變量初始化 if(wei_fz&0x01){wei_fan_zhuan=wei_fan_zhuan|0x80;} if(wei_fz&0x02){wei_fan_zhuan=wei_fan_zhuan|0x40;} if(wei_fz&0x04){wei_fan_zhuan=wei_fan_zhuan|0x20;} if(wei_fz&0x08){wei_fan_zhuan=wei_fan_zhuan|0x10;} if(wei_fz&0x10){wei_fan_zhuan=wei_fan_zhuan|0x08;} if(wei_fz&0x20){wei_fan_zhuan=wei_fan_zhuan|0x04;} if(wei_fz&0x40){wei_fan_zhuan=wei_fan_zhuan|0x02;} if(wei_fz&0x80){wei_fan_zhuan=wei_fan_zhuan|0x01;} P0=wei_fan_zhuan;//數(shù)據(jù)輸出 delay(40);//字體寬度,與旋轉(zhuǎn)速度有關(guān),值越大字越寬 P1=0XFF;//關(guān)閉LED,準(zhǔn)備下一次掃描 P3=0XFF;//關(guān)閉LED,準(zhǔn)備下一次掃描 P0=0XFF;//關(guān)閉LED,準(zhǔn)備下一次掃描 } } }
|
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |