?? th18_93c46.asm
字號:
CS_93C46 BIT P1.0
SK_93C46 BIT P1.1
DI_93C46 BIT P1.2
DO_93C46 BIT P1.3
BIT_CNT DATA 10H ;移位次數
BIT_SEND DATA 11H ;發送Bit數
DATSEND DATA 12H ;待發送數據緩存
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
LCALL ERAL ;把芯片的內容全部擦除
MOV R7,#10H ;讀進10H的內容查看
LCALL READ
MOV A,R5
MOV P0,A ;顯示R5的值
MOV A,R6
MOV P2,A ;顯示R6的值
NOP ;在這里設置斷點,查看讀入內容應為R6=0FFH和R5=0FFH
SJMP $
MOV R7,#10H ;把1234H寫到10H中
MOV R6,#12H
MOV R5,#34H
LCALL WRITE
MOV R6,#00H
MOV R5,#00H ;改變R5、R6的值,以變和后面比較
MOV R7,#10H ;讀進10H的內容查看
LCALL READ
MOV A,R5
MOV P0,A ;顯示R5的值
MOV A,R6
MOV P2,A ;顯示R6的值
NOP ;在這里設置斷點,查看讀入內容應為R6=12H和R5=34H
; SJMP $
MOV R7,#10H ;把10H內容擦除
LCALL ERASE
MOV R7,#10H ;讀進10H的內容查看
LCALL READ
MOV A,R5
MOV P0,A ;顯示R5的值
MOV A,R6
MOV P2,A ;顯示R6的值
NOP ;在這里設置斷點,查看讀入內容應為R6=0FFH和R5=0FFH
; SJMP $
MOV R6,#56H ;把5678H寫到全部內存中
MOV R5,#78H
LCALL WRAL
MOV R6,#00H
MOV R5,#00H ;改變R5、R6的值,以變和后面比較
MOV R7,#10H ;讀進10H的內容查看
LCALL READ
MOV A,R5
MOV P0,A ;顯示R5的值
MOV A,R6
MOV P2,A ;顯示R6的值
NOP ;在這里設置斷點,查看讀入內容應為R6=12H和R5=34H
; SJMP $
;******************************************************************
;名稱:讀指令(READ指令)
;功能:把93C46中R7所指向的內存的資料讀到R6(H),R5(L)
;******************************************************************
READ:
LCALL START_93C46
MOV DATSEND,#06H ;發送讀操作指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7 ;發送寫入地址
MOV BIT_SEND,#06H
LCALL SEND_DATA
SETB DO_93C46 ;準備讀入資料
MOV BIT_CNT,#16
READ1:
SETB SK_93C46 ;產生一個時鐘信號
SETB SK_93C46
CLR SK_93C46
CLR SK_93C46
NOP
MOV C,DO_93C46 ;讀取DO的信息
MOV A,R5 ;移位保存
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
DJNZ BIT_CNT,READ1
LCALL STOP_93C46
RET
;******************************************************************
;名稱:寫指令(WRITE指令)
;功能:把R6(H),R5(L)的資料寫到93C46中R7所指向的內存中
;******************************************************************
WRITE:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#05H ;發送寫入操作指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7 ;發送寫入地址
MOV BIT_SEND,#06H
LCALL SEND_DATA
MOV DATSEND,R6 ;發送寫入資料
MOV BIT_SEND,#08H
LCALL SEND_DATA
MOV DATSEND,R5
MOV BIT_SEND,#08H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名稱:寫全部(WRAL指令)
;功能:把R6(H),R5(L)的資料寫到93C46的全部內存中
;******************************************************************
WRAL:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#11H ;發送寫全部操作指令
MOV BIT_SEND,#05H
LCALL SEND_DATA
MOV DATSEND,#00H
MOV BIT_SEND,#04H
LCALL SEND_DATA
MOV DATSEND,R6 ;發送寫全部資料(高位)
MOV BIT_SEND,#08H
LCALL SEND_DATA
MOV DATSEND,R5 ;發送寫全部資料(低位)
MOV BIT_SEND,#08H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名稱:START_93C46
;功能:片選93C46做好讀/寫資料的準備
;******************************************************************
START_93C46:
SETB DO_93C46
SETB DI_93C46
CLR SK_93C46
SETB CS_93C46
JNB DO_93C46,$ ;查詢器件是否繁忙
SETB SK_93C46
CLR SK_93C46
CLR CS_93C46
CLR SK_93C46
CLR DI_93C46
SETB CS_93C46
RET
;******************************************************************
;名稱:STOP_93C46
;功能:停止對93C46操作
;******************************************************************
STOP_93C46:
CLR SK_93C46
CLR DI_93C46
CLR CS_93C46
SETB DO_93C46
RET
;******************************************************************
;名稱:WEN_93C46(EWEN指令)
;功能:93C46寫允許
;******************************************************************
WEN_93C46:
LCALL START_93C46
MOV DATSEND,#04H ;發送開始位和寫允許操作碼,共3位
MOV BIT_SEND,#03H
LCALL SEND_DATA ;調用發送子程序
MOV DATSEND,#30H ;發送6位的指令操作碼
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
RET
;******************************************************************
;名稱:WDS_93C46(EWDS指令)
;功能:93C46寫禁止
;******************************************************************
WDS_93C46:
LCALL START_93C46
MOV DATSEND,#04H ;發送開始位和寫禁止操作碼,共3位
MOV BIT_SEND,#03H
LCALL SEND_DATA ;調用發送子程序
MOV DATSEND,#00H ;發送6位的指令操作碼
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
RET
;******************************************************************
;名稱:ERASE(ERASE指令)
;功能:擦除93C46中R7所指向的地址的內容
;******************************************************************
ERASE:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#07H ;發送擦除指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名稱:ERAL(ERAL指令)
;功能:擦除93C46所有內容
;******************************************************************
ERAL:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#04H ;發送全部擦除指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,#20H
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名稱:SEND_DATA
;功能:資料發送子程序,把待發送資料DATSEND的低BIT_SEND位送到DI上
;******************************************************************
SEND_DATA:
;因為為了使程序容易讀懂,前面把要發送的內容
;直接送給DATSEND,而現在就要把DATSEND中無用
;的位去掉,把要發送的內容移到最高位來
MOV BIT_CNT,BIT_SEND
MOV A,#08H ;計算要移位的個數
CLR C
SUBB A,BIT_CNT
MOV BIT_CNT,A
JZ SEND_DATA2 ;如果發送的位數為8位,則不用移位,跳轉
MOV A,DATSEND ;把要送出資料的移到DATSEND的最高位
SEND_DATA1:
RL A
DJNZ BIT_CNT,SEND_DATA1
JMP SEND_DATA3
SEND_DATA2:
MOV A,DATSEND ;把要送出的8位資料DATSEND傳給A
;(只有8位資料都要送出時才執行這條指令)
SEND_DATA3:
MOV BIT_CNT,BIT_SEND
SEND_DATA4:
RLC A ;移位元送出BIT_SEND位資料
JC SEND_DATA5
CLR DI_93C46 ;發送0碼
JMP SEND_DATA6
SEND_DATA5:
SETB DI_93C46 ;發送1碼
NOP
NOP
SEND_DATA6:
SETB SK_93C46 ;產生移位元時鐘信號
CLR SK_93C46
DJNZ BIT_CNT,SEND_DATA4
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -