📄 lm92saa1064.#1
字号:
SETB STA
JMP SMB_ISR_END
;SMB_MRDBACK (SMB0STA =50H)
;(MR)主收发器接收数据成功;主机发送ACK .
ORG SMB_STATE_TABLE+SMB_MRDBACK
MOV RECEIVE_BYTEH, SMB0DAT
CLR AA ;主机发NACK(清除AA),下一次中断来时转入;SMB_MRDBNACK(58H)
CLR SM_BUSY;
JMP SMB_ISR_END
;SMB_MRDBNACK ;(SMB0STA =58H)
;(MR)主收发器接收数据成功;主机发送NACK
;读操作完成。读数据寄存器并发送STOP
ORG SMB_STATE_TABLE+SMB_MRDBNACK
MOV RECEIVE_BYTEL, SMB0DAT
SETB STO
SETB AA ;主机发ACK,为下一次传输置位AA
CLR SM_BUSY;
JMP SMB_ISR_END
;状态表结束,处理"SMB_MTDBACK"状态码的程序段。
;对于地址字节刚发出的状态。通过检查RW位确定处理方法。
;如果为读,则转到RW_READ,如果为写,则将待发送数据装入SMBODAT。
ADDRESS_SENT:
JB RW,RW_READ
MOV SMB0DAT,TRANSMIT_BYTE ;装入数据
JMP SMB_ISR_END ;中断返回
;对于地址字节刚发出的状态。重复发送START,启动存储器读操作
RW_READ:
SETB STA ;重复发送START
JMP SMB_ISR_END ;中断返回
;这是一个写操作,数据字节已发出。传输过程结束。发送STOP,释放总线,中断返回
DATA_SENT:
SETB STO ;发送STOP后中断返回
CLR SM_BUSY ; 释放 SMBus
JMP SMB_ISR_END ; 中断返回
;SMBus ISR exit
;恢复现场,清除SI位,从中断返回
SMB_ISR_END:
CLR SI
POP DPL
POP DPH
POP ACC
POP PSW
RETI
PORT_Init :
ORL OSCICN,#01H ; 将内部振荡器频率设置为4MHz
MOV P0MDOUT,#00 ;P0口为开漏方式
MOV XBR0,#01H ;通过功能选择开关将将SDA接P0.0引脚,SCL接P0.1引脚
MOV XBR2 ,#40H; 允许功能选择开关和弱上拉
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 ;数据格式转换子程序.在30H,31H中存放从LM92读出的原始数据.
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 ;把整理后的数据保存在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依次连续写入5个数 . 要显示的数据在78H,79H,7AH,7BH中
SETB EA
MOV R1,#50H
MOV DATA_COUNT,#5H ; 装入待写数据块的长度
MOV SLA_ADD,#CHIP_B ; 装入从器件的写地址
MOV DATA_ADDR ,#0
MOV 78H,#10H
MOV R0,#78H
DISPP: MOV A,@R0
MOV DPTR,#BCD ;查表,找到显示的数据(字型码)
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 ; 计数器减1,不为0则循环到开始处
CLR EA
RET
BCD: DB 3FH,06H,5BH,4FH ;显示数值,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
DB 17H ;COM
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -