⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex10-4.asm

📁 ds18b20温度采集及数码管显示
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         RRC A                	;把读得的位值环移给A
         DJNZ R2,RE01         	;读下一位
         MOV @R1,A
         INC R1
         DJNZ R4,RE00
         RET

;************************ 温度值 BCD 码处理子程序 *************************
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#08H
               JZ  TEMPC1         ;温度零上转
               CLR  C
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反加1
               ADD  A,#01H
               MOV  TEMPL,A
               MOV  A,TEMPH
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A
			   MOV   TEMPHC,#0BH		;负温度标志
			   MOV   TEMPFC,#0BH
               SJMP  TEMPC11
TEMPC1:        MOV  TEMPHC,#0AH     	;正温度标志
			   MOV   TEMPFC,#0AH
TEMPC11:       MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH              ;乘0.0625
               MOV  DPTR,#TEMPDOTTAB
               MOVC  A,@A+DPTR
               MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD
               MOV  A,TEMPL             ;整数部分
               ANL  A,#0F0H             ;取出高四位
               SWAP  A
               MOV  TEMPL,A
               MOV  A,TEMPH             ;取出低四位
               ANL  A,#0FH
               SWAP  A
               ORL  A,TEMPL             ;重新组合
               MOV  TEMP_ZH,A
               LCALL  HEX2BCD1
               MOV  TEMPL,A
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R4
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R4,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R4
               MOV  TEMPHC,A
TEMPC12:       RET

;************************ 二-十进制转换子程序 *****************************
HEX2BCD1:     MOV  B,#064H          
              DIV  AB               
              MOV  R4,A             
              MOV  A,#0AH
              XCH  A,B
              DIV  AB               
              SWAP  A
              ORL  A,B
              RET
TEMPDOTTAB:   DB   00H,00H,01H,01H,02H,03H,03H,04H  ; 小数部分码表
         DB   05H,05H,06H,06H,07H,08H,08H,09H

;********************** 查询温度报警值子程序 ***************************
LOOK_ALARM:	  MOV  DPTR,#M_ALAX2   	;指针指到显示信息区
          MOV  A,#2            		;显示在第二行
          LCALL  LCD_PRINT	 
          MOV  A,#0C6H
          LCALL  TEMP_BJ1
          MOV  A,TEMP_TH       		;加载TH数据
          MOV  LCD_X,#3        		;设置显示位置
          LCALL  SHOW_DIG2H     	;显示数据
          MOV  A,#0CEH
          LCALL  TEMP_BJ1
          MOV  A,TEMP_TL       		;加载TL数据
          MOV  LCD_X,#12       		;设置显示位置
          LCALL  SHOW_DIG2L     	;显示数据
          RET
M_ALAX1:  DB   " LOOK ALERT CODE",0
M_ALAX2:  DB   "TH:      TL:    ",0
TEMP_BJ1: LCALL WCOM
          MOV  DPTR,#BJ2      		;指针指到显示信息区
          MOV  R1,#0
          MOV  R0,#2  
BBJJ2:    MOV  A,R1
          MOVC A,@A+DPTR
          LCALL  WDATA
          INC R1
          DJNZ  R0,BBJJ2
          RET
BJ2:      DB  00H,"C"

;************************** LCD显示子程序 **********************************
SHOW_DIG2H: MOV  B,#100
          DIV  AB
          ADD  A,#30H
          PUSH  B
          MOV  B,LCD_X
          LCALL  LCDP2
          POP  B
          MOV  A,#0AH
          XCH  A,B
          DIV  AB
          ADD  A,#30H
          INC  LCD_X
          PUSH  B
          MOV  B,LCD_X
          LCALL  LCDP2
          POP  B
          INC  LCD_X
          MOV  A,B
          MOV  B,LCD_X
          ADD  A,#30H
          LCALL  LCDP2
          RET

SHOW_DIG2L:               
          MOV  B,#100
          DIV  AB
          MOV  A,#0AH
          XCH  A,B
          DIV  AB
          ADD  A,#30H
          PUSH  B
          MOV  B,LCD_X
          LCALL  LCDP2
          POP  B
          INC  LCD_X
          MOV  A,B
          MOV  B,LCD_X
          ADD  A,#30H
          LCALL  LCDP2
          RET

;************************ 显示区 BCD 码温度值刷新子程序 **********************
DISPBCD:      MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
              MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位
              MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,A                 ;百位
DISPBCD2:     RET

;*************************** LCD 显示数据处理子程序 *************************
CONV:     MOV  A,73H         			;加载百位数据
          MOV  LCD_X,#6      			;设置位置
          CJNE A,#1,CONV1
          JMP  CONV2
CONV1:    CJNE A,#0BH,CONV11
		  MOV  A,#"-"		  			;"-"号显示
		  JMP  CONV111
CONV11:   MOV  A,#" "		  			;"+"号不显示
CONV111:  MOV  B,LCD_X
          LCALL  LCDP2
          JMP  CONV3
CONV2:    LCALL  SHOW_DIG2    			;显示数据
CONV3:    INC  LCD_X             
          MOV  A,72H         			;十位
          LCALL  SHOW_DIG2
          INC  LCD_X
          MOV  A,71H         			;个位
          LCALL  SHOW_DIG2
          INC  LCD_X
          MOV  A,#'.'
          MOV  B,LCD_X
          LCALL  LCDP2
          MOV  A,70H         			;加载小数点位
          INC  LCD_X         			;设置显示位置
          LCALL  SHOW_DIG2    			;显示数据
          RET

;*************************** 第二行显示数字子程序 *************************
SHOW_DIG2:ADD  A,#30H					
          MOV  B,LCD_X
          LCALL  LCDP2
          RET

;*************************** 第二行显示数字子程序 *************************
LCDP2:   PUSH  ACC        	
         MOV  A,B         	;设置显示地址
         ADD  A,#0C0H     	;设置LCD的第二行地址
         LCALL  WCOM       ;写入命令
         POP  ACC         	;由堆栈取出A
         LCALL  WDATA      	;写入数据
         RET

;*************************** 对 LCD 做初始化设置及测试*************************
SET_LCD: CLR  LCD_EN      	
         LCALL  INIT_LCD    ;初始化 LCD
         LCALL  STORE_DATA  ;将自定义字符存入LCD的CGRAM
         RET

;****************************** LCD初始化  ***********************************
INIT_LCD: MOV  A,#38H        ;2行显示,字形5*7点阵
          LCALL  WCOM
          LCALL  DELAY1
          MOV  A,#38H
          LCALL  WCOM
          LCALL  DELAY1
          MOV  A,#38H
          LCALL  WCOM
          LCALL  DELAY1
          MOV  A,#0CH        ;开显示,显示光标,光标不闪烁
          LCALL  WCOM
          LCALL  DELAY1
          MOV  A,#01H        ;清除 LCD 显示屏
          LCALL  WCOM
          LCALL  DELAY1
          RET

;***************************** 清除LCD的第一行字符  **************************
CLR_LINE1:MOV  A,#80H        ;设置 LCD 的第一行地址
          LCALL  WCOM        
          MOV  R0,#24        ;设置计数值
    C1:   MOV  A,#' '        ;载入空格符至LCD
          LCALL  WDATA       ;输出字符至LCD
          DJNZ  R0,C1        ;计数结束
          RET
;************************* LCD的第一行或第二行显示字符 **********************
LCD_PRINT:CJNE  A,#1,LINE2  ;判断是否为第一行
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
          LCALL  WCOM        ;写入命令
          LCALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#80H       ;设置 LCD 的第一行地址
          LCALL  WCOM        ;写入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
          LCALL  WCOM        ;写入命令
          LCALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          LCALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由消息区取出字符
          CJNE  A,#0,LC1    ;判断是否为结束码
          RET
  LC1:    LCALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET

;*************************** 清除1行 LCD 的字符 ****************************
CLR_LINE: MOV  R0,#24
CL1:      MOV  A,#' '
          LCALL  WDATA
          DJNZ  R0,CL1
          RET
DE:       MOV  R7,#250
          DJNZ  R7,$
          RET

;**************************** LCD 间接控制方式命令写入 *************************
WCOM:     MOV  P0,A       ;写入命令
          CLR LCD_RS      ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
          CLR LCD_RW
          SETB LCD_EN
          LCALL DELAY1        
          CLR LCD_EN
          RET

;**************************** LCD 间接控制方式数据写入 *************************
WDATA:   MOV  P0,A       ;写入数据
         SETB  LCD_RS        
          CLR  LCD_RW
          SETB  LCD_EN        
          LCALL  DE
          CLR  LCD_EN
          LCALL  DE
          RET

;************************** 在LCD的第一行显示字符 **************************
LCDP1:   PUSH  ACC        
         MOV  A,B         ;设置显示地址
         ADD  A,#80H      ;设置LCD的第一行地址
         LCALL  WCOM       ;写入命令
         POP  ACC         ;由堆栈取出A
         LCALL  WDATA      ;写入数据
         RET

;****************************** 声光报警子程序 *******************************
BEEP_BL: MOV  R6,#100
 BL2:    LCALL  DEX1
         CPL  BEEP
         CPL  RELAY
         DJNZ  R6,BL2
         MOV  R5,#10
         LCALL  DELAY
         RET
 DEX1:   MOV  R7,#180
 DE2:    NOP
         DJNZ  R7,DE2
         RET

;****************************** 延时子程序 *******************************
DELAY:   MOV  R6,#50     
 DL1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DL1
         DJNZ  R5,DELAY
         RET
DELAY1:  MOV  R6,#25      ;延时5毫秒
 DL2:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DL2
         RET
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -