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

📄 ll.asm

📁 proteus 仿真的烤箱程序
💻 ASM
字号:


;==================================================================
;单片机内存分配申明!
ADC0            EQU    078H

DIVDLL	EQU	21H 	;定义被除数
DIVDLH	EQU	22H
DIVDHL	EQU	23H
DIVDHH	EQU	24H
DIVL	EQU	25H	;定义除数
DIVH	EQU	26H
TEMPL	EQU	27H	;定义余数单元
TEMPH	EQU	28H
AD	EQU	29H	;16进制数暂存单元
KEY	EQU	2AH

     
;=================================================================
;液晶显示器寄存器地址分配
;-----------------------------------------------------------------
LCD_CMD_WR	EQU 	80H ;8000H	;液晶显示器命令寄存器地址
LCD_DATA_WR	EQU	81H ;8001H		;液晶显示器显存数据寄存器地址
LCD_BUSY_RD	EQU	82H ;8002H		;液晶显示器忙状态寄存器地址
LCD_DATA_RD	EQU	83H ;8003H		;读液晶显示器内部数据地址

;=================================================================
;液晶显示器命令
;-----------------------------------------------------------------
LCD_CLS		EQU	1		  ;清屏命令
LCD_HOME	EQU	2		  ;光标返回行首命令
LCD_SETMODE	EQU	4		  ;设置光标移动方向为右移,不移动
LCD_SETVISIBLE	EQU	8		;关闭显示
LCD_SHIFT	EQU	16		  ;清除光标和整个显示,光标左移
LCD_SETFUNCTION	EQU	32		;设置显示方式为8bit接口、1行、5*7点阵字体
LCD_SETCGADDR	EQU	64		;设置字符发生器地址
LCD_SETDDADDR	EQU	128		;设置显存地址




;===============  主程序开始  =============================================

			ORG 	0000H
			LJMP	START
			ORG	30H
			
			
START:		
		LCALL	INIT		;初始化液晶显示器
		LCALL   AD_start                     ;启动AD,温度在 29H 中。
                                 MOV    KEY,    #29
	               LCALL  ALL_display
	    
		
MAIN:        
	LCALL   JIANPAN
	 
            	    
BIJIAO:       LCALL  AD_start
            
	   LCALL  AD_display
	  
	   MOV    A,KEY
                   CLR  C
                   SUBB A,#5
                   MOV B,A
	
                   MOV     A,  AD
                  
                   
	   CLR    C
                   SUBB    A, B
                   JNZ  NEQ		  ; CJNE    A,#00H,NEQ
                  SETB   P3.0
                   LJMP   MAIN     ;相等返回.

NEQ:          JC      OW
                
                SETB    P3.0  ;停止工作
	LCALL D1MS
                
                
	;LCALL  AD_display
	 
                LJMP	MAIN

OW:          
 	CLR    P3.0

	LCALL D1MS
             
           ;  LCALL   AD_display
	
	
              ; JMP    BIJIAO
	
            
                LJMP	MAIN
		       
		       
;===============  主程序结束  ============================================

;===================================================================
JIANPAN:        MOV     A,#0FFH
                MOV     P1,A
                MOV     A,P1
	 
                JNB     ACC.0,G0
	
                JNB     ACC.1,G1
	
                JNB     ACC.2,G2
	
             

                 RET
               
G0:             ;LJMP    D1MS
                LJMP    PROG0
                
G1:            ; LJMP    D1MS
                LJMP    PROG1
                
G2:            ; LJMP    D1MS
                LJMP    PROG2

PROG0:     MOV     KEY,#50
	
                 LCALL  ALL_display
	   

                JMP     JIANPAN
                     
PROG1:     
	INC     KEY
	LCALL   ALL_display
	   
             
                JMP     JIANPAN
                
PROG2:     
	DEC     KEY
 	LCALL   ALL_display
	
                
                JMP     JIANPAN
                RET
;========================================================= 
;====================================================
AD_display:		              MOV	A,#2          ;显存地址指针清零,光标回到行首
				LCALL	WRCMD

				MOV A,AD
			                LCALL BTOD
                
                                                               

                
				MOV	A,  #'T'
				LCALL	WRDATA		;显示字母“T”

				 

				MOV	A,  #'='
				LCALL	WRDATA		;显示字母“=”

				

				MOV      A,R3
				ORL       A,#30H                     ;	百位
				LCALL   WRDATA

				

				MOV      A,R4
		        		ORL     A,#30H	            ;十位
				LCALL   WRDATA
					
				MOV     A,R5	             ;个位
		           		ORL        A,#30H
				LCALL     WRDATA
			
				MOV	A,#0DFH		;显示“°”
				LCALL	WRDATA
				MOV	A,#'C'		;显示“C”
				LCALL	WRDATA
				
				;MOV	A,#20H	         ;显示空格
				;LCALL	WRDATA
				 MOV	A,#2          ;显存地址指针清零,光标回到行首
				LCALL	WRCMD
				
				RET
;=========================================================================	
;--------------------------------------------------------------------------
;以下程序完成将测量的温度值在液晶显示器上显示出来的任务
;---------------------------------------------------------------------------
 
ALL_display:		                MOV A,AD
			                LCALL BTOD
                
                                                               

                
				MOV	A,  #'T'
				LCALL	WRDATA		;显示字母“T”

				 

				MOV	A,  #'='
				LCALL	WRDATA		;显示字母“=”

				

				MOV      A,R3
				ORL       A,#30H                     ;	百位
				LCALL   WRDATA

				

				MOV      A,R4
		        		ORL     A,#30H	            ;十位
				LCALL   WRDATA
					
				MOV     A,R5	             ;个位
		           		ORL        A,#30H
				LCALL     WRDATA
			
				MOV	A,#0DFH		;显示“°”
				LCALL	WRDATA
				MOV	A,#'C'		;显示“C”
				LCALL	WRDATA
				
				MOV	A,#20H	         ;显示空格
				LCALL	WRDATA
				
         
KEY_display:			MOV     A,KEY
				LCALL   BTOD
			
				MOV	A,#'T'
				LCALL	WRDATA		;显示字母“T”
				
				MOV	A,#'='
				LCALL	WRDATA		;显示字母“=”
				
				MOV     A,R3
				ORL     A,#30H
				LCALL   WRDATA
			
				MOV     A,R4
		       		ORL     A,#30H
				LCALL   WRDATA
								
				MOV     A,R5
		        		ORL     A,#30H
				LCALL   WRDATA
				
				MOV	A,#0DFH		;显示“°”
				LCALL	WRDATA
				
				MOV	A,#'C'		;显示“C”
				LCALL	WRDATA
				

				MOV	A,#20H		;显示空格
				LCALL	WRDATA

				  MOV	A,#2          ;显存地址指针清零,光标回到行首
				LCALL	WRCMD
				
				RET









;=========================================================================
D1S:            MOV     R5,#4
M4:             MOV     R6,#250
M5:             LCALL   D1MS
                DJNZ    R6,M5
                DJNZ    R5,M4
                RET
;=========================================================================








;=========================================================================
;启动AD转换,把转换后的温度值存放在"29H"中。
;=========================================================================
AD_start:                                                  MOV	DPTR,#ADC0     
                                                             
				MOVX	@DPTR,A		;启动A/D

				
				LCALL      D1MS
				MOVX	A,@DPTR		;取采样的电压值
				
				MOV      AD ,A
			    	
				;MOV	R3,A
				;MOV	R2,#0
				;MOV	R6,#00H     ;
				;MOV	R7,#0C4H   ;#196		
				;LCALL	DMUL
						
								
				;MOV	DIVDHH,R4
				;MOV	DIVDHL,R5
				;MOV	DIVDLH,R6
				;MOV	DIVDLL,R7	
				
				;MOV	DIVL,#01H
				;MOV	DIVH,#0F4H	;除数=500
				;LCALL	CHUFA		;除500得到电压值
				
				;MOV	29H,DIVDLH
				;MOV     A,29H	
				;LCALL	BTOD		;转换为BCD码
				RET
;=========================================================================









;=========================================================================
; 液晶显示器初始化
;=========================================================================
INIT: 	 	MOV 	A,#38H			;8位、2行、5*7字符方式
		LCALL 	WRCMD
		MOV 	A,#LCD_SETVISIBLE+4	;打开显示
		LCALL 	WRCMD
		MOV 	A,#LCD_SETDDADDR	;               开始显示的位置在最左边
		LCALL 	WRCMD
		MOV 	A,#LCD_SETMODE+3	;                增量方式,光标移动  
		LCALL 	WRCMD
                	RET
;===========================================================================
;清屏并且设置初始化条件
;Clears the LCD display and sets the initialisation conditions.
;===========================================================================
CLS:		MOV 	A,#LCD_CLS
		LCALL 	WRCMD
		MOV 	A,#LCD_SETDDADDR	;开始显示的位置在最左边
		LCALL 	WRCMD
		RET
;==============================================================================
;写命令子程序,命令在累加器A中
;Sub routine to write command:
;==============================================================================
WRCMD:		MOV	DPTR,#LCD_CMD_WR
		MOVX	@DPTR,A
		SJMP 	WTBUSY
;------------------------------------------------------------------------------
;将字符写入LCD1602液晶显示器的显存,要显示的字符在累加器A中
; Subroutine to Write a Character to the LCD Display.
;-------------------------------------------------------------------------------
WRDATA:		MOV 	DPTR,#LCD_DATA_WR
		MOVX	@DPTR,A
;--------------------------------------------------------------------------------
;判断液晶显示器是否忙?
; Subroutine to wait for a busy clear.	
;--------------------------------------------------------------------------------
WTBUSY:		MOV	DPTR,#LCD_BUSY_RD
		MOVX	A,@DPTR
		JB 	ACC.7,WTBUSY
                RET
;===================================================================


                            

D1MS:           MOV     R7,#80  ;255
                DJNZ    R7,$
                RET
;=========================================================                
                	




;==========================================================
;多字节乘法程序
;被乘数在R2R3,乘数在R6R7,积在R4R5R6R7
;==========================================================
DMUL:		MOV	A,R3
		MOV	B,R7
		MUL	AB
		XCH	A,R7
		MOV	R5,B
		MOV	B,R2
		MUL	AB
		ADD	A,R5
		MOV	R4,A
		CLR	A
		ADDC	A,B
		MOV	R5,A
		MOV	A,R6
		MOV	B,R3
		MUL	AB
		ADD	A,R4
		XCH	A,R6
		XCH	A,B
		ADDC	A,R5
		MOV	R5,A
		MOV	F0,C
		MOV	A,R2
		MUL	AB
		ADD	A,R5
		MOV	R5,A
		CLR	A
		MOV	ACC.0,C
		MOV	C,F0
		ADDC	A,B
		MOV	R4,A
		RET
		
		
		
		
		
		

;====================================================
;4字节加1字节程序
;被加数在R4R5R6R7中,加数在A中
;和在R4R5R6R7中
;====================================================
JIAFA:		ADD	A,R7
		MOV	R7,A
		CLR	A
		ADDC	A,R6
		MOV	R6,A
		CLR	A
		ADDC	A,R5
		MOV	R5,A
		CLR	A
		ADDC	A,R4
		MOV	R4,A
		RET
		
		
		
		
		
		
		
;===========================================================
;4字节除以2字节的除法程序
;被除数在DIVDHH、DIVDHL、DIVDLH和DIVDLL单元
;除数在DIVH和DIVL单元
;商在被除数单元
;余数在TEMPH和TEMPL单元
;===========================================================
CHUFA:		MOV	A,DIVH		;除数为零?
		ORL	A,DIVL
		JNZ	DIVD0
		SETB	OV		;为零,置溢出标志
		RET
DIVD0:		MOV	TEMPL,#0
		MOV	TEMPH,#0
		MOV	B,#32
DIVD1:		CLR	C
		MOV	A,DIVDLL
		RLC	A
		MOV	DIVDLL,A
		MOV	A,DIVDLH
		RLC	A
		MOV	DIVDLH,A
		MOV	A,DIVDHL
		RLC	A
		MOV	DIVDHL,A
		MOV	A,DIVDHH
		RLC	A
		MOV	DIVDHH,A
		MOV	A,TEMPL
		RLC	A
		MOV	TEMPL,A
		XCH	A,TEMPH
		RLC	A
		XCH	A,TEMPH
		MOV	F0,C
		SUBB	A,DIVL
		MOV	R7,A
		MOV	A,TEMPH
		SUBB	A,DIVH
		ANL	C,/F0
		JC	DIVD2
		MOV	TEMPL,R7
		MOV	TEMPH,A
		INC	DIVDLL
DIVD2:		DJNZ	B,DIVD1
		CLR	OV
		RET
		
		
		
;============================================================
;BCD转换
;============================================================ 
BTOD:           MOV     B,#100
                DIV     AB
                MOV     R3,A
                MOV     A,#10
                XCH     A,B
                DIV     AB
                SWAP    A
                ORL     A,B 
                
                MOV     R5,A
                SWAP    A               
                ANL     A,#0FH
                MOV     R4,A
                MOV     A,R5
                ANL     A,#0FH
                MOV     R5,A
                RET
;============================================================
                 END                                
                
                
		

⌨️ 快捷键说明

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