一、間接尋址
include HT66F0185.inc
ds .section 'data'
cs .section at 000h 'code'
;間接尋址
MOV A,80h ;将欲清除的存儲器起始位址
MOV MP0,A ;存入MP0(01h)中
MOV A,16 ;設定A=16
LOOP: CLR IAR0 ;清除MP0所指定的存儲器位址
INC MP0 ;MP0加1;指向下一個位址
SDZ ACC ;ACC=ACC-1
JMP LOOP ;若ACC≠0,繼續下一個位址
JMP $ ;死循環 防止堆棧溢出 程式跑飛
官方資料:IAR0(00H):間接尋址寄存器0(Indirect Addressing Register 0),它是8位間接尋址寄存器,結合MP0寄存器完成間接存取資料存儲器(RAM)的工作。在HT66Fx0單片機内部實際上沒有IAR0寄存器,但若指令以IAR0作為操作數時,單片機的動作是将MP0寄存器所存放的内容當做資料存儲器(指的是GPR或SFR)的位址,然後針對該位址内的資料執行指定的運算。
MP0(01H):資料存儲器指針0(Data Memory Pointer 0)。
簡單來講:如圖1-1所示,MP0存儲的内容為位址(藍色框),可以了解為門牌号;IAR0存儲的内容為此位址存儲的資料(紅色框),可以了解為門牌号對應的房子裡的東西,存好門牌号後對IAR0操作就可以對門牌号對應的東西進行操作。
簡化程式:MOV A,80H
MOV MP0,A
INC IAR0
程式舉例說明:如圖1-1所示,以紅色圓圈為例,此時,它的位址為80h,資料内容為00,若要對它進行間接尋址操作,隻需将80H存入MP0,即位址,再對IAR0進行操作就可以對80H這個位址存儲的内容進行操作了,比如INC IAR0,即内容加1,紅色圓圈就會變成01。上訴程式中将80H位址存入MP0,之後CLR IAR0即對80H位址中的内容進行清零操作,INC MP0為MP0中内容加一,即為位址加1,就是下圖中紅色圓圈右移一格的位置,循環16次,對80H~96H中的内容進行清零操作,結果為下圖中紅色框中的紅色00。
圖1-1 RAM資料存儲器
二、查表
include HT66F0185.inc
ds .section 'data'
;查表
DATA1_L0 EQU [83H] ;設定低8位資料存儲位址
DATA1_HI EQU [84H] ;設定高8位資料存儲位址
DATA2_L0 EQU [95H] ;設定低8位資料存儲位址
DATA2_HI EQU [96H] ;設定高8位資料存儲位址
cs .section at 000h 'code'
;查表
MOV A,HIGH TABLE ;取表位址高8位
MOV TBHP,A ;設定TBHP位址
MOV A,LOW TABLE ;取表位址低8位
MOV TBLP,A ;設定TBLP位址
TABRD DATA1_L0 ;讀取資料 低8位
MOV A,TBLH
MOV DATA1_HI,A ;高位資料存至DATA1_HI
INC TBLP ;指向下一位址
TABRD DATA2_L0 ;讀取資料 低8位
MOV A,TBLH
MOV DATA2_HI,A ;高位資料存至DATA2_HI
JMP $
ORG 0700H
TABLE: DC 1234H,3234H,5566H ;資料建表區
TBLP(07h):表格指針低位元組(Table Pointer Low Byte)
TBLH(08h):表格資料讀取高位元組(Table High Bits)
TBHP(09h):表格指針高位元組(Table Pointer High Byte)
程式解讀:DATA1_L0 EQU [83H] ;設定低8位資料存儲位址 (結果如圖2-1)
DATA1_HI EQU [84H] ;設定高8位資料存儲位址
DATA2_L0 EQU [95H] ;設定低8位資料存儲位址
DATA2_HI EQU [96H] ;設定高8位資料存儲位址
EQU 後設定位址可以改為想要存取表格資料的位址
圖2-1
若改為設定變量的形式 DATA1_L0 DB ? (如圖2-2)
DATA1_HI DB ?
DATA2_L0 DB ?
DATA2_HI DB ?
則一般來說 預設從[80h]位址開始存。HT66FX0系列特殊寄存器位址為00h~7Fh。
圖2-2
建表注意一般寫在程式跑不到的地方,如程式末端,若寫在開頭,有可能表内資料會被程式誤認為是寄存器位址而出錯。
查表流程:通過HIGH LOW 僞指令将表格位址取出或者直接寫表格位址,分别存入TBHP、TBLP中,即可開始讀取資料,TABRD讀取的是低8位,高8位存在TBLH中,用寄存器或變量存起來即可讀取到表格資料了。
注意:TBLH是隻讀寄存器,無法用“TABRD[m]”以外的指令更改其值,是以,最後避免在主程式和中斷服務子程式中同時使用查表指令,若無法避免,就先把TBLH的值存好。
三、EEPROM
include HT66F0185.inc
ds .section 'data'
;EEPROM寫
EEPROM_ADRES EQU 00H
EEPROM_DATA DB ?
W_FLAG DB ?
;EEPROM讀
R_FLAG DB ?
READ_ADRES DB ?
cs .section at 000h 'code'
;EEPROM
;寫
MOV A,4
MOV W_FLAG,A
;寫入EEPROM中的位址
MOV A,EEPROM_ADRES
MOV EEA,A
;查表
MOV A,HIGH TAB
MOV TBHP,A
MOV A,LOW TAB
MOV TBLP,A
WRITE: TABRD EEPROM_DATA
;寫入EEPROM中的資料
MOV A,EEPROM_DATA
MOV EED,A
MOV A,40H
MOV MP1,A
MOV A,01H
MOV BP,A
CLR EMI
SET IAR1.3
SET IAR1.2
SET EMI
;輪詢法
BACK:
SZ IAR1.2
JMP BACK
CLR IAR1
CLR BP
INC TBLP
INC EEA
SDZ W_FLAG
JMP WRITE
;讀
;存到RAM裡的位址
MOV A,92H
MOV READ_ADRES,A
MOV A,4
MOV R_FLAG,A
;讀EEPROM資料的位址
MOV A,EEPROM_ADRES
MOV EEA,A
READ: MOV A,040H
MOV MP1,A
MOV A,01H
MOV BP,A
SET IAR1.1
SET IAR1.0
BACK1:
SZ IAR1.0
JMP BACK1
CLR IAR1
CLR BP
;由于要存到RAM1裡,設定BP為01H,即為BANK1,RAM1
MOV A,01H
MOV BP,A
MOV A,READ_ADRES
MOV MP1,A
MOV A,EED
MOV IAR1,A
INC EEA
INC READ_ADRES
SDZ R_FLAG
JMP READ
JMP $
TAB: DC 28H,29H,42H,55H
EEA:位址寄存器 ——要寫\讀的位址
EED:資料寄存器 ——要寫\讀的資料
EEC:控制寄存器 ——控制寫\讀開始
官方資料:該系列單片機的EEPROM 資料存儲器容量最大可達128×8 位。由于映射方式與程式存儲器和資料存儲器不同,是以不能像其它類型的存儲器一樣尋址。使用Bank 0 中的一個位址寄存器EEA和一個資料寄存器EED以及Bank 1 中的一個控制寄存器EEC,可以實作對EEPROM 的單位元組讀寫操作。有三個寄存器控制内部EEPROM 資料存儲器總的操作。位址寄存器EEA、資料寄存器EED 及控制寄存器EEC。EEA 和EED 位于Bank 0 中,它們能像其它特殊功能寄存器一樣直接被通路。EEC 位于Bank 1 中,不能被直接通路,僅能通過MP1 和IAR1 進行間接讀取或寫入。由于EEC 控制寄存器位于Bank 1中的“40H”,在EEC寄存器上的任何操作被執行前,MP1 必須先設為“40H”,BP 被設為“01H”。
程式解讀:
寫資料:EEPROM_ADRES為寫入到EEPROM中的位址存到EEA,通過查表讀取4個資料,依次(寫完一個再寫一個)寫入EEPROM中存入EED,MP1 必須先設為“40H”,BP 被設為“01H”才能對EEC操作,先關閉總中斷,SET IAR1.3 /SET IAR1.2為使能WREN:資料EEPROM 寫使能位 和 使能WR:EEPROM 寫控制位 ,注意:這2位置高使能時,順序不能錯,且調試時要一次性跑過這倆句,不能單步調試這倆句。之後開總中斷,通過輪詢IAR1.2即WR口是否為0判斷是否寫入成功,寫成功後,清一下寄存器,位址加1,判斷下标志位就進行下一次寫資料。如圖3-1,寫入成功點選上傳即可看到寫入的資料。
圖3-1
讀資料:READ_ADRES為讀到RAM1裡的位址,EEPROM_ADRES為要讀取的EEPROM中的資料的位址,MP1 必須先設為“40H”,BP 被設為“01H”才能對EEC操作,先關閉總中斷,SET IAR1.1 /SET IAR1.0為使能RDEN:資料EEPROM 讀使能位和 使能RD:EEPROM 讀控制位 ,注意:這2位置高使能時,順序不能錯,且調試時要一次性跑過這倆句,不能單步調試這倆句。之後開總中斷,通過輪詢IAR1.0即WR口是否為0判斷是否讀取成功,讀成功後,清一下寄存器,由于要存入RAM1(BANK1)中,需先設定BP為01H,之後通過間接尋址(BP為01H時,用MP1和IAR1寄存器)的方式将讀取到的資料(讀取的資料先置于EED中了)存入相應位址,位址加1,判斷下标志位就進行下一次讀資料。如圖3-2,讀取成功的資料存儲到RAM1中。
圖3-2