?? lm92saa1064.asm
字號:
SETB STA
JMP SMB_ISR_END
;SMB_MRDBACK (SMB0STA =50H)
;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送ACK .
ORG SMB_STATE_TABLE+SMB_MRDBACK
MOV RECEIVE_BYTEH, SMB0DAT
CLR AA ;主機(jī)發(fā)NACK(清除AA),下一次中斷來時轉(zhuǎn)入;SMB_MRDBNACK(58H)
CLR SM_BUSY;
JMP SMB_ISR_END
;SMB_MRDBNACK ;(SMB0STA =58H)
;(MR)主收發(fā)器接收數(shù)據(jù)成功;主機(jī)發(fā)送NACK
;讀操作完成。讀數(shù)據(jù)寄存器并發(fā)送STOP
ORG SMB_STATE_TABLE+SMB_MRDBNACK
MOV RECEIVE_BYTEL, SMB0DAT
SETB STO
SETB AA ;主機(jī)發(fā)ACK,為下一次傳輸置位AA
CLR SM_BUSY;
JMP SMB_ISR_END
;狀態(tài)表結(jié)束,處理"SMB_MTDBACK"狀態(tài)碼的程序段。
;對于地址字節(jié)剛發(fā)出的狀態(tài)。通過檢查RW位確定處理方法。
;如果為讀,則轉(zhuǎn)到RW_READ,如果為寫,則將待發(fā)送數(shù)據(jù)裝入SMBODAT。
ADDRESS_SENT:
JB RW,RW_READ
MOV SMB0DAT,TRANSMIT_BYTE ;裝入數(shù)據(jù)
JMP SMB_ISR_END ;中斷返回
;對于地址字節(jié)剛發(fā)出的狀態(tài)。重復(fù)發(fā)送START,啟動存儲器讀操作
RW_READ:
SETB STA ;重復(fù)發(fā)送START
JMP SMB_ISR_END ;中斷返回
;這是一個寫操作,數(shù)據(jù)字節(jié)已發(fā)出。傳輸過程結(jié)束。發(fā)送STOP,釋放總線,中斷返回
DATA_SENT:
SETB STO ;發(fā)送STOP后中斷返回
CLR SM_BUSY ; 釋放 SMBus
JMP SMB_ISR_END ; 中斷返回
;SMBus ISR exit
;恢復(fù)現(xiàn)場,清除SI位,從中斷返回
SMB_ISR_END:
CLR SI
POP DPL
POP DPH
POP ACC
POP PSW
RETI
PORT_Init :
ORL OSCICN,#01H ; 將內(nèi)部振蕩器頻率設(shè)置為4MHz
MOV P0MDOUT,#00 ;P0口為開漏方式
MOV XBR0,#01H ;通過功能選擇開關(guān)將將SDA接P0.0引腳,SCL接P0.1引腳
MOV XBR2 ,#40H; 允許功能選擇開關(guān)和弱上拉
MOV P74OUT ,#0FFH; P4,P5,P6,P7為推拉式輸出
RET
LDELAY:MOV R4,#20H
LDE: ACALL DEL0
DJNZ R4,LDE
RET
DEL0: MOV R7,#0FFH ;延時子程序
TM: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,TM
RET
EXCHG: MOV A,30H ;數(shù)據(jù)格式轉(zhuǎn)換子程序.在30H,31H中存放從LM92讀出的原始數(shù)據(jù).
MOV 20H,#0
MOV C,ACC.7 ;判斷符號位
MOV 7FH,C
RRC A
MOV 5,C
RRC A
MOV 6,C
RRC A
MOV 7,C
ANL A,#1FH
MOV 32H,A
MOV A,31H
RR A
RR A
RR A
ANL A,#1FH
ORL A,20H
MOV 33H,A
MOV C,7FH
JNC G1
MOV A,32H
CPL A
MOV 32H,A
MOV A,33H
CPL A
MOV 33H,A
G1: ACALL DEGREE
MOV A,34H
LCALL EXCH
LCALL SAVEA
LCALL SAVEB
RET
SAVEA: MOV R0,#78H ;把整理后的數(shù)據(jù)保存在78H,79H,7AH,7BH中
MOV R7,#7
MOV R1,#36H
RPSA: MOV A,@R1
ANL A,#0FH
MOV @R0,A
INC R1
INC R0
DJNZ R7,RPSA
MOV A,7DH
MOV 7CH,A
RET
SAVEB: MOV 58H,#20H
MOV R0,#70H
MOV R7,#7
MOV R1,#36H
RPSB: MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R7,RPSB
RET
DEGREE: MOV A,32H
SWAP A
MOV B,A
MOV A,33H
ANL A,#0F0H
SWAP A
ADD A,B
MOV 34H,A
MOV A,33H
ANL A, #8
RR A
RR A
RR A
MOV 35H,A
RET
EXCH : MOV B,#10
DIV AB
MOV 39H,B
MOV B,#10
DIV AB
ADD A,#30H ;37H:百位
MOV 37H,A
MOV A,B
ADD A,#30H
MOV 38H,A ;38H:十位
MOV 36H,#30H
MOV A,39H ;39H:個位
ADD A,#30H
MOV 39H,A
MOV A,35H
MOV 3AH,#2EH ;.5 OR .0
MOV 3BH,#35H
CJNE A,#1,POINT
MOV 3BH,#30H
MOV 3CH,#43H
POINT:MOV C,7FH
JC SIGN
MOV 36H,#2BH ;36H:SIGN
RET
SIGN: MOV 36H,#2DH
RET
SAA1064: ;向SAA1064依次連續(xù)寫入5個數(shù) . 要顯示的數(shù)據(jù)在78H,79H,7AH,7BH中
SETB EA
MOV R1,#50H
MOV DATA_COUNT,#5H ; 裝入待寫數(shù)據(jù)塊的長度
MOV SLA_ADD,#CHIP_B ; 裝入從器件的寫地址
MOV DATA_ADDR ,#0
MOV 78H,#10H
MOV R0,#78H
DISPP: MOV A,@R0
MOV DPTR,#BCD ;查表,找到顯示的數(shù)據(jù)(字型碼)
CLR BYTE_SENT
MOVC A,@A+DPTR
CJNE R0,#7BH,DD
ORL A,#80H
DD: MOV TRANSMIT_BYTE ,A
MOV SUBADR_ADD,DATA_ADDR ; 將存儲器(SAA1064)的地址裝入 SUBADR_ADD
LCALL SEND
INC R0 ;地址加1
INC DATA_ADDR
DJNZ DATA_COUNT,DISPP ; 計數(shù)器減1,不為0則循環(huán)到開始處
CLR EA
RET
BCD: DB 3FH,06H,5BH,4FH ;顯示數(shù)值,0,1,2,3
DB 66H,6DH,7DH,07H ;4,5,6,7
DB 7FH,6FH,77H,7CH ;8,9,A,B
DB 39H,5EH,79H,71H ;C,D,E,F(xiàn)
DB 17H ;COM
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -