?? 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 + -