可控制的輸出/入
記得以前作者參予筆電的研發團隊,BIOS工程師總會在列表機埠上接上幾顆LED,然後寫輸出程式控制LED的開或關,當作BIOS程式除錯之用。
玩單晶片最重要的思維是必須看到程式的運作狀況,晶片的動作,簡單如LED開關,複雜如控制繼電器,甚至在電腦終端機顯示一段文字等等,單晶片透過輸出或輸入埠,和外界溝通,工程師也才能確定,程式在正常運作。
LED的動作控制
LED是一個電流驅動元件,只要在LED的正極和負極之間通過小於10MA的電流,即可點亮LED。
目前的硬體平台,用的是STC11F04,這顆單晶片指令集同於標準的8051,但在晶片的輸出/入能力上,作了些改良。傳統的8051當作輸出時,只能提供1MA/5V的,11F04輸出能力,則有4種方式可以選擇,分別是低電流(同於傳統8051),高電流(20MA),高阻抗輸入及開源極輸出(OPEN DRAIN)。
輸出入驅動方式選擇,是靠特殊功能暫存器PXM0及PXM1,X的數值代表是那一種輸出入埠。目前的11F04有PORT1及3。現在把上一節程式作一些修改,再看一次。
P1M0 = 0x92
P1M1 = 0x91
LED = P1.0
.AREA SYS (ABS,OVR)
.ORG 0x0
LJMP _RESET
_RESET:
MOV SP,#0xE0
MOV P1M1,#0x0;
MOV P1M0,#0xFF
SETB LED
; CLR LED
_ledon:
LJMP _ledon
; END
此處P1M1放入內容0,P1M0則是0XFF,代表埠1的全部設為大電流輸出,因為LED最大只能流過10MA,所以LED必須串一個330歐姆的電阻限流。
組合語言的註解
組合語言程式中的分號(;),準備告訴編譯程式,忽略掉該行分號之後的全部內容,所以工程師常使用分號,在其後書寫一些文字當作註解。此處分號之後的指令CLR LED,代表將LED這個輸出埠的值設為0,即0V,代表LED正負極兩端沒有電壓差,將關掉LED顯示。
編譯專案中的原始碼,並且將編譯後得到的程式碼下載到單晶片平台,將發現改變程式碼,平台的LED狀態也跟著變化,對於單晶片控制,第一次發現我們有了控制能力。
另外在單晶片冷開機時,P1M1及P1M0暫存器的起始值都為0,代表P1處於低電流輸出,將指令P1M1和P1M0兩行設為註解,(或是將P1M1及P1M0都設為0) LED的亮度將變弱。
單晶片和開關的不同
單晶片目前能作的,儘止於LED的開和關,在加入時間軸的因素之後,能作的事情就完全不同了,比如透過串列埠介面(串列埠也只是一連串0和1的訊號),可以在個人電腦上顯示一段文字,可以控制LED 8字節數碼管,顯示時間或日期等等。
當然,萬事起頭難,現在已經有一個好的開始,我們慢慢玩下去.
留言列表