📄 ll.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 + -