仿真:
代码:
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
|