在串列埠輸出資料
能夠在串列埠輸出文字,其實是很重要的一步,印象中當年微軟的DOS作業系統,就有一個DEBUG程式,讓使用者可以看到,目前記憶體的內容為何。現在8051單晶片系統,作者嘗試作類似的努力,讓使用者可以看到8051系統內的記憶體內容為何。得知記憶體內容,對8051的學習,將帶來很大的幫助。
;*************************************************/
; Used in C as PutWord(int i)
;*************************************************/
.GLOBL _PutWord
_PutWord:
PUSH DPL
MOV DPL,DPH
LCALL _htoa_byte
POP DPL
LCALL _htoa_byte
RET
;*************************************************/
; put Acc with hex on UART port
;*************************************************/
.GLOBL _htoa_byte
_htoa_byte:
MOV A,DPL
PUSH ACC
SWAP A
ANL A,#0XF
LCALL htoa4bit
POP ACC
ANL A,#0XF
; SJMP htoa4bit
htoa4bit:
CJNE A,#10,_htoa1
_htoa1:
JNC _htoa0 ;JAE _htoa0
ORL A,#0X30
MOV DPL,A
SJMP _putchar
_htoa0:
ADD A,#0x37
MOV DPL,A
SJMP _putchar
此處包括兩個常用函式,htoa_byte(unsigned char) 可以將8位元的輸入參數以16進位的方式在串列埠終端機螢幕上顯示,PutWord(unsigned int)則是顯示16位元的資料。
主程式則是修改成如下的方式:
//*********************************************************
// delay program
//*********************************************************
void DelaySub(unsigned int delayno)
{
while (delayno!=0) delayno--;
}
//*********************************************************
// main program
//*********************************************************
void main (void)
{
unsigned char uchr;
Init_UART(); P1M1=0; P1M0=0xFF; /* P1 set as Output */
//for (uchr=0;uchr<0x20;uchr++) { htoa_byte(uchr); putchar(' '); }
for (uchr=0;uchr<0x20;uchr++) {
if ((uchr&0xF)==0) CRLF();
htoa_byte(uchr); putchar(' ');
}
while (1) {
LED=1; DelaySub(0xFFFF); LED=0; DelaySub(0XFFFF);
}
}
其中__code extern putchar(unsigned char i); 在C51中稱為原型,這個程式編載執行後,在終端機螢幕上呈現如下的畫面。
雖然結果是正確的,但看起來不夠專業,如果能改成如下的畫面,看起來會舒服很多。
只要將顯示的程式作局部的小修改,就可以逹到這個效果。
for (uchr=0;uchr<0x20;uchr++) {
if ((uchr&0xF)==0) CRLF();
htoa_byte(uchr); putchar(' ');
}
程式在顯示到第16個資料的時候,進行一次換行的動作。此處想談一下C語言的好處,就這個簡單的資料顯示,如果改成以組合語言寫,應該要多花很多力氣,程式也會長很多,除錯花的力氣應該不會少,還是回到作者先前的論點,只須學組合語言,不要再寫組合語言了。
