單片機自身的?RAM?存儲空間和引腳數(shù)目往往有些不足,當需要在外部拓展不太多的時候,8155?芯片就是首選了。
一片?8155,可以提供?256?字節(jié)的?RAM,3?個并行?IO?接口和一個?14?位的定時器。
8155?的內(nèi)部還集成了地址鎖存器,如果只是需要擴展?8155,就可以省去常用的地址鎖存器?74LS373。
下面,先寫一個使用單片機自身資源來驅(qū)動?16?個?LED?進行流水的程序。
然后,再把它改造為利用?8155?來驅(qū)動。
利用?51?單片機驅(qū)動?16?個?LED?流水燈的匯編語言程序如下。
;=========================================================
;?16?個?LED?接到?P0,?P2。
????ORG???0000H
START:
????MOV???30H,?#254???;片內(nèi)?RAM
????MOV???31H,?#255???;30H?31H?中僅有一個低電平
;-------------------------------------
????MOV???R2,?#16?????;循環(huán)?16?遍
LOOP:
????MOV???P0,?30H?????;輸出到?LED?
????MOV???P2,?31H
????CALL??DLY200MS????;延時
????CALL??SHIFT_L?????;移位
????DJNZ??R2,?LOOP????;循環(huán)?16?遍
????SJMP??START???????;再從頭開始
;-------------------------------------
SHIFT_L:??????????????;16位數(shù)左移一位
????MOV???A,?30H
????RLC???A???????????;高位移入Cy
????MOV???30H,?A
;---------------
????MOV???A,?31H
????RLC???A???????????;Cy移入低位,且高位移入Cy
????MOV???31H,?A
;---------------
????MOV???A,?30H
????MOV???ACC.0,?C????;把Cy(高位)寫入低位
????MOV???30H,?A
;---------------
RET
;-------------------------------------
DLY200MS:?????????????;延時200ms,誤差0us
????MOV???R6,?#197????;
DL0:
????MOV???R7,?#250????;1
????DJNZ??R7,?$???????;2?*?250?=?500
????DJNZ??R7,?$???????;2?*?256?=?512
????DJNZ??R6,?DL0?????;(1?+?500?+?512?+?2)?*?197?=?199955
????MOV???R7,?#19?????;1
????DJNZ??R7,?$???????;2?*?19?=?38
????NOP???????????????;1
RET???????????????????;1?+?199955?+?1?+?38?+?1?+?2?=?199998
;-------------------------------------
END?
;=========================================================
上述程序所對應(yīng)的電路,太簡單了,就不在這里顯示插圖了,讀者可自行畫圖。
當在電路中加入了一片?8155,電路可以如下連接:
圖中,由于使用了?P2.7?和?P2.0?連接到?CS?和?IO/M,所以,8155?的接口地址、存儲器地址分別為:
;I/O?地址:
COMMAND??EQU??7F00H
??PORTA??EQU??7F01H???????
??PORTB??EQU??7F02H???????
??PORTC??EQU??7F03H
TIMER_L??EQU??7F04H
TIMER_H??EQU??7F05H
;MEM?地址:
;7E00H?~?7EFFH
因此,前面的流水燈程序,就要如下修改:
;=========================================================
;51單片機流水燈(16個燈)
;P0,?P2?外接?16?個?LED--改為?PA,?PB
;30H,?31H?片內(nèi)RAM?----改為?片外
????ORG???0000H
START:
????MOV???DPTR,?#COMMAND
????MOV???A,?#00000011B;PA方式0輸出,PB方式0輸出
????MOVX??@DPTR,?A
????INC???DPTR????????;轉(zhuǎn)到PA
????MOV???A,?#00110011B;測試共陽極7段數(shù)碼管
????MOVX??@DPTR,?A
????INC???DPTR????????;轉(zhuǎn)到PB
????MOV???A,?#00001111B
????MOVX??@DPTR,?A
;????MOV???30H,?#254???;--改為?7E30H
;????MOV???31H,?#255???;--改為?7E31H
????MOV???DPTR,?#7E30H
????MOV???A,?#254
????MOVX??@DPTR,?A
????MOV???DPTR,?#7E31H?;片外?RAM?7E30H?7E31H
????MOV???A,?#255??????;中僅有一個低電平
????MOVX??@DPTR,?A
;-------------------------------------
????MOV???R2,?#16?????;循環(huán)?16?遍
LOOP:
;????MOV???P0,?30H?????;輸出到?LED?
;????MOV???P2,?31H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????MOV???DPTR,?#PORTA
????MOVX??@DPTR,?A
????MOV???DPTR,?#7E31H
????MOVX??A,?@DPTR
????MOV???DPTR,?#PORTB
????MOVX??@DPTR,?A
????CALL??DLY200MS????;延時
????CALL??SHIFT_L?????;移位
????DJNZ??R2,?LOOP????;循環(huán)?16?遍
????SJMP??START???????;再從頭開始
;-------------------------------------
SHIFT_L:??????????????;16位數(shù)左移一位
;????MOV???A,?30H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????RLC???A???????????;高位移入Cy
;????MOV???30H,?A
????MOVX??@DPTR,?A
;---------------
;????MOV???A,?31H
????MOV???DPTR,?#7E31H
????MOVX??A,?@DPTR
????RLC???A???????????;Cy移入低位,且高位移入Cy
;????MOV???31H,?A
????MOVX??@DPTR,?A
;---------------
;????MOV???A,?30H
????MOV???DPTR,?#7E30H
????MOVX??A,?@DPTR
????MOV???ACC.0,?C????;把Cy(高位)寫入低位
;????MOV???30H,?A
????MOVX??@DPTR,?A
;---------------
RET
;-------------------------------------
DLY200MS:?????????????;延時200ms,誤差0us
????MOV???R6,?#197????;
DL0:
????MOV???R7,?#250????;1
????DJNZ??R7,?$???????;2?*?250?=?500
????DJNZ??R7,?$???????;2?*?256?=?512
????DJNZ??R6,?DL0?????;(1?+?500?+?512?+?2)?*?197?=?199955
????MOV???R7,?#19?????;1
????DJNZ??R7,?$???????;2?*?19?=?38
????NOP???????????????;1
????RET???????????????;1?+?199955?+?1?+?38?+?1?+?2?=?199998
;-------------------------------------
END?
;=========================================================
原來程序中,凡是對?30H、31H?讀寫的指令,都改成對片外?RAM?讀寫。
凡是對?P0、P2?輸出的指令,都改成對片外?PA、PB?輸出。
這樣寫,程序的長度,將近增加了一倍。呵呵,沒有辦法,只能這樣。
經(jīng)過修改,即可利用?8155?的資源,進行流水燈的實驗了。
顯示的效果,是只有一個?LED?流動發(fā)光,比較簡單,就不在這里插圖了。