📄 lcdand18b20.asm
字号:
MOVWF COUNT
DECFSZ COUNT,1
GOTO $-1 ;等待60us
BANKSEL TRISA
BSF TRISA,2 ;DQ设置为输入
BCF STATUS,RP0
BTFSC DQ ;数据线是否为低
GOTO RESET_18B20 ;否则继续复位
MOVLW 4H
MOVWF COUNT
DECFSZ COUNT,1 ;延时一段时间后再次判断
GOTO $-1
BTFSC DQ
GOTO RESET_18B20
MOVLW 4BH
MOVWF COUNT
DECFSZ COUNT,1
GOTO $-1
BANKSEL TRISA
BCF TRISA,2 ;DQ设置为输出
BCF STATUS,RP0
RETURN
;*********************写DS18B20子程序****************************
WRITE_18B20
;根据DATASHEET介绍,写数据时应遵照如下规定:
;写数据0时,主控制器把总线拉低至少60us
;写数据1时,主控制器把总线拉低,但必须在15us内释放
MOVLW 8H
MOVWF COUNT ;8位数据
BANKSEL TRISA
BCF TRISA,2
BCF STATUS,RP0
BCF STATUS,C
WRITE_18B20_1
BSF DQ ;先保持DQ为高
MOVLW 5H
MOVWF COUNT1
BCF DQ ;拉低DQ15us
DECFSZ COUNT1,1
GOTO $-1
RRF TEMP,1
BTFSS STATUS,C ;判断写的数据为0还是1
GOTO WRITE_0
BSF DQ ;为1,立即拉高数据线
GOTO WRITE_END
WRITE_0
BCF DQ ;继续保持数据线为低
WRITE_END
MOVLW 0FH
MOVWF COUNT1 ;保持45ms
DECFSZ COUNT1,1
GOTO $-1
BSF DQ ;释放总线
DECFSZ COUNT,1 ;是否写完8位数据
GOTO WRITE_18B20_1
RETURN
;**********************读DS18B20子程序****************************
READ_18B20
;根据DATASHEET介绍,读数据时应遵照如下规定:
;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us
;读数据1时,主控制器把总线拉低后,保持总线状态不变
;主控制器在数据线拉低后15us内读区数据线上的状态。
MOVLW 8H ;一次读8位数据
MOVWF COUNT
READ_18B20_1
BANKSEL TRISA
BCF TRISA,2 ;数据线先设为输出
BCF STATUS,RP0
BCF DQ ;先拉低数据线
MOVLW 1H
MOVWF COUNT1
DECFSZ COUNT1,1 ;拉低总线3us
GOTO $-1
BSF DQ ;释放总线
BANKSEL TRISA
BSF TRISA,2 ;数据线设为输入
BCF STATUS,RP0
MOVLW 2H
MOVWF COUNT1
DECFSZ COUNT1,1 ;延时6ms
GOTO $-1
BSF STATUS,C
BTFSS DQ ;判断数据线状态
BCF STATUS,C
RRF TEMP,1 ;移位到TEMP中
MOVLW 12H
MOVWF COUNT1
DECFSZ COUNT1,1
GOTO $-1 ;读一位数据至少需要60us
DECFSZ COUNT,1 ;是否读完8位
GOTO READ_18B20_1
RETURN
;*******************温度表示形式转换程序**************************
;因为从18B20中读出的温度值是二进制形式,必须把它转换成对象ASCII才能在LCD上显示
;18B20中温度的表示为:S S S S S 2的6次方 2的5次方 2的4次方 2的3次方 2的2次方 。。。。2的负4次方
;结果整数放在38H开始的存储器里,小数部分放在3B开始的单元里
;38H(百位) 39H(十位) 3AH(个位) 3BH(小数点)3CH(十分位) 3DH(百分位) 3EH(千分位) 3FH(万分位)
TEMP_CHANGE
;整数部分
;因为转换后温度值位于两个单元内,所以必须先把它们组合到一个单元内。
;因为最大值为127.9375,所以只需判断结果是否大于100来决定百位上的结果
;用循环减0AH的方法得到十位的值,最后剩下的被减数即为个位的结果
MOVLW 7H
ANDWF TEMP2,1 ;只保留低3位
SWAPF TEMP2,0
MOVWF 3AH ;转存3AH
MOVFW TEMP1
MOVWF TEMP2 ;转存TEMP2
MOVLW 0F0H
ANDWF TEMP2,1 ;清除低4位
SWAPF TEMP2,0 ;高低半字节交换
IORWF 3AH,1 ;组合得到结果的7位整数部分
MOVLW 64H ;计算整数部分百位的结果
SUBWF 3AH,W ; -100
BTFSS STATUS,C
GOTO NEXT0 ;温度小于100
MOVWF 3AH ;减后的结果覆盖原来的数据
MOVLW 1H
MOVWF 38H ;整数部分最高位为1(不可能大于1)
GOTO $+2
NEXT0
CLRF 38H ;温度小于100,最高位为0
CLRF 39H ;计算整数部分十位的结果
MOVLW 0AH ; -10
SUBWF 3AH,1
BTFSS STATUS,C
GOTO NEXT1
INCF 39H,1 ;够减 十位上加1
GOTO $-5
NEXT1
MOVLW 0AH
ADDWF 3AH,1 ;多减一次再加回来,剩下的值即为个位上的值
MOVLW '.'
MOVWF 3BH ;小数点
;小数部分
;取四位精度
;计算方法为从最低位开始依次判断是否为1 ,若为1则分别加上:
;0.0625、0.125、0.25、0.5,而且只有百分位相加时有可能结果大于0AH
CLRF 3CH
CLRF 3DH
CLRF 3EH
CLRF 3FH
BTFSS TEMP1,0
GOTO NEXT2
MOVLW 5H
MOVWF 3FH
MOVLW 2H
MOVWF 3EH
MOVLW 6H
MOVWF 3DH ;万分位
NEXT2
BTFSS TEMP1,1
GOTO NEXT3
MOVLW 5H
ADDWF 3EH,1
MOVLW 2H
ADDWF 3DH,1
MOVLW 1H
MOVWF 3CH ;千分位
NEXT3
BTFSS TEMP1,2
GOTO NEXT5
MOVLW 5H
ADDWF 3DH,1
MOVLW 0AH
SUBWF 3DH,1
BTFSS STATUS,C
GOTO NEXT4
INCF 3CH,1
GOTO $+3
NEXT4
MOVLW 0AH
ADDWF 3DH,1
MOVLW 2H
ADDWF 3CH,1 ;百分位
NEXT5
BTFSS TEMP1,3
GOTO NEXT6
MOVLW 5H
ADDWF 3CH,1 ;十分位
NEXT6
MOVLW 30H ;各位加上30H,转换成对应的ASCII码,以便能在LCD上显示
ADDWF 38H,1
ADDWF 39H,1
ADDWF 3AH,1
ADDWF 3CH,1
ADDWF 3DH,1
ADDWF 3EH,1
ADDWF 3FH,1
RETURN
;**************************延时750ms******************************
DELAY_750MS
MOVLW DQ_DELAY_VALUE2
MOVWF DQ_DELAY2
DELAY_750MS_2
MOVLW DQ_DELAY_VALUE1
MOVWF DQ_DELAY1
DELAY_750MS_1
MOVLW TMR0_VALUE
MOVWF TMR0 ;开启定时器
BTFSS INTCON,T0IF
GOTO $-1
BCF INTCON,T0IF
DECFSZ DQ_DELAY1,1
GOTO DELAY_750MS_1
DECFSZ DQ_DELAY2,1
GOTO DELAY_750MS_2
RETURN
;**************************程序结束******************************
END
; 进入该实战演练的工序流程如下:
; 1.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 2.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 3.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 4.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -