?? ex4-3.asm
字號:
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2單片機寄存器定義文件
;定義ISP/IAP命令
ISP_IAP_BYTE_READ EQU 1H ;字節讀
ISP_IAP_BYTE_PROGRAM EQU 2H ;字節編程
ISP_IAP_SECTOR_ERASE EQU 3H ;扇區擦除
;定義Flash操作等待時間及允許IAP/ISP/EEPROM操作的常數(設置IAP_CONTR)
ENABLE_IAP EQU 82H ;系統工作時鐘<20MHz 時
DEBUG_DATA EQU 5AH ;EEPROM單元的測試值,如正確應等于該值
START_ADDRESS EQU 0000H ;EEPROM測試起始地址
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP, #70H ;堆棧指針指向 70H單元
MOV P1,#0F0H ;演示程序開始工作,P1.0/P1.1/P1.2/P1.3控制的燈亮
LCALL Delay ;延時
MOV P1,#0FH ;演示程序開始工作,P1.7/P1.6/P1.5/P1.4控制的燈亮
LCALL Delay ;延時
;讀出EEPROM測試起始地址單元的內容
MAIN1: MOV DPTR, #START_ADDRESS ;將EEPROM測試起始地址送DPTR數據指針
LCALL Byte_Read
MOV 40H, A ;將EEPROM 的值送40H 單元保存
CJNE A, #DEBUG_DATA, NOT_EQU_DEBUG_DATA ;如果數據比較不正確,就跳轉
;數據是對的,亮P1.7控制的燈,然后在P1口上將EEPROM的數據顯示出來
MOV P1,#01111111B ;如(START_ADDRESS)的值等于#DEBUG_DATA,亮P1.7
LCALL Delay ;延時
MOV A, 40H ;將保存在40H單元中EEPROM 的值從40H單元送累加器A
CPL A ;取反的目的是相應的燈亮代表 1,不亮代表0
MOV P1,A ;數據是對的,送P1顯示
SJMP $ ;數據正確,送P1顯示后,CPU在此無限循環執行此句
NOT_EQU_DEBUG_DATA:
;EEPROM里的數據是錯的,亮P1.3控制的燈,然后在P1 口上將錯誤的數據顯示出來,
;再將該EEPROM所在的扇區整個擦除,將正確的數據寫入后,亮P1.5控制的燈
MOV P1,#11110111B ;如(START_ADDRESS)的值不等于#DEBUG_DATA, 亮P1.3
LCALL Delay ;延時
MOV A, 40H ;將保存在40H單元中EEPROM 的值從40H單元送累加器A
CPL A ;取反的目的是相應的燈亮代表 1,不亮代表0
MOV P1, A ;數據不對,送 P1 顯示
LCALL Delay ;延時
MOV DPTR,#START_ADDRESS ;將EEPROM測試起始地址送DPTR數據指針
LCALL Sector_Erase ;擦除整個扇區
MOV DPTR, #START_ADDRESS;將EEPROM測試起始地址送DPTR數據指針
MOV A, #DEBUG_DATA ;寫入 EEPROM 的數據為 #DEBUG_DATA
LCALL Byte_Program ;字節編程
MOV P1, #11011111B ;將P1.3燈關閉,亮P1.5燈,代表數據已被修改
SJMP $ ;字節編程后,CPU在此無限循環執行此句
;--------- 讀一字節 --------------------------------
;讀一字節,調用前需打開IAP功能,入口:DPTR=字節地址,返回:A=讀出字節
Byte_Read:
MOV IAP_CONTR,#ENABLE_IAP ;打開IAP功能, 設置Flash操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;設置為IAP/ISP字節讀模式命令
MOV IAP_ADDRH, DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL, DPL ;設置目標單元地址的低8位地址
MOV IAP_TRIG, #5AH ;先送5AH,再送A5H到ISP/IAP觸發寄存器
MOV IAP_TRIG, #0A5H ;送完A5H后,ISP/IAP命令立即被觸發啟動
NOP
MOV A, IAP_DATA ;讀出的數據在IAP_DATA單元中,送入累加器A
LCALL IAP_Disable ;關閉IAP功能, 清相關的特殊功能寄存器
RET
;-------------- 字節編程 -------------------------------
;字節編程,調用前需打開IAP功能,入口:DPTR=字節地址, A=需寫入的數據
Byte_Program:
MOV IAP_CONTR, #ENABLE_IAP ;打開IAP功能, 設置 Flash 操作等待時間
MOV IAP_CMD, #ISP_IAP_BYTE_PROGRAM ;設置為IAP/ISP字節編程模式命令
MOV IAP_ADDRH, DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL, DPL ;設置目標單元地址的低8位地址
MOV IAP_DATA, A ;要編程的數據先送進ISP_DATA寄存器
MOV IAP_TRIG, #5AH ;先送5AH,再送A5H到ISP/IAP觸發寄存器
MOV IAP_TRIG, #0A5H ;送完A5H后,ISP/IAP命令立即被觸發啟動
NOP
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器
RET
;--------------- 擦除扇區 ---------------------------------
;擦除扇區, 入口:DPTR =扇區地址
Sector_Erase:
MOV IAP_CONTR, #ENABLE_IAP ;打開IAP功能, 設置 Flash 操作等待時間
MOV IAP_CMD, #03H ;設置為IAP/ISP/EEPROM扇區擦除模式命令
MOV IAP_ADDRH, DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL, DPL ;設置目標單元地址的低8位地址
MOV IAP_TRIG, #5AH ;先送5AH,再送A5H到ISP/IAP觸發寄存器
MOV IAP_TRIG, #0A5H ;送完A5H 后,ISP/IAP命令立即被觸發啟動
NOP
LCALL IAP_Disable ;關閉IAP功能, 清相關的特殊功能寄存器
RET
;--------------- 關閉IAP功能---------------------------------
IAP_Disable: ;關閉IAP功能, 清相關的特殊功能寄存器
;一次連續的IAP操作完成之后建議關閉IAP功能,不需要每次都關
MOV IAP_CONTR, #0 ;關閉 IAP 功能
MOV IAP_CMD, #0 ;清命令寄存器,使命令寄存器無命令,此句可不用
MOV IAP_TRIG, #0 ;清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
MOV IAP_ADDRH, #0FFH ;送地址高字節單元為FFH,指向非EEPROM區
MOV IAP_ADDRL, #0FFH ;送地址低字節單元為FFH,防止誤操作
RET
;--------------- 延時子程序---------------------------------
Delay:
CLR A
MOV R0, A
MOV R1, A
MOV R2, #20H
Delay_Loop:
DJNZ R0, Delay_Loop
DJNZ R1, Delay_Loop
DJNZ R2, Delay_Loop
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -