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

📄 aa.asm

📁 数字温度计
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          CALL CONV
          CALL TEMP_COMP
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       ;十六进制-> BCD
        DIV AB           ;B= A % 100
        MOV R4,A         ;R7 = 百位数
        MOV A,#0AH
        XCH A,B
        DIV AB           ;B = A % B
        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         ;显示在第二行
      CALL LCD_PRINT

      MOV A,#0C5H
      CALL TEMP_BJ1
      MOV A,TEMP_TH     ;加载TH数据
      MOV LCD_X,#2     ;设置位置
      CALL SHOW_DIG2H   ;显示数据

      MOV A,#0CEH
      CALL TEMP_BJ1
      MOV A,TEMP_TL     ;加载TL数据
      MOV LCD_X,#12     ;设置位置
      CALL SHOW_DIG2L   ;显示数据
      RET
;--------------------------------------------
M_ALAX1:
  DB   " LOOK ALERT CODE",0
M_ALAX2:
  DB   "TH:      TL:   ",0
;--------------------------------------------
TEMP_BJ1:
      CALL WCOM
      MOV DPTR,#BJ2     ;指针指到显示信息区
      MOV R1,#0
      MOV R0,#2

BBJJ2:   MOV A,R1
      MOVC A,@A+DPTR
      CALL WDATA
      INC R1
      DJNZ R0,BBJJ2
      RET
BJ2:
    DB 00H,"C"

;---------------------------------------------------
SHOW_DIG2H:           ;在 LCD 的第二行显示数字
      MOV B,#100
      DIV AB
      MOV A,#0AH
      XCH A,B
      DIV AB
      ADD A,#30H
      INC LCD_X
      PUSH B
      MOV B,LCD_X
      CALL LCDP2
      POP B
      INC LCD_X
      MOV A,B
      MOV B,LCD_X
      ADD A,#30H
      CALL LCDP2
      RET

SHOW_DIG2L:           ;在 LCD 的第二行显示数字
      MOV B,#100
      DIV AB
      MOV A,#0AH
      XCH A,B
      DIV AB
      ADD A,#30H
      PUSH B
      MOV B,LCD_X
      CALL LCDP2
      POP B
      INC LCD_X
      MOV A,B
      MOV B,LCD_X
      ADD A,#30H
      CALL 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           ;百位
        MOV A,TEMPHC
        ANL A,#0F0H
        CJNE A,#010H,DISPBCD0
        SJMP DISPBCD2

DISPBCD0:   MOV A,TEMPHC
        ANL A,#0FH
        JNZ DISPBCD2           ;十位数是0
        MOV A,TEMPHC
        SWAP A
        ANL A,#0FH
        MOV 73H,#0AH           ;符号位不显示
        MOV 72H,#6DH;十位数显示符号
DISPBCD2:   RET

;==========================================================
; LCD 1602 显示子程序
;==========================================================
CONV:MOV A,72H
      CJNE A,#6DH,CONV4
      MOV A,73H       ;加载百位数据
      MOV LCD_X,#6     ;设置位置
      CJNE A,#1,CONV1
      CALL SHOW_DIG2
CONV1:   MOV A,#" "
      MOV B,LCD_X
      CALL LCDP2
CONV3:  
      inc LCD_X
      mov a,71h       ;个位
      CALL SHOW_DIG2
      inc LCD_X
      MOV A,#'.'
      MOV B,LCD_X
      CALL LCDP2
      MOV A,70h       ;加载小数点位
      INC LCD_X       ;设置位置
      CALL SHOW_DIG2   ;显示数据
      RET
CONV4:
      MOV A,73H       ;加载百位数据
      MOV LCD_X,#6     ;设置位置
      CJNE A,#1,CONV5
      CALL SHOW_DIG2
CONV5:   MOV A,#" "
      MOV B,LCD_X
      CALL LCDP2
     INC LCD_X         ;
      mov a,72h       ;十位
      CALL SHOW_DIG2
      inc LCD_X
      mov a,71h       ;个位
      CALL SHOW_DIG2
      inc LCD_X
      MOV A,#'.'
      MOV B,LCD_X
      CALL LCDP2
      MOV A,70h       ;加载小数点位
      INC LCD_X       ;设置位置
      CALL SHOW_DIG2   ;显示数据
      RET
;---------------------------------
CONV0:MOV A,72H
      CJNE A,#6DH,CONV04
      MOV A,73H       ;加载百位数据
      MOV LCD_X,#6     ;设置位置
      CJNE A,#1,CONV01
      CALL SHOW_DIG2
CONV01:   MOV A,#"-"
      MOV B,LCD_X
      CALL LCDP2
CONV03:  
      inc LCD_X
      mov a,71h       ;个位
      CALL SHOW_DIG2
      inc LCD_X
      MOV A,#'.'
      MOV B,LCD_X
      CALL LCDP2
      MOV A,70h       ;加载小数点位
      INC LCD_X       ;设置位置
      CALL SHOW_DIG2   ;显示数据
      RET
CONV04:
      MOV A,73H       ;加载百位数据
      MOV LCD_X,#6     ;设置位置
      CJNE A,#1,CONV05
      CALL SHOW_DIG2
CONV05:   MOV A,#"-"
      MOV B,LCD_X
      CALL LCDP2
     INC LCD_X         ;
      mov a,72h       ;十位
      CALL SHOW_DIG2
      inc LCD_X
      mov a,71h       ;个位
      CALL SHOW_DIG2
      inc LCD_X
      MOV A,#'.'
      MOV B,LCD_X
      CALL LCDP2
      MOV A,70h       ;加载小数点位
      INC LCD_X       ;设置位置
      CALL SHOW_DIG2   ;显示数据
      RET


;-------------------------------------------------------
SHOW_DIG2:           ;在 LCD 的第二行显示数字
      ADD A,#30H
      MOV B,LCD_X
      CALL LCDP2
      RET
;---------------------------------------------------------
LCDP2:             ;在LCD的第二行显示字符
      PUSH ACC     ;
      MOV A,B       ;设置显示地址
      ADD A,#0C0H   ;设置LCD的第二行地址
      CALL WCOM     ;写入命令
      POP ACC       ;由堆栈取出A
      CALL WDATA     ;写入数据
      RET
;---------------------------------------------------------


SET_LCD:               ;对 LCD 做初始化设置及测试
      CLR LCD_EN
      CALL INIT_LCD   ;初始化 LCD
      CALL STORE_DATA   ;将自定义字符存入LCD的CGRAM
      RET
INIT_LCD:             ;8位I/O控制 LCD 接口初始化
      MOV A,#38H     ;双列显示,字形5*7点阵
      CALL WCOM
      call delay1
      MOV A,#0CH     ;开显示,显示光标,光标不闪烁
      CALL WCOM
      call delay1
      MOV A,#01H     ;清除 LCD 显示屏
      CALL WCOM
      call delay1
      RET
;==================================================
CLR_LINE1:             ;清除LCD的第一行字符
      MOV A,#80H     ;设置 LCD 的第一行地址
      CALL WCOM       ;
      MOV R0,#24     ;设置计数值
  C1:   MOV A,#' '     ;载入空格符至LCD
      CALL WDATA     ;输出字符至LCD
      DJNZ R0,C1     ;计数结束
      RET
;==================================================
LCD_PRINT:     ;在LCD的第一行或第二行显示字符

      CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H     ;设置 LCD 的第一行地址
      CALL WCOM     ;写入命令
      CALL CLR_LINE   ;清除该行字符数据
      MOV A,#80H     ;设置 LCD 的第一行地址
      CALL WCOM     ;写入命令
      JMP FILL

LINE2: MOV A,#0C0H     ;设置 LCD 的第二行地址
      CALL WCOM     ;写入命令
      CALL CLR_LINE   ;清除该行字符数据
      MOV A,#0C0H     ;设置 LCD 的第二行地址
      CALL WCOM
FILL:   CLR A         ;填入字符
      MOVC A,@A+DPTR   ;由消息区取出字符
      CJNE A,#0,LC1   ;判断是否为结束码
      RET
LC1:   CALL WDATA     ;写入数据
      INC DPTR       ;指针加1
      JMP FILL       ;继续填入字符
      RET
;=========================================
CLR_LINE:             ;清除该行 LCD 的字符
      MOV R0,#24
  CL1:   MOV A,#' '
      CALL WDATA
      DJNZ R0,CL1
      RET
  DE:   MOV R7,#250
      DJNZ R7,$
      RET
;============================================
WCOM:               ;以8位控制方式将命令写至LCD
      MOV P1,A     ;写入命令
      CLR LCD_RS     ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
      CLR LCD_RW
      SETB LCD_EN
      ACALL DELAY1     
      CLR LCD_EN
      RET
;=============================================
WDATA:             ;以8位控制方式将数据写至LCD
      MOV P1,A     ;写入数据
      SETB LCD_RS     
      CLR LCD_RW
      SETB LCD_EN     
      CALL DE
      CLR LCD_EN
      CALL DE
      RET
;=============================================
;PRINT A CHAR ON LINE 1
;A=ASC DATA, B=LINE X POS
;==============================================
LCDP1:             ;在LCD的第一行显示字符
      PUSH ACC     ;
      MOV A,B       ;设置显示地址
      ADD A,#80H     ;设置LCD的第一行地址
      CALL WCOM     ;写入命令
      POP ACC       ;由堆栈取出A
      CALL WDATA     ;写入数据
      RET

;==============================================
BEEP_BL:
      MOV R6,#100
BL2:   CALL DEX1
      CPL BEEP
      DJNZ R6,BL2
      MOV R5,#10
      CALL DELAY
      RET
DEX1:   MOV R7,#180
DE2:   NOP
      DJNZ R7,DE2
      RET
DELAY:             ;(R5)*延时10MS
      MOV R6,#50
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
;================================================
      END

⌨️ 快捷键说明

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