存儲(chǔ)器(Memory)是計(jì)算機(jī)系統(tǒng)中的記憶設(shè)備,用來(lái)存放程序和數(shù)據(jù)。有了存儲(chǔ)器,計(jì)算機(jī)才有記憶功能,才能保證正常工作。按存儲(chǔ)介質(zhì)分可分為半導(dǎo)體存儲(chǔ)器和磁表面存儲(chǔ)器。按存儲(chǔ)器的讀寫(xiě)功能分可分為只讀存儲(chǔ)器(ROM)和隨機(jī)讀寫(xiě)存儲(chǔ)器(RAM)。
只讀存儲(chǔ)器ROM是一種對(duì)其內(nèi)容只能讀,不能寫(xiě)的存儲(chǔ)器。隨著半導(dǎo)體技術(shù)的發(fā)展,只讀存儲(chǔ)器也根據(jù)不同需要設(shè)計(jì)出不同的種類(lèi)。其中電可擦除只讀存儲(chǔ)器(EEPROM)是一種可用電氣方法在線(xiàn)擦除和再編程的只讀存儲(chǔ)器,它既有RAM可讀可改寫(xiě)的特性,又有非易失性存儲(chǔ)器ROM在掉電后仍能保持所存數(shù)據(jù)的優(yōu)點(diǎn)。因此,EEPROM在單片機(jī)存儲(chǔ)器擴(kuò)展中可以作程序存儲(chǔ)器,也可以用作數(shù)據(jù)存儲(chǔ)器,基于EEPROM存儲(chǔ)器的擴(kuò)展設(shè)計(jì)有十分重要的意義。
建立一個(gè)信息檢索系統(tǒng),每個(gè)序號(hào)對(duì)應(yīng)一個(gè)不同的信息。通過(guò)鍵盤(pán)輸入不同的指令序號(hào),在電腦屏幕上會(huì)輸出想要得到的信息。當(dāng)超出序號(hào)范圍的時(shí)候,屏幕會(huì)顯示錯(cuò)誤。程序還附加一個(gè)進(jìn)一步查詢(xún)的子程序。在輸出信息后,可以對(duì)該信息進(jìn)行查尋,當(dāng)輸入信息與序號(hào)相對(duì)應(yīng)的信息完全相同時(shí),會(huì)在屏幕上顯示NO字樣,然后繼續(xù)進(jìn)行下一次的提示輸入。
存儲(chǔ)芯片的擴(kuò)展包括位擴(kuò)展、字?jǐn)U展和字位同時(shí)擴(kuò)展等三種情況。
1、位擴(kuò)展
位擴(kuò)展是指存儲(chǔ)芯片的字(單元)數(shù)滿(mǎn)足要求而位數(shù)不夠,需對(duì)每個(gè)存儲(chǔ)單元的位數(shù)進(jìn)行擴(kuò)展。
例: 用 1K × 4 的 2114 芯片構(gòu)成 lK × 8 的存儲(chǔ)器系統(tǒng)。
分析: 每個(gè)芯片的容量為 1K ,滿(mǎn)足存儲(chǔ)器系統(tǒng)的容量要求。但由于每個(gè)芯片只能提供 4 位數(shù)據(jù),故需用 2 片這樣的芯片,它們分別提供 4 位數(shù)據(jù)至系統(tǒng)的數(shù)據(jù)總線(xiàn),以滿(mǎn)足存儲(chǔ)器系統(tǒng)的字長(zhǎng)要求。
設(shè)計(jì)要點(diǎn) :
(1) 將每個(gè)芯片的 10 位(1k=2^10)地址線(xiàn)按引腳名稱(chēng)一一并聯(lián),按次序逐根接至系統(tǒng)地址總線(xiàn)的低 10 位。
?。?) 數(shù)據(jù)線(xiàn)則按芯片編號(hào)連接,1 號(hào)芯片的 4 位數(shù)據(jù)線(xiàn)依次接至系統(tǒng)數(shù)據(jù)總線(xiàn)的 D0 -D3 , 2 號(hào)芯片的 4 位數(shù)據(jù)線(xiàn)依次接至系統(tǒng)數(shù)據(jù)總線(xiàn)的 D4 -D7 。
?。?) 兩個(gè)芯片的 端并在一起后接至系統(tǒng)控制總線(xiàn)的存儲(chǔ)器寫(xiě)信號(hào)(如 CPU 為 8086/8088,也可由 和 /M 或 IO / 組合來(lái)承擔(dān))
?。?) 引腳分別并聯(lián)后接至地址譯碼器的輸出,而地址譯碼器的輸入則由系統(tǒng)地址總線(xiàn)的高位來(lái)承擔(dān)。 當(dāng)存儲(chǔ)器工作時(shí),系統(tǒng)根據(jù)高位地址的譯碼同時(shí)選中兩個(gè)芯片,而地址碼的低位也同時(shí)到達(dá)每一個(gè)芯片,從而選中它們的同一個(gè)單元。在讀/寫(xiě)信號(hào)的作用下,兩個(gè)芯片的數(shù)據(jù)同時(shí)讀出,送上系統(tǒng)數(shù)據(jù)總線(xiàn),產(chǎn)生一個(gè)字節(jié)的輸出,或者同時(shí)將來(lái)自數(shù)據(jù)總線(xiàn)上的字節(jié)數(shù)據(jù)寫(xiě)入存儲(chǔ)器。。
2 、字?jǐn)U充
字?jǐn)U展用于存儲(chǔ)芯片的位數(shù)滿(mǎn)足要求而字?jǐn)?shù)不夠的情況,是對(duì)存儲(chǔ)單元數(shù)量的擴(kuò)展。
例 : 用 2K × 8 的 2716 A存儲(chǔ)器芯片組成 8K × 8 的存儲(chǔ)器系統(tǒng)
分析:
由于每個(gè)芯片的字長(zhǎng)為 8 位,故滿(mǎn)足存儲(chǔ)器系統(tǒng)的字長(zhǎng)要求。但由于每個(gè)芯片只能提供 2K 個(gè)存儲(chǔ)單元,故需用 4 片這樣的芯片,以滿(mǎn)足存儲(chǔ)器系統(tǒng)的容量要求。
設(shè)計(jì)要點(diǎn) : 同位擴(kuò)充方式相似。
?。?) 先將每個(gè)芯片的 11(2* 2^10) 位地址線(xiàn)按引腳名稱(chēng)一一并聯(lián),然后按次序逐根接至系統(tǒng)地址總線(xiàn)的低 11 位。
?。?) 將每個(gè)芯片的 8 位數(shù)據(jù)線(xiàn)依次接至系統(tǒng)數(shù)據(jù)總線(xiàn)的 D0 -D7 。
?。?) 兩個(gè)芯片的 端并在一起后接至系統(tǒng)控制總線(xiàn)的存儲(chǔ)器讀信號(hào)(這樣連接的原因同位擴(kuò)充方式),
?。?) 它們的 引腳分別接至地址譯碼器的不同輸出,地址譯碼器的輸入則由系統(tǒng)地址總線(xiàn)的高位來(lái)承擔(dān)。 當(dāng)存儲(chǔ)器工作時(shí),根據(jù)高位地址的不同,系統(tǒng)通過(guò)譯碼器分別選中不同的芯片,低位地址碼則同時(shí)到達(dá)每一個(gè)芯片,選中它們的相應(yīng)單元。在讀信號(hào)的作用下,選中芯片的數(shù)據(jù)被讀出,送上系統(tǒng)數(shù)據(jù)總線(xiàn),產(chǎn)生一個(gè)字節(jié)的輸出。
3 、同時(shí)進(jìn)行位擴(kuò)充與字?jǐn)U充
存儲(chǔ)器芯片的字長(zhǎng)和容量均不符合存儲(chǔ)器系統(tǒng)的要求,需要用多片這樣的芯片同時(shí)進(jìn)行位擴(kuò)充和字?jǐn)U充,以滿(mǎn)足系統(tǒng)的要求。
例 : 用 1K × 4 的 2114 芯片組成 2K × 8 的存儲(chǔ)器系統(tǒng)
分析: 由于芯片的字長(zhǎng)為 4 位,因此首先需用采用位擴(kuò)充的方法,用兩片芯片組成 1K × 8 的存儲(chǔ)器。再采用字?jǐn)U充的方法來(lái)擴(kuò)充容量,使用兩組經(jīng)過(guò)上述位擴(kuò)充的芯片組來(lái)完成。
設(shè)計(jì)要點(diǎn) : 每個(gè)芯片的 10 根地址信號(hào)引腳宜接接至系統(tǒng)地址總線(xiàn)的低 10 位,每組兩個(gè)芯片的 4 位數(shù)據(jù)線(xiàn)分別接至系統(tǒng)數(shù)據(jù)總線(xiàn)的高 / 低四位。地址碼的 A 10 、 A 11 經(jīng)譯碼后的輸出,分別作為兩組芯片的片選信號(hào),每個(gè)芯片的 控制端直接接到 CPU 的讀 / 寫(xiě)控制端上,以實(shí)現(xiàn)對(duì)存儲(chǔ)器的讀 / 寫(xiě)控制。
當(dāng)存儲(chǔ)器工作時(shí),根據(jù)高位地址的不同,系統(tǒng)通過(guò)譯碼器分別選中不同的芯片組,低位地址碼則同時(shí)到達(dá)每一個(gè)芯片組,選中它們的相應(yīng)單元。在讀 / 寫(xiě)信號(hào)的作用下,選中芯片組的數(shù)據(jù)被讀出,送上系統(tǒng)數(shù)據(jù)總線(xiàn),產(chǎn)生一個(gè)字節(jié)的輸出,或者將來(lái)自數(shù)據(jù)總線(xiàn)上的字節(jié)數(shù)據(jù)寫(xiě)入芯片組。
嘗試編寫(xiě)了一個(gè)簡(jiǎn)單程序。為與最后的程序作比較,將此程序列出,如下:
DATA SEGMENT
n0 db ‘0000000000000000000000000000000000000000’
n1 db‘1111111111111111111111111111111111111111’
n2 db ‘2222222222222222222222222222222222222222’
n3 db ‘3333333333333333333333333333333333333333’
n4 db ‘4444444444444444444444444444444444444444’
n5 db ‘5555555555555555555555555555555555555555’
n6 db‘6666666666666666666666666666666666666666’
n7 db ‘777’
n8 db ‘888’
Errmsg DB ‘No! Input 0-8! Q or q , Exit $’ ;輸出錯(cuò)誤信息 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;段屬性說(shuō)明
START:
MOV AX,DATA ;初始化DS
MOV DS,AX LOP:
MOV AH,01H ;輸入一個(gè)數(shù)字
INT 21H
CMP AL,‘Q’ ;判斷是否輸入字符與Q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘q’ ;判斷是否輸入字符與q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘0’ ;輸入不在0-8范圍則退出
JB ERR ;小于0跳轉(zhuǎn)
CMP AL,‘8’
JA ERR ;大于8跳轉(zhuǎn)
SUB AL,30H ;計(jì)算字符串的地址
MOV DH,28H ;28H=40
MUL DH
MOV BX,AX ;數(shù)據(jù)放入BX
CALL DISP
JMP LOP ;輸出錯(cuò)誤信息后,繼續(xù)輸入序號(hào)
ERR:
MOV DL,0DH ;輸出提示錯(cuò)誤語(yǔ)句
MOV AH,02
INT 21H
MOV DX,OFFSET Errmsg
MOV AH,9
INT 21H
MOV DL,0DH ;回車(chē)和換行
MOV AH,02
INT 21H
JMP LOP ;返回LOP繼續(xù)輸入序號(hào)
EXIT:
MOV AH,4CH ;返回DOS
INT 21
DISP PROC NEAR
MOV DL,0DH ;回車(chē)換行
MOV AH,02
INT 21H
MOV DL,0AH ;多字符輸入
MOV AH,02
INT 21H
MOV CX,28H ;28H=40 控制循環(huán)次數(shù)即輸出的信息字符個(gè)數(shù)
LOP1:
MOV DL,[BX] ;循環(huán)輸出字符串
MOV AH,02H
INT 21H
INC BX ;BX打印字符
LOOP LOP1
MOV DL,0DH
MOV AH,02
INT 21H
MOV DL,0AH
MOV AH,02
INT 21H
RET
DISP ENDP
CODE ENDS
END START ;源程序結(jié)束
調(diào)試結(jié)果如圖所示:
出現(xiàn)的問(wèn)題有:
問(wèn)題1:開(kāi)始輸入序號(hào)時(shí),只能顯示在屏幕的第一個(gè)空間。
問(wèn)題2:在輸出沒(méi)有寫(xiě)滿(mǎn)40個(gè)字符的字符串時(shí),輸出是亂碼。
問(wèn)題3:按Q或q退出時(shí),還會(huì)顯示一串?dāng)?shù)字再退出。
程序二
在程序一調(diào)試的基礎(chǔ)上,檢查程序發(fā)現(xiàn)一些問(wèn)題,在輸入不是Q或q或0至8的數(shù)字時(shí),沒(méi)有寫(xiě)輸出顯示字符的程序;輸入是應(yīng)該是字符串,因?yàn)橛谢剀?chē)。在此基礎(chǔ)上,繼續(xù)改善設(shè)計(jì)的程序,設(shè)計(jì)出程序二,即最終程序。
輸入一個(gè)序號(hào),首先判斷是否是Q或q。如果是,則直接跳出,結(jié)束程序。如果不是,就在已設(shè)定好的信息庫(kù)中檢索相應(yīng)信息,并將信息顯示在屏幕上,緊接著跳入下一次序號(hào)輸入界面。如果沒(méi)有相應(yīng)的序號(hào)所對(duì)應(yīng)的信息,即超出序號(hào)范圍會(huì)自動(dòng)報(bào)錯(cuò),并跳到下一次序號(hào)輸入界面。
主體部分程序如下:
BEGIN:
CALL CRLF ;回車(chē)換行
LEA DX,MSG ;輸出提示語(yǔ)句Please input a number: MOV AH,09H INT 21H
MOV AH,1 ;輸入序號(hào) INT 21H
CMP AL,‘Q’ ;判斷為?Q?退出 JE EXIT
CMP AL,‘q’ ;判斷為?q?退出 JE EXIT
SUB AL,‘0’ ;小于0跳轉(zhuǎn)ERROR
JB ERROR
CMP AL,8 ;大于9跳轉(zhuǎn)ERROR JA ERROR
MOV BX,OFFSET MSG0 ;取第一個(gè)字符串的首地址 MUL FORTY
ADD BX,AX ;找到相應(yīng)字符串的地址 CALL DISPLAY ;調(diào)用DISPLAY子程序
定義ERROR程序:提示錯(cuò)誤,重新要求輸入序號(hào),再次檢測(cè)。
ERROR:
CALL CRLF ;回車(chē)換行
LEA DX,ERRMSG ;提示錯(cuò)誤語(yǔ)句 MOV AH,09H INT 21H CALL CRLF
JMP BEGIN ;返回BEGIN程序
定義顯示信息程序:將字符信息一個(gè)個(gè)輸出。
DISPLAY PROC NEAR CALL CRLF
LEA DX,MSG9 ;提示語(yǔ)The message is: MOV AH,09H INT 21H
MOV CX,40 ;設(shè)置循環(huán)次數(shù)
DISP1:
MOV DL,[BX] ;輸出字符串 MOV AH,2 INT 21H INC BX LOOP DISP1 CALL CRLF JMP BEGIN CALL CRLF
RET ;返回程序
DISPLAY ENDP
調(diào)試過(guò)程主要由編輯、匯編、鏈接和執(zhí)行等幾個(gè)步驟組成。當(dāng)編輯好匯編語(yǔ)言源程序后,將其保存為.ASM文件。再調(diào)用匯編程序?qū)υ闯绦蜻M(jìn)行翻譯,生成.OBJ的目標(biāo)文件。在匯編過(guò)程中,源程序有錯(cuò)誤則不能生成目標(biāo)文件,經(jīng)過(guò)多次修改最終生成無(wú)錯(cuò)誤目標(biāo)文件。之后,調(diào)用鏈接程序(LINK)將用戶(hù)目標(biāo)程序和庫(kù)文件進(jìn)行鏈接、定位,生成.EXE可執(zhí)行文件。如果剛開(kāi)始可執(zhí)行程序運(yùn)行之后沒(méi)有得到預(yù)想的結(jié)果,又要重新檢查源程序的算法錯(cuò)誤,重新編輯、匯編、鏈接和執(zhí)行,最終得到預(yù)期的結(jié)果。
經(jīng)過(guò)多次調(diào)試、修改、測(cè)試結(jié)果,最后基本符合要求。 調(diào)試最終結(jié)果如圖
評(píng)論