📄 1602.asm
字号:
;******** 1602液晶模块多字符显示程序 ********
;******** 第一行显示“welcme! ********
;******** 第二行显示“www.ourmpu.com” ********
RS EQU P0.7
RW EQU P0.6
E EQU P0.5
;;;;;;;;;;;;;;;;;;;定义温度
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
C_BIT EQU 22H;;XIAO1
D_BIT EQU 23H;;;XIAO2
B1820 BIT P0.3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ZHJ0 EQU 15H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#60H
;;;;;;;;;;;;;;;;wendu
MAIN:
;;;;;;;;;;;;;;;;;;;;;;;
LCALL DELAY ;延时一段时间
MOV P2,#01H ;写指令01H,清屏
LCALL ENABLE
MOV P2,#38H ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
LCALL ENABLE
MOV P2,#0FH; 写指令0FH,显示ON,光标ON,闪烁ON
LCALL ENABLE
MOV P2,#06H ;写指令06H,光标输入方式增量移位
LCALL ENABLE
MOV P2,#80H ;第一行起始字符地址
LCALL ENABLE
MOV DPTR,#TABLE1 ;第一行显示字符表头地址
LCALL DISP ;显示第一行数据
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AA: LCALL GET_TEMPER;调用读温度子程序
;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序
CPL P1.0
;AJMP MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV P2,#0C0H ;第二行起始字符地址
LCALL ENABLE
MOV DPTR,#TAB
LCALL XIANWEN
LJMP AA
; MOV DPTR,#TABLE2 ;第二行显示字符表头地址
; LCALL DISP ;显示第二行数据
; sjmp $
; ;AJMP MAIN ;返回主程序循环
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XIANWEN: ;MOV R1,#16
MOV A,B_BIT
MOVC A,@A+DPTR
LCALL DISP1
NOP
NOP
MOV A,A_BIT
MOVC A,@A+DPTR
LCALL DISP1
NOP
NOP
RET
;-----------------
ENABLE: CLR RS ;写指令子程序(请参照1602LCD使用说明书)
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;-----------------
DISP: MOV R1,#16 ;准备显示一行16个字符
LOOP: MOV A,#00H ;将ACC清零
MOVC A,@A+DPTR ;查表取得要显示的数据
LCALL DISP1 ;写入一个数据
INC DPTR ;数据表指针加1,准备取下一个数据
DJNZ R1,LOOP ;一行没有显示完就继续
RET
;-----------------
DISP1: MOV P2,A ;写1字节数据到显示端口
SETB RS ;写数据时序(请参照1602LCD使用说明书)
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;wenduchuli
; 这是DS18B20复位初始化子程序
INIT_1820:
SETB B1820
NOP
CLR B1820
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB B1820;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB B1820,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
CLR P3.0;检查到DS18B20就点亮P1.7LED
SETB P3.1
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P3.1
SETB P3.0
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB B1820
RET
; 读出转换后的温度值
GET_TEMPER:
SETB B1820
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H
CLR P1.4
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR B1820
MOV R3,#5
DJNZ R3,$
RRC A
MOV B1820,C
MOV R3,#21
DJNZ R3,$
SETB B1820
NOP
DJNZ R2,WR1
SETB B1820
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB B1820
NOP
NOP
CLR B1820
NOP
NOP
NOP
SETB B1820
MOV R3,#8
RE10:
DJNZ R3,RE10
MOV C,B1820
MOV R3,#21
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
display: mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
ret
;1MS延时
D1MS: MOV R7,#80
DJNZ R7,$
RET
;-----------------
DELAY: MOV R7,#200 ;延时子程序
D1: MOV R6,#20
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TABLE1: DB "dang qian wendu: "
;TABLE2: DB " 122252 "
;实验板上的7段数码管0~9数字的共阴显示代码
TAB: DB 030H,031H,032H,033H,034H,035H,036H,037H,038H,039H
;0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
;0 1 2 3 4 5 6 7 8 9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -