📄 复件 (3) main.asm
字号:
;写入DS18B20(有具体的时序要求)
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ;总线低位,开始写入
MOV R3,#6
DJNZ R3,$ ;保持16微秒以上
RRC A ;把字节DATA分成8个BIT环移给C
MOV DQ, C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DQ ;释放总线
RET
;―――――――――― 读出DS18B20子程序 ―――――――――――
;将温度值从DS18B20中读出(有具体的时序要求)
READ_1820:
MOV R4,#4
MOV R1,#TEMPL ;存入25H、26H、27H、28H
RE0:
MOV R2,#8 ;数据一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ ;读前总线保持为低位
NOP
NOP
NOP
SETB DQ ;总线释放
;―――――――――――――
MOV R3,#9
DJNZ R3,$ ;延时18微妙
MOV C, DQ ;从总线读到一个BIT
;―――――――――――――
MOV R3,#23 ;
DJNZ R3,$ ;等待50微秒
RRC A ;把读得的位值环移给A
DJNZ R2,RE1 ;读下一个BIT
MOV @R1,A
INC R1 ; R1内数据递增
DJNZ R4,RE0
RET
;=========== LCD 1602 显示程序 ===========
;初始化设置
SET_LCD:
CLR E
CALL INIT_LCD ;初始化 LCD
CALL STORE_DATA ;将自定义字符存入LCD的CGRAM
RET
;----------- LCD 初始化子程序 -----------
INIT_LCD:
MOV A,#38H ;设置8位、2行、5x7点阵
ACALL WR_COMM ; 调用写指令子程序
ACALL DELAY1 ;调用延时子程序
MOV A,#0CH ;开显示,光标不闪烁
ACALL WR_COMM ;调用写指令子程序 ;
ACALL DELAY1 ;调用延时子程序
MOV A,#01H ;清除 LCD 显示屏
ACALL WR_COMM ;调用写指令子程序 ;
ACALL DELAY1 ;调用延时子程序
RET
;---------- 显示温度标记子程序 -----------
TEMP_BJ:
MOV A, #0CBH ;设定第二行起始地址
ACALL WR_COMM ;调用写指令子程序
MOV DPTR,#BJ ;存代码表
MOV R1 ,#0 ;使指针指到表中第一个码
MOV R0 ,#2 ;取码次数
TP1:
MOV A,R1 ;A为0
MOVC A,@A+DPTR ;取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1值加1
DJNZ R0,TP1 ;判断是否将代码读取完?
RET
;―――――――――――――
BJ: ;代码表
DB 00H, "C"
;―――――――――――――
;----------- 自定义字符子程序 -----------
;将自定义字符写入LCD1602的CGRAM中
STORE_DATA:
MOV A,#40H ;指定CG RAM起始地址
ACALL WR_COMM ;将指令写入LCD
MOV R2,#08H ;图形数据长度8个字节
MOV DPTR,#TAB ;存代码表
MOV R3,#00H ;使指针指到表中第一个码
S_D: MOV A,R3 ;A为0
MOVC A,@A+DPTR ;读取表代码
ACALL WR_DATA ;调用写入数据指令
INC R3 ;R3值加1
DJNZ R2, S_D ;判断是否将代码读取完?
RET ;
;―――――――――――――
TAB: ;代码表
DB 0CH,12H,12H,0CH
DB 00H,00H,00H,00H
;―――――――――――――-
;----------- 显示"OK"信息子程序 ---------
MEU_OK:
MOV DPTR,#M_OK1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
ACALL LCD_PRINT ;LCD显示
MOV DPTR,#M_OK2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
ACALL LCD_PRINT ;LCD显示
RET
;――――――――――――――
M_OK1:
DB " DS18B20 OK ",0
; DB "2",0
M_OK2:
DB " TEMP: ",0
;――――――――――――――
;----------显示"ERROR"信息子程序------―――
MEU_ERROR:
MOV DPTR,#M_ERROR1 ;指针指到显示消息1
MOV A,#1 ;显示在第一行
ACALL LCD_PRINT ;调用菜单显示子程序
MOV DPTR,#M_ERROR2 ;指针指到显示消息1
MOV A,#2 ;显示在第一行
ACALL LCD_PRINT ;调用菜单显示子程序
RET
;---------------
M_ERROR1: ;代码表
DB " DS18B20 ERROR ",0
M_ERROR2:
DB " TEMP: ---- ",0
;---------------
;------――――― 菜单显示子程序 ―――――――-----
;在LCD的第一行或第二行显示字符
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
ACALL WR_COMM ;写入命令
JMP FILL
LINE2:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
ACALL WR_COMM
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
ACALL WR_DATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;---------― LCD显示子程序 ----------
CONV:
MOV A,73H ;加载百位数据
MOV X,#6 ;设置位置
CJNE A,#1,CO1
JMP CO2
CO1:
MOV A,#" "
MOV B,X
ACALL LCDP2
JMP CO3
CO2:
ACALL SHOW_LINE2 ;显示数据
CO3: INC X ;位加1
MOV A,72H ;十位
ACALL SHOW_LINE2 ;显示数据
INC X ;位加1
MOV A, 71H ;个位
ACALL SHOW_LINE2 ;显示数据
INC X ;位加1
MOV A,#'.'
MOV B,X
ACALL LCDP2 ;显示字符
MOV A,70H ;加载小数点位
INC X ;设置位置
ACALL SHOW_LINE2 ;显示数据
RET
;-----―― 显示第二行 -----―――
;在 LCD 的第二行显示数字
SHOW_LINE2:
ADD A,#30H
MOV B,X
ACALL LCDP2
RET
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;放入堆栈
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
ACALL WR_COMM ;写入命令
POP ACC ;由堆栈取出A
ACALL WR_DATA ;写入数据
RET
;-----―――――― 写指令子程序 ――――――――――--
WR_COMM:
MOV P1,A ;写入指令
CLR RS ;RS=0,选择指令寄存器
CLR RW ;RW=0,选择写模式
SETB E ;E=1,允许读/写LCM
ACALL DELAY1 ;延时5MS
CLR E ;E=0,禁止读/写LCM
RET
;---------――― 写数据子程序 ------------
WR_DATA:
MOV P1,A ;写入数据
SETB RS ;RS=1,选择数据寄存器
CLR RW ;RW=0,选择写模式
SETB E ;E=1,允许读/写LCM
ACALL DE ;延时0.5MS
CLR E ;E=0,禁止读/写LCM
ACALL DE ;延时0.5MS
RET
;---------- 清除LCD 的字符-------------
CLR_LINE:
MOV R0,#24 ;设置计数值
CL1: MOV A,#' ' ;载入空格符至LCD
ACALL WR_DATA ;输出字符至LCD
DJNZ R0,CL1 ;判断
RET
;--------------
CLR_LINE1: ;清除LCD的第一行字符
MOV A,#80H ;设置 LCD 的第一行地址
ACALL WR_COMM ;调用写指令子程序
MOV R0,#24 ;设置计数值
C1: MOV A,#' ' ;载入空格符至LCD
ACALL WR_DATA ;输出字符至LCD
DJNZ R0,C1 ;计数结束
RET
;------------- 鸣响子程序------------
SPK_BZ:
MOV R6,#100
BZ2: ACALL DEX1
CPL SPK
DJNZ R6,BZ2
MOV R5,#10
ACALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
;-------------延时子程序-------------
DELAY: ;延时时间为:R5×10MS
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY
RET
;―――――――――――――
DELAY1: ;延时时间为5MS
MOV R6,#25
DL2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
;―――――――――――――
DE:
MOV R7,#250 ;延时时间为0.5MS
DJNZ R7,$
RET
;-----------――
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -