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

📄 lcd2402.asm

📁 51单片机开发入门与典型实例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------------------------
;文件名称:LCD2402.ASM
;程序功能:温度控制器
;--------------------------------        
          TEMP_ZH   EQU   24H    ;实时温度值存放单元
          TEMPL     EQU   25H    ;低温度值存放单元
          TEMPH     EQU   26H    ;高温度值存放单元
          TEMP_TH   EQU   27H    ;高温报警值存放单元
          TEMP_TL   EQU   28H    ;低温报警值存放单元
          TEMPHC    EQU   29H    ;存十位数 BCD码
          TEMPLC    EQU   2AH    ;存个位数 BCD码
;--------------------------------
          K1     EQU  P2.1
          K2     EQU  P2.2
          K3     EQU  P2.3
          K4     EQU  P2.4
;--------------------------------
          SPK    EQU  P3.4
          RELAY  EQU  P2.0
          X      EQU  2FH      ;LCD 地址变量
;--------------------------------          
          RS     EQU  P3.5
          RW     EQU  P3.6
          E      EQU  P3.7
;--------------------------------         
          FLAG   EQU  20H.0    ;DS18B20是否存在标记
          KEY_UD EQU  20H.1    ;设定 KEY 的UP与DOWN 标记
          DQ     EQU P2.5

;======================== 主程序 ==========================

MAIN:     
          ACALL  SET_LCD     ;LCD初始化设置子程序
          ACALL  WR_THL      ;将报警上下线写入暂存寄存器

TOOP:     ACALL  RESET_1820   ;18B20复位子程序
          JNB    FLAG,TOOP1    ;DS1820不存在
          ACALL  MEU_OK       ;显示"OK"菜单
          ACALL  RE_THL       ;把EEROM里温度报警值拷贝回暂存器
          ACALL  TEMP_BJ      ;显示温度标记"C"
          JMP    TOOP2
TOOP1:    ACALL  MEU_ERROR     ;显示"ERROR"菜单
          ACALL  TEMP_BJ       ;显示温度标记
          JMP    $
;--------------------------
TOOP2:
          ACALL  RE_TEMP
          ACALL   SET_DATA
          ACALL  TEMP_COMP      ;实际温度值与标记温度值比较子程序
          ACALL  P_KEY          ;键扫描子程序
	  SJMP	TOOP2

;--------- 读取温度数据子程序 ---------

RE_TEMP:
          ACALL  RESET_1820    ;18B20复位子程序    
          JNB    FLAG,TOOP1      ;DS1820不存在
          MOV    A,#0CCH        ;跳过ROM匹配
          ACALL  WRITE_1820    ;写入子程序
          MOV    A,#44H         ;发出温度转换命令
          ACALL  WRITE_1820    ;调写入子程序     
          ACALL  RESET_1820    ;调复位子程序        
          MOV    A,#0CCH        ;跳过ROM匹配
          ACALL  WRITE_1820    ;写入子程序
          MOV    A,#0BEH        ;发出读温度命令
          ACALL  WRITE_1820    ;写入子程序      
          ACALL  READ_1820      ;调用读入子程序
          RET

;-------- 温度数据处理显示子程序----------
 
 SET_DATA:
          ACALL  CONV_TEMP     ;处理温度 BCD 码子程序
          ACALL  DISP_BCD      ;显示区 BCD 码温度值刷新子程序
          ACALL  CONV           ;数据转换子程序        
          RET

;----------- 按键键扫描子程序 ----------

P_KEY:   ;按键K1处理                            
	 JB    K1,PK1		  ; K1键未按,转到PK1处	
         ACALL  SPK_BZ            ;K1键按下,一声鸣响
         JNB   K1,$               ;等按键放开
         MOV   DPTR,#M_ALAX1      ;存M_ALAX1表
         MOV   A,#1
         ACALL  LCD_PRINT         ;显示字符
         ACALL  LOOK_ALARM         ;显示信息区
         JB    K3,$               ;等待K3按下
         ACALL  SPK_BZ            ;一声鸣响
         JMP   PK2                ;转到标号 PK2处 
PK1:    ; 按键K2处理
         JB    K2,PK3             ;K2键未按,转到PK3处             
         ACALL  SPK_BZ             ;K2键按下,一声鸣响               
         JNB   K2,$               ;等按键放开                
         MOV   DPTR,#TA1          ;存#TA1表           
         MOV   A,#1                             
         ACALL  LCD_PRINT          ;显示字符           
         ACALL  SET_ALARM          ;设定报警值 TH、TL          
         ACALL  WR_THL             ;将设定的TH,TL值写入DS18B20内
         ACALL  WRITE_E2           ;
PK2:
         ACALL  MEU_OK            ;显示"OK"菜单
         ACALL  TEMP_BJ           ;显示温度标记          
PK3:
         RET
;-----------------------------------
TA1:
     DB  "RESET ALERT CODE"
;-----------------------------------

;---------- 设定报警值 TH、TL子程序 ---------

;设定报警值 TH、TL
SET_ALARM:
         ACALL  LOOK_ALARM
A0:
         JB     K1,A2
         ACALL  SPK_BZ
         JNB    K1,$
         CPL    20H.1            ;UP/DOWN 标记
A2:      JB     20H.1,A3           ;20H.1=1,UP
         JMP    A8                ;20H.1=0,DOWN

A3:      JB     K2,A5             ;TH值调整(增加)
         ACALL  SPK_BZ
         INC    TEMP_TH
         MOV    A,TEMP_TH
         CJNE   A,#120,A4
         MOV    TEMP_TH,#0
A4:      ACALL  LOOK_ALARM
         MOV    R5,#10
         ACALL  DELAY
         JMP    A3

A5:      JB     K3,A7          ;TL值调整(增加)
         ACALL   SPK_BZ
         INC    TEMP_TL
         MOV    A,TEMP_TL
         CJNE   A,#99,A6
         MOV    TEMP_TL,#00H
A6:      ACALL  LOOK_ALARM    ;
         MOV    R5,#10
         ACALL  DELAY
         JMP    A5
A7:      JB     K4,A0          ;确定调整 OK
         ACALL  SPK_BZ
         JNB    K4,$
         RET

A8:
         JB     K2,A10          ;TH值调整 (减少)
         ACALL  SPK_BZ
         DEC    TEMP_TH
         MOV    A,TEMP_TH
         CJNE   A,#0FFH,A9
         JMP    A12
A9:      ACALL  LOOK_ALARM
         MOV    R5,#10
         ACALL  DELAY
         JMP    A0

A10:     JB     K3,A13         ;TL值调整(减少)
         ACALL  SPK_BZ
         DEC    TEMP_TL
         MOV    A,TEMP_TL
         CJNE   A,#0FFH,A11
         JMP    A12
A11:     ACALL  LOOK_ALARM    ;
         MOV    R5,#10
         ACALL  DELAY
         JMP    A0
A12:     CPL    20H.1
         JMP    A3
A13:     JMP    A7
         RET

;---------- 显示信息区子程序	----------- 

LOOK_ALARM:

          MOV    DPTR,#M_ALAX2   ;指针指到显示信息区
          MOV    A,#2            ;显示在第二行
          ACALL  LCD_PRINT

          MOV    A,#0C6H
          ACALL  TEMP_BJ1
          MOV    A,TEMP_TH       ;加载TH数据
          MOV    X,#3            ;设置位置
          ACALL  SHOW_LINE2H     ;显示数据

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

B0:       MOV    A,R1
          MOVC   A,@A+DPTR
          ACALL  WR_DATA
          INC    R1
          DJNZ   R0,B0
          RET
BJ2:
     DB  00H,"C"

;----------------------------------

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

;----------- 温度值比较子程序------------

;实际温度值与标记温度值比较子程序
TEMP_COMP:
          MOV   A,TEMP_TH       
          SUBB  A,TEMP_ZH       ;减数>被减数,则
          JC    TCL1            ;借位标志位C=1,转
          MOV   A,TEMP_ZH
          SUBB  A,TEMP_TL       ;减数>被减数,则
          JC    TCL2            ;借位标志位C=1,转
          MOV   DPTR,#BJ5
          ACALL TEMP_BJ3
          CLR   RELAY           ;继电器吸合
          RET
 TCL1:
          MOV   DPTR,#BJ3       ;存入#BJ3表
          ACALL TEMP_BJ3        ;调用显示高、低温度及加热标记子程序
          SETB  RELAY           ;继电器关闭
          ACALL SPK_BZ
          RET
 TCL2:
          MOV    DPTR,#BJ4    ;存入#BJ4表    
          ACALL  TEMP_BJ3     ;调用显示高、低温度及加标记子程序      
          ACALL  SPK_BZ       ;调用鸣响子程序
          RET

;--- 显示高、低温度及加热标记程序----
TEMP_BJ3:
          MOV    A,#0CEH
          ACALL  WR_COMM
          MOV    R1,#0
          MOV    R0,#2

BJJ:      MOV    A,R1
          MOVC   A,@A+DPTR
          ACALL  WR_DATA
          INC    R1
          DJNZ   R0,BJJ
          RET
BJ3:
         DB  ">H"
BJ4:
         DB  "<L"
BJ5:
         DB  " !"

;--------- 报警上下线写入暂存器子程序 ----------

WR_THL:
        JB      FLAG,WR_T    ;
        RET
WR_T:
        ACALL  RESET_1820
        MOV    A,#0CCH       ;跳过ROM匹配
        LCALL  WRITE_1820
        MOV    A,#4EH        ;写暂存寄存器
        LCALL  WRITE_1820
        MOV    A,TEMP_TH     ;TH(报警上限)
        LCALL  WRITE_1820
        MOV    A,TEMP_TL     ;TL(报警下限)
        LCALL  WRITE_1820
        MOV    A,#7FH        ;12位精确度
        LCALL  WRITE_1820
        RET

;--------- 报警值拷贝到EEROM子程序 -----------

WRITE_E2:
        ACALL  RESET_1820
        MOV    A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE_1820
        MOV    A,#48H         ;[48H]为拷贝到EEROM的指令代码
        LCALL  WRITE_1820
        RET

;---------- 报警值拷贝回暂存器子程序 ----------

RE_THL:
        ACALL  RESET_1820
        MOV    A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE_1820
        MOV    A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
        ACALL  WRITE_1820
        RET

;----------  处理温度 BCD 码子程序 -----------

; 处理温度 BCD 码子程序
CONV_TEMP:     MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#80H
               JZ   TC1           ;温度零上转
               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
               SJMP  TC2

TC1:           MOV  TEMPHC,#0AH     
TC2:           MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH              ;乘0.0625
               MOV  DPTR,#DOTTAB
               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

⌨️ 快捷键说明

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