天天看點

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

一、間接尋址

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。

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

                                                                                    圖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 後設定位址可以改為想要存取表格資料的位址

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

                                                                                                圖2-1

若改為設定變量的形式     DATA1_L0 DB ?    (如圖2-2)

                                         DATA1_HI DB ?

                                         DATA2_L0 DB ?

                                         DATA2_HI DB ?

則一般來說 預設從[80h]位址開始存。HT66FX0系列特殊寄存器位址為00h~7Fh。

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

                                                                                                 圖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,寫入成功點選上傳即可看到寫入的資料。

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

                                                                                                圖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中。

【合泰ht66fx0單片機學習】1_間接尋址、查表及EEPROM

                                                                                                  圖3-2

繼續閱讀