📄 ex10-4.asm
字号:
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一位
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;************************ 温度值 BCD 码处理子程序 *************************
CONVTEMP: MOV A,TEMPH ;判温度是否零下
ANL A,#08H
JZ TEMPC1 ;温度零上转
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
MOV TEMPHC,#0BH ;负温度标志
MOV TEMPFC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;正温度标志
MOV TEMPFC,#0AH
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
DIV AB
MOV R4,A
MOV A,#0AH
XCH A,B
DIV AB
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 ;显示在第二行
LCALL LCD_PRINT
MOV A,#0C6H
LCALL TEMP_BJ1
MOV A,TEMP_TH ;加载TH数据
MOV LCD_X,#3 ;设置显示位置
LCALL SHOW_DIG2H ;显示数据
MOV A,#0CEH
LCALL TEMP_BJ1
MOV A,TEMP_TL ;加载TL数据
MOV LCD_X,#12 ;设置显示位置
LCALL SHOW_DIG2L ;显示数据
RET
M_ALAX1: DB " LOOK ALERT CODE",0
M_ALAX2: DB "TH: TL: ",0
TEMP_BJ1: LCALL WCOM
MOV DPTR,#BJ2 ;指针指到显示信息区
MOV R1,#0
MOV R0,#2
BBJJ2: MOV A,R1
MOVC A,@A+DPTR
LCALL WDATA
INC R1
DJNZ R0,BBJJ2
RET
BJ2: DB 00H,"C"
;************************** LCD显示子程序 **********************************
SHOW_DIG2H: MOV B,#100
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H
INC LCD_X
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H
LCALL LCDP2
RET
SHOW_DIG2L:
MOV B,#100
DIV AB
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H
LCALL 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 ;百位
DISPBCD2: RET
;*************************** LCD 显示数据处理子程序 *************************
CONV: MOV A,73H ;加载百位数据
MOV LCD_X,#6 ;设置位置
CJNE A,#1,CONV1
JMP CONV2
CONV1: CJNE A,#0BH,CONV11
MOV A,#"-" ;"-"号显示
JMP CONV111
CONV11: MOV A,#" " ;"+"号不显示
CONV111: MOV B,LCD_X
LCALL LCDP2
JMP CONV3
CONV2: LCALL SHOW_DIG2 ;显示数据
CONV3: INC LCD_X
MOV A,72H ;十位
LCALL SHOW_DIG2
INC LCD_X
MOV A,71H ;个位
LCALL SHOW_DIG2
INC LCD_X
MOV A,#'.'
MOV B,LCD_X
LCALL LCDP2
MOV A,70H ;加载小数点位
INC LCD_X ;设置显示位置
LCALL SHOW_DIG2 ;显示数据
RET
;*************************** 第二行显示数字子程序 *************************
SHOW_DIG2:ADD A,#30H
MOV B,LCD_X
LCALL LCDP2
RET
;*************************** 第二行显示数字子程序 *************************
LCDP2: PUSH ACC
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
LCALL WCOM ;写入命令
POP ACC ;由堆栈取出A
LCALL WDATA ;写入数据
RET
;*************************** 对 LCD 做初始化设置及测试*************************
SET_LCD: CLR LCD_EN
LCALL INIT_LCD ;初始化 LCD
LCALL STORE_DATA ;将自定义字符存入LCD的CGRAM
RET
;****************************** LCD初始化 ***********************************
INIT_LCD: MOV A,#38H ;2行显示,字形5*7点阵
LCALL WCOM
LCALL DELAY1
MOV A,#38H
LCALL WCOM
LCALL DELAY1
MOV A,#38H
LCALL WCOM
LCALL DELAY1
MOV A,#0CH ;开显示,显示光标,光标不闪烁
LCALL WCOM
LCALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
LCALL WCOM
LCALL DELAY1
RET
;***************************** 清除LCD的第一行字符 **************************
CLR_LINE1:MOV A,#80H ;设置 LCD 的第一行地址
LCALL WCOM
MOV R0,#24 ;设置计数值
C1: MOV A,#' ' ;载入空格符至LCD
LCALL WDATA ;输出字符至LCD
DJNZ R0,C1 ;计数结束
RET
;************************* LCD的第一行或第二行显示字符 **********************
LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
LCALL WCOM ;写入命令
LCALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
LCALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
LCALL WCOM ;写入命令
LCALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
LCALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: LCALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;*************************** 清除1行 LCD 的字符 ****************************
CLR_LINE: MOV R0,#24
CL1: MOV A,#' '
LCALL WDATA
DJNZ R0,CL1
RET
DE: MOV R7,#250
DJNZ R7,$
RET
;**************************** LCD 间接控制方式命令写入 *************************
WCOM: MOV P0,A ;写入命令
CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
CLR LCD_RW
SETB LCD_EN
LCALL DELAY1
CLR LCD_EN
RET
;**************************** LCD 间接控制方式数据写入 *************************
WDATA: MOV P0,A ;写入数据
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
LCALL DE
CLR LCD_EN
LCALL DE
RET
;************************** 在LCD的第一行显示字符 **************************
LCDP1: PUSH ACC
MOV A,B ;设置显示地址
ADD A,#80H ;设置LCD的第一行地址
LCALL WCOM ;写入命令
POP ACC ;由堆栈取出A
LCALL WDATA ;写入数据
RET
;****************************** 声光报警子程序 *******************************
BEEP_BL: MOV R6,#100
BL2: LCALL DEX1
CPL BEEP
CPL RELAY
DJNZ R6,BL2
MOV R5,#10
LCALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
;****************************** 延时子程序 *******************************
DELAY: MOV R6,#50
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY
RET
DELAY1: MOV R6,#25 ;延时5毫秒
DL2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -