本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
自己用c写了一个文件,结果运行以后发现LCD不显示数只显示方格……求各位大神指出问题何在??
现在我手上有的是一个汇编写的18b20,但是显示的是“Hi Welcome You\(第一行)Temperature:**℃(第二行)”,我想要把英文都去掉,让后让温度显示到小数点后第四位,应该怎么修改程序???求各位大神指点啊……
汇编的那个程序如下:
TH EQU 38 ;高温报警点
TL EQU 10 ;低温报警点
TEMPH EQU 40H ;读出寄存器5个单元的内容
TEMPL EQU 41H
REG2 EQU 42H
REG3 EQU 43H
REG4 EQU 44H
CONFIG9 EQU 1FH ;9位精度的CONFIG数据
COMFIG10 EQU 3FH ;10位精度的CONFIG数据
CONFIG11 EQU 5FH ;11位精度的CONFIG数据
CONFIG12 EQU 7FH ;12位精度的CONFIG数据
CNT EQU 20H ;中断转换时间
DAT EQU P2.7;数据线
FLAG1 BIT 00H ;测试DS18B20的存在
RS BIT p2.0;液晶控制接口
RW BIT p2.1
E BIT p2.2
;/////////////程序开始///////////////////////////
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIM0 ;定时器0中断
ORG 0030H
MAIN:
MOV SP,#07H ;设定堆栈指针
LCALL RESET ;18b20复位
LCALL INIT ;初始化数码管
MOV TMOD,#21H ;定时器0设置
MOV TH0,#00H
MOV TL0,#00H
SETB ET0
SETB TR0
CALL INITDISP
SETB EA
;CALL LCDDISP
STAR: ;LCALL DISP ;显示温度值
;lcall lcddisp
LJMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:;18B20复位程序,11.0592Mz单周期1US
SETB DAT
NOP
CLR DAT
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
MOV R0,#0FFH
SETB DAT ;然后拉高数据线
TSR2: JNB DAT,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
CLR P1.7 ;检查到DS18B20就点亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P1.0
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------写DS18B20的程序
WRITE: ;18B20写入1个字节子程序
MOV R2,#8
CLR C
WR1: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#23
DJNZ R3,$
SETB DAT
NOP
DJNZ R2,WR1
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;读出温度值的子程序RDTEMP
RDTEMP:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#TEMPL ; 低位存入41H(TEMPL),高位存入40H(TEMPH)
RE00: MOV R2,#8
RE01: CLR C
SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
NOP
SETB DAT
MOV R3,#7
DJNZ R3,$
MOV C,DAT
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVV:;数据处理子程序DIVV
MOV A,41H
MOV B,#16
DIV AB
MOV 74H,A ;将41H的高4位右移4位,存入74H中
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 73H,A;70 ;将41H的低4位X10/16得小数后1位数
MOV A,40H
MOV B,#16
MUL AB
ADD A,74H
MOV B,#10
DIV AB
MOV 72H,B;71 ;将个位数存入72H中
MOV B,#10
DIV AB
MOV 71H,B;72 ;将十位数存入71H中
MOV A,40H
MOV 70H,#10H;73 ;如果为负则符号位为#10H
JB ACC.7,SA
MOV 70H,#00H ;如果为正则符号位为#00H
SA:
RET
;------------------读出转换后的温度值
GET_TEMPER:
SETB DAT ; 定时入口
BCD: LCALL RESET
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE
MOV A,#44H ; 发出温度转换命令
LCALL WRITE
NOP
LCALL DELAY
LCALL DELAY
CBA: CALL RESET
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE
LCALL RDTEMP ;READ_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------延时子程序
DELAY: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
;*************************************************
;液晶显示程序
;*************************************************
INITDISP:
MOV R2,#38H ;0011 1000功能设置:采用8位数据总线,采用双行显示,采用5X7点陈
LCALL WRC ;写入指令
ACALL DELAY11 ;延时程序
MOV R2,#0CH ;0000 1100光标/显示移位:1为显示移位,0为光标移位
ACALL WRC
ACALL DELAY11
MOV R2,#06H ;0000 0110输入模式:1为AC增量模式,0为AC自减模式,显示整体不移动
ACALL WRC
ACALL DELAY11
MOV R2,#01H ;清屏
LCALL WRC
ACALL DELAY11
mov P0,#01h;清屏
call enrw
mov P0,#38h;设为8位,5*7字 型两行
call enrw
mov P0,#0Ch
call enrw
mov P0,#06h
call enrw
mov P0,#80h
call enrw
mov dptr,#yjtab
call rwram
mov P0,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
RET
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入控制指令,数据放在R2中
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRC:
ACALL BUSY
CLR P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2;E使用信号
NOP
CLR P2.2;E使用能下降沿触发
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;忙闲测试
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUSY:
CLR P2.0;RS=0读寄存器 读BF
SETB P2.1; R/W 1为读,0为写
NOP
SETB P2.2;E
NOP
MOV A,P0;读取P0口
JB ACC.7,BUSY
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入数据
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRD:
ACALL BUSY
SETB P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2
NOP
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入N个数据,R2为要显示的数据,R4为显示个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRN:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R2,A
LCALL WRD
DJNZ R4,WRN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY11: MOV R6,#01H
DL0: MOV R7,#250
DL1: NOP
NOP
DJNZ R7,DL1
DJNZ R6,DL0
RET
/*
*/
LCDDISP:
MOV DPTR,#ASCII ;显示第二行数据
MOV R2,#0CCH ;1100 0000 DDRAM地址设置为40h
LCALL WRC
;MOV R4,#16
;LCALL WRN
CLR A
MOV A,71H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD
MOV A,72H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD
RET
/******************/
MOV R1,#71
mov P0,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e
INC R1
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e
RET
enrw:clr rs
clr rw
clr e
call delay
setb e
ret
rwram:mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call rwram2
inc r1
cjne a,#00h,a1
ret
rwram2:mov P0,a
setb rs
clr rw
clr e
call delay
setb e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*DISP: ;数码管显示程序,此程序要注意的是P2.7口的DS18B20数据采集,不能影响此口
MOV R1,#70H
DISP1:
CLR P2.0;第一个数码管亮
SETB P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第二个数码管亮
CLR P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第三个数码管亮
SETB P2.1
CLR P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
ADD A,#80H;点亮小数点
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第四个数码管亮
SETB P2.1
SETB P2.2
CLR P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
RET*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: ;中断处理程序
CLR TR0
CLR EA
MOV A,CNT
INC A
MOV CNT,A
CJNE A,#10,TZ ;刷新时间到一定的时间,就采集温度,注意采集时间不能太快,太快就能时实显示
MOV CNT,#00H
LCALL GET_TEMPER
LCALL DIVV
LCALL LCDDISP
TZ: MOV TH0,#00H ;设定定时器0的参数
MOV TL0,#00H
SETB EA
SETB TR0
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的数据,使用R0,R1,R3
MOV 70H,#00H ;初始化数码管的显示内容
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV CNT,#00H ;刷新时间初始化
LCALL RE_CONFIG ;配置DS18B20程序
LCALL GET_TEMPER ;获得温度值
LCALL DIVV ;温度值进行转换
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLYS: MOV R6,#1 ;延时处理程序
DLYS0:MOV R5,#60
DJNZ R5,$
DJNZ R6,DLYS0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB 0C0H,0F9H, |