📄 myproj.asm
字号:
DAT BIT P3.7 ;数据通信口
WDLSB DATA 30H ;读出的温度低字节
WDHSB DATA 31H ;读出的温度高字节
TEMP10 DATA 32H ;十位
TEMP01 DATA 33H ;个位
TEMP00 DATA 34H ;小数点
TEMP11 DATA 35H ;十分位
TEMP21 DATA 36H ;百分位
TEMP31 DATA 37H ;千分位
TEMP41 DATA 38H ;万分位
RS bit P2.0
RW bit P2.1
E bit P2.2
ORG 0000H
AJMP MAIN
MAIN:
mov WDLSB,#00h
mov WDHSB,#00h
mov P2,#0ffh
Call InitLCD
mov 34H,#2Eh
mov 31H,#02H
mov 30H,#4Fh
Again:
Call ReadTemp
Call TRANS14
mov R0,#40H
mov R2,#7H
mov R1,#32H
Call WriteStrD
AJMP Again
;取温度
ReadTemp:
LCall RST
mov A,#0cch
LCALL SendBY
mov A,#44h
Lcall SendBY
;MOV R5,#08H ;延时1秒
;LCALL DelaySs
LCall RST
mov A,#0cch
LCALL SendBY
mov A,#0BEh
Lcall SendBY
Lcall ReadBY
RET
;复位子程序
RST:
SETB DAT
NOP
CLR DAT ;发复位脉冲
MOV R7,#250 ;主机持续2×250微秒
LCALL DelayUs
SETB DAT ;主机释放总线,口线改为输入
nop
nop
read_zt:
MOV C,DAT ;接受b20发送的应答
JNC read_ok
mov r7,#20 ;延时40微秒后再读一次
LCALL DelayUs
djnz r4,read_zt ;最多读三次
read_ok:
mov R7,#100
LCALL DelayMs ;等待200US以后,再去做其它动作
MOV R4,#04H
SETB DAT
RET
SendBY: ;大概微480微秒
mov R3,#8
clr C
SendBit:
clr Dat
MOV R7,#4
LCALL DelayUs
RRC A
mov DAT,C
mov R7,#30 ;30*2微秒
LCALL DelayUs
SETB DAT
DJNZ R3,SendBit
ret
ReadBY: ;大概为一毫秒
mov R6,#2
clr C
read_again:
mov r3,#8
mov WDLSB,A
ReadBit:
setb Dat
Nop
Clr Dat
nop
setb Dat
mov r7,#5
lcall DelayUs ;延时12微秒
mov C,Dat
RRC A
mov R7,#30 ;60微秒
LCALL DelayUs
DJNZ R3,ReadBit
DJNZ R6,read_again
mov WDHSB,A
RET
TRANS12:
MOV A,WDLSB
ANL A,#0F0H
MOV 3AH,A ;取低字节高四位
MOV A,WDHSB
ANL A,#0FH ;取高字节低四位
ORL A,3AH ;相或结合
SWAP A ;高低位交换(低字节高四位在后,高字节低四位在前.整数部分)
MOV B,#10
DIV AB ;除10,分别给不同的显示。
MOV 32H,A ;高位存在R_8,十位数
MOV A,B
MOV 33H,A ;低位存在R_9 个位数
MOV A,WDLSB
ANL A,#0FH ;取低字节低四位(小数位)
MOV B,#2 ;只要取一位小数,所以最后一位舍去;
DIV AB
MOV 35H,A ;小数位是存到R_10
RET
;数据转换
TRANS14:
MOV A,30H
ANL A,#0F0H
MOV 3AH,A ;取低字节高四位
MOV A,31H
ANL A,#07H ;取高字节低三位
ORL A,3AH ;相或结合
SWAP A ;高低位交换(低字节高四位在后,高字节低四位在前.整数部分)
MOV B,#10
DIV AB ;除10,分别给不同的显示。
Add A,#30H
mov TEMP10,A ;高位存在R_8,十位数
MOV A,B
ADD A,#30H
MOV TEMP01,A
;计算小数位
MOV A,30H
ANL A,#0FH
mov B,#0AH
MUL AB
MOV 3BH,A
ANL A,#0F0H
swap A
ADD A,#30H
MOV TEMP11,A ;小数位是存到R_10
MOV A,3BH
ANL A,#0FH
mov B,#0AH
MUL AB
MOV 3BH,A
ANL A,#0F0H
swap A
ADD A,#30H
MOV TEMP21,A ;小数位是存到R_10
MOV A,3BH
ANL A,#0FH
mov B,#0AH
MUL AB
mov 3BH,A
ANL A,#0F0H
swap A
ADD A,#30H
MOV TEMP31,A ;小数位是存到R_10
MOV A,3BH
ANL A,#0FH
mov B,#0AH
MUL AB
mov 3BH,A
ANL A,#0F0H
swap A
ADD A,#30H
MOV TEMP41,A ;小数位是存到R_10
RET
;初始化LCD
InitLCD:
MOV A,#038H
LCALL EnterI
LCALL LcdBUSY ;判忙
MOV A,#038H ;设置为8总线16*2 5*8点阵
LCALL EnterI
MOV A,#01H ;清屏
LCALL EnterI
MOV A,#06H ;设读写字符时地址加1,且整屏显示不移动
LCALL EnterI
MOV A,#0cH ;开显示,开光标显示,光标和光标所在的字符闪烁
LCALL EnterI
LCALL Delay
ret
;LCD判忙操作
LcdBUSY:
PUSH ACC
CLR RS
SETB RW
TT0:
SETB E
MOV A,P1
CLR E
ANL A,#80H
JNZ TT0
POP ACC
RET
;显示表结构数据 R0位置 DPTR字符首址 R2个数
WriteStrC:
mov R4,#00h
Write:
mov A,R4
movc A,@A+DPTR
mov R3,A
Call WriteByte
inc R0
inc R4
DJNZ R2,Write
ret
;显示内存中数据R0位置 R1源地址 R2个数
WriteStrD:
mov A,@R1
mov R3,A
Call WriteByte
inc R0
inc R1
DJNZ R2,WriteStrD
ret
;R0位置 R3字符
WriteByte: ;送单个字符
mov A,R0
add A,#80H
Call EnterI
mov A,R3
Call EnterD
ret
EnterI: ;送命令
Clr RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
EnterD: ;送数据
SETB RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
;延时子程序固定延时
Delay:
mov r7,#2H
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret
;秒级延时子程序以130050us为单位,最大为130050us
DelaySs:
mov r6,#0ffh
ss:
mov r7,#0ffh
djnz r7,$
djnz r6,ss
djnz r5,DelaySs
ret
;毫秒延时子程序以510us为单位,最大为130050us
DelayMs:
mov r7,#0ffh
djnz r7,$
djnz r6,DelayMs
ret
;微秒延时以2us为单位,最大为510us
DelayUs:
djnz r7,$
ret
DATE: DB 32H,30H,30H,38H,2Dh,30H,37H,2DH,32H,39H
TIME: DB 31H,31H,3AH,31H,31H,3AH,33H,36H,2EH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -