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

📄 复件 (3) main.asm

📁 饮水机测温度原代码 用汇编语言写超过温度可以报警
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;程序: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码
 ;―――――――――――――
 ;按键输入引脚定义      
	KK     EQU  P2	  
        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 地址变量
 ;―――――――――――――         
 ;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  P3.0

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

  MAIN:     
        ACALL  SET_LCD       ;LCD初始化设置子程序	

        ACALL  WR_THL        ;将报警上下线写入暂存寄存器子程序

  TOOP: ACALL  RESET_1820    ;调用18B20复位子程序
        JNB    FLAG,TOOP1    ;DS1820不存在转移TOOP1处
        ACALL  MEU_OK        ;调用显示"OK"信息子程序
        ACALL  RE_THL        ;把EEROM里温度报警值拷贝回暂存器
        ACALL  TEMP_BJ       ;显示温度标记"℃"
        JMP    TOOP2
  TOOP1: ACALL  MEU_ERROR    ;显示"ERROR"信息
        ACALL  TEMP_BJ       ;显示温度标记
        JMP    $             ;等待
 ;――――――――――――――
 TOOP2:
;        ACALL  RE_TEMP       ;调用读取温度数据子程序
;       ACALL  SET_DATA      ;调用处理显示温度数据子程序
;        ACALL  TEMP_COMP     ;实际温度值与标记温度值比较子程序
;        ACALL  P_KEY         ;调用按键扫描子程序
	ACALL  KEYSCAN	
	
	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

SHOW_DATA:
	PUSH 	ACC
	MOV A,#2
       	ACALL  CLR_LINE       ;清除该行字符数据
	ACALL  CLR_LINE       ;清除该行字符数据
       	MOV    A,#0C0H         ;设置 LCD 的第一行地址
       	ACALL  WR_COMM        ;写入命令
	POP	ACC
       	ADD A,#30H
       	ACALL  WR_DATA        ;写入数据
       	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描子程序
KEYSCAN:
	MOV KK,#0FH
	NOP
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN1
	AJMP KEYSCAN	
KEYSCAN1:
;	MOV P0,A
;	RET	
	MOV B,#00H
	SETB	C
	MOV R3,#0EFH
KEYSCAN2:
	MOV A,R3
	JNB ACC.0, KEYSCAN8		;一次循环结束
	MOV KK,A
	RL    A
	MOV R3,A
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN4		;检测到按键按下则转KEYSCAN4
	INC 	B
	INC 	B
	INC	B
	AJMP KEYSCAN2
KEYSCAN4:	
	MOV R4,#04H
KEYSCAN5:
	RRC	A
	JNC 	KEYSCAN6
	INC 	B
	DJNZ R4,KEYSCAN7	;计数达到4次则出错返回
	AJMP KEYSCAN8
KEYSCAN7:
	AJMP 	KEYSCAN5
KEYSCAN6:
	INC 	B
	MOV A,B
	ACALL 	SHOW_DATA	;显示按键的数值
KEYSCAN8:			;判断按键是否释放
	MOV KK,#0FH
	NOP
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN8
	RET	
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;更新显示存储单元
C_BUF:
	MOV R0,#56H
CC:	MOV A,@R0
	INC R0
	MOV @R0,A
	DEC R0
	DEC R0
	CJNE R0,#49H,CC
	MOV 50H,R5
	RET

 ;-------- 温度数据处理显示子程序----------
  SET_DATA:
        ACALL  CONV_TEMP     ;处理温度 BCD 码子程序
        ACALL  DISP_BCD      ;显示区 BCD 码温度值刷新子程序
        ACALL  CONV          ;LCD显示子程序        
        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       ;调用报警值拷贝EEROM子程序
  PK2:
        ACALL  MEU_OK         ;显示"OK"信息子程序
        ACALL  TEMP_BJ        ;显示温度标记子程序          
 PK3:
       RET
 ;―――――――――――――
  TA1:                       ;菜单表
     DB  "RESET ALERT CODE"
 ;―――――――――――――

 ;--------- 设定报警值 TH、TL子程序 --------
  SET_ALARM:
       ACALL  LOOK_ALARM    ;调用显示信息区子程序
  A0:  JB     K1,A2         ;按下K1(查看键),程序向下运行
       ACALL  SPK_BZ        ;蜂鸣器响一声
       JNB    K1,$          ;等放开
       CPL    20H.1         ;UP/DOWN 标记反向
  A2:  JB     20H.1,A3      ;20H.1=1,UP,转移到A3。
       JMP    A8            ;20H.1=0,DOWN,转移到A8
 ;―――――――――――――
 ; TH值调整(增加)
  A3:  JB     K2, A5        ;按下K2(设定键),程序向下运行    
       ACALL  SPK_BZ        ;蜂鸣器响一声
       INC    TEMP_TH       ;TH值调整(增加)
       MOV    A,TEMP_TH     ;TH值送入A
       CJNE   A,#120,A4     ;TH值增到120,程序向下运行
       MOV    TEMP_TH,#0    ;TH值清0
  A4:  ACALL  LOOK_ALARM    ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY         ;调用延时程序
       JMP    A3            ;循环
 ;―――――――――――――
 ;TL值调整(增加)
  A5:  JB     K3,A7          ;按下K3(TL值设定键)程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       INC    TEMP_TL        ;TL值增加1
       MOV    A, TEMP_TL     ;TL值送入A
       CJNE   A,#99,A6       ;比较,若A=99,程序向下运行
       MOV    TEMP_TL,#00H   ;TL值清0
  A6:  ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY          ;调用延时程序
       JMP    A5             ;程序转移到A5,循环
 ;―――――――――――――
 ;确定调整 OK
  A7:  JB     K4, A0         ;按下K4(调整确定键),程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       JNB    K4, $          ;等放开
       RET                   ;程序返回
 ;―――――――――――――
 ;TH值调整 (减少)
  A8:  JB     K2, A10        ;按下K2(设定键),程序向下运行   
       ACALL  SPK_BZ         ;蜂鸣器响一声
       DEC    TEMP_TH        ;TH值减1
       MOV    A,TEMP_TH      ;TH值送入A
       CJNE   A,#0FFH,A9     ;比较,若A=0FF,程序向下运行
       JMP    A12            ;转移到A12
  A9:  ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY          ;调用延时子程序
       JMP    A0             ;转移到A12
   ;――――――――――――――
   ;TL值调整(减少)
  A10: JB     K3, A13        ;按K3(TL值设定键),程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       DEC    TEMP_TL        ;TL值减1
       MOV    A,TEMP_TL      ;TH值送入A
       CJNE   A,#0FFH,A11    ;比较,若A=0FF,程序向下运行
       JMP    A12            ;转移到A12
  A11: ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY          ;调用延时子程序
       JMP    A0             ;转移到A0
  A12: CPL    20H.1          ;UP/DOWN 标记反向
       JMP    A3             ;转移到A3 ,TH值调整(增加)
  A13: JMP    A7             ;转移到A7 ,确定调整 OK
       RET                   ;子程序返回

 ;---------- 显示信息区子程序	----------- 
  LOOK_ALARM:
       MOV    DPTR,#M_ALAX2  ;存表
       MOV    A,#2           ;显示在第二行
       ACALL  LCD_PRINT      ;调用显示字符子程序
       MOV    A,#0C6H        ;显示起始地址为第二行第7位
       ACALL  TEMP_BJ1       ;调用显示温度标记子程序
      MOV    A,TEMP_TH      ;加载TH数据
       MOV    X,#3           ;设置位置
       ACALL  SHOW_LINE2H    ;显示数据
 ;―――――――――――――
       MOV    A,#0CEH        ;设定显示起始地址为第二行第15位
       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           ;A为0
       MOVC   A,@A+DPTR      ;读取码

⌨️ 快捷键说明

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