仿真:
0.png (77.16 KB, 下載次數: 29)
下載附件
2023-3-26 20:39 上傳
代碼:
RS BIT P2.0
RW BIT P2.1
LCDE BIT P2.2
NUM EQU 30H ;存放AD輸出
TEMP EQU 20H ;存放轉換后的數字
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP ITX0
ORG 0100H
MAIN:
SETB IT0 ;INT0為邊沿出發觸發
SETB EA ;開系統中斷
SETB EX0 ;開INT0中斷
MOV DPTR,#7FF8H ;送入口地址并指向IN0
MOVX @DPTR,A ;啟動A/D轉換,A的值沒有意義
HERE:
LCALL CONVERT
AJMP HERE ;等待中斷
//中斷程序
ITX0:
CLR EX0
PUSH PSW ;保護現場
MOVX A,@DPTR ;讀取轉換后的數字量
MOV R1,A
MOV 30H,R1
; MOV DPTR,#7FF8H ;重新賦值
;LOOP:
; MOVX @DPTR,A ;啟動AD轉換
; POP PSW
RETI ;中斷返回
//數據轉換
CONVERT:
MOV A,NUM
MOV B,#51 ;AD轉換結果轉換成BCD碼
DIV AB
MOV 22H,B ;小數位
ADD A,#25
MOV B,#10
DIV AB
MOV 20H,A
MOV 21H,B
LCALL SHOW_CHAR
LCALL SHOW_NUM
JMP $
//顯示字符串"Temp"
SHOW_CHAR:
MOV R3,#4 ;字符串長度
MOV DPTR,#TAB
CLR A
LCALL INIT_LCDE
MOV R0,#80H ;定位到LCDE的第一行開頭
LCALL WRITE_CODE
LCALL DELAY
L1:
MOVC A,@A+DPTR
MOV R1,A
LCALL WRITE_DATA
LCALL DELAY
INC DPTR
CLR A
DJNZ R3,L1
RET
//將轉換后的數據在LCD上顯示出來
SHOW_NUM:
MOV R3,#3
MOV DPTR,#NUMB ;獲取轉換后的數據的首地址
CLR A
LCALL INIT_LCDE
MOV R0,#85H ;定位到字符串后面
LCALL WRITE_CODE
LCALL DELAY
L2:
MOV R1,#20H
MOV A,@R1
MOVC A,@A+DPTR
MOV R1,A
LCALL WRITE_DATA
LCALL DELAY
INC R1
CLR A
DJNZ R3,L2
;RECOVER:
; SETB EX0 ;顯示完畢再次允許中斷
RET
//雙重延遲函數
DELAY:
MOV R6,#8
W2: MOV R7,#248
W1: DJNZ R7,W1
DJNZ R6,W2
RET
//指令函數,在調用之前,先將指令碼放在R0中
WRITE_CODE:
CLR LCDE ;清除使能信號
CLR RS
CLR RW ;RS=0,RW=0,寫指令
MOV P0,R0 ;送指令
LCALL DELAY
SETB LCDE ;設置使能信號
LCALL DELAY
CLR LCDE
RET
//數據函數,調用之前,先將數據放在R1中
WRITE_DATA:
CLR LCDE ;清除使能信號
SETB RS
CLR RW ;RS=1,RW=0
MOV P0,R1 ;送數據
LCALL DELAY
SETB LCDE ;設置使能信號
LCALL DELAY
CLR LCDE
RET
//初始化函數
INIT_LCDE:
CLR LCDE
MOV R0,#0
MOV R0,#38H ;設置16×2顯示,5×7點陣,8位數據接口
LCALL WRITE_CODE
MOV R0,#0
MOV R0,#0EH ;設置開顯示,不顯示光標
LCALL WRITE_CODE
MOV R0,#0
MOV R0,#06H ;設置寫一個字符后地址指針加一
LCALL WRITE_CODE
MOV R0,#0
MOV R0,#01H ;顯示清零,數據指針清零
LCALL WRITE_CODE
RET
NUMB: DB 30H,31H,31H,33H,34H,35H,36H,38H,39H ;0123456789
TAB: DB "Temp"
END
|