You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在emu8086中编写代码将温度传感器值显示到LCD?

问题描述

我已经从温度传感器获取到了值(通过ADC读取到AL寄存器中),请问如何继续编写代码,将该温度值显示到LCD上?

原代码如下:

ORG 2000H

DATA SEGMENT
    
; PORT ADDRESSES FOR LCD
 
PORTA1 EQU 00H
PORTB1 EQU 02H ; INPUT
PORTC1 EQU 04H ; UPPER LCD
CONTROL_REG1 EQU 06H ; LOWER LCD

;PORT ADDRESSES FOR ADC

PORTA2 EQU 10H ; INPUT TO DI
PORTB2 EQU 12H 
PORTC2 EQU 14H ; IN ADC
CONTROL_REG2 EQU 16H  

temperature_range db -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 
           db 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39
           

humidity_range db 25,26,27,28,29,30,31,32,33,34,35,3,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
               db 60,61,62,63,64,65,66,67,68,69,7,71,72,73,74
               
;INITIALIZE THE 8255 FROM HUMIDITY SENSOR 

; TAKE TEMPERATURE FROM TEMPERATURE SENSOR

MOV AL, 02H
OUT PORTA2, AL

MOV AL, 06H
OUT CONTROL_REG2, AL

MOV AL, 00H
OUT CONTROL_REG2, AL

MOV AL,02H  
OUT CONTROL_REG2,AL

MOV AL,01H   
OUT CONTROL_REG2,AL

MOV AL,03H   
OUT CONTROL_REG2,AL

MOV AL,02H  
OUT CONTROL_REG2,AL 

MOV AL,00H  
OUT CONTROL_REG2,AL

IN AL, PORTC2
       
MOV AL, 10011010B
OUT CONTROL_REG2, AL

IN AL, PORTA2

解决方案

要实现温度值在LCD上显示,需完成LCD初始化、温度值映射、ASCII转换、LCD数据发送四个核心步骤,以下是完整的代码补充和说明:

完整实现代码

ORG 2000H

DATA SEGMENT
    
; PORT ADDRESSES FOR LCD
 
PORTA1 EQU 00H       ; LCD数据口
PORTB1 EQU 02H 
PORTC1 EQU 04H       ; LCD控制口(RS/E引脚)
CONTROL_REG1 EQU 06H ; LCD对应的8255控制寄存器

;PORT ADDRESSES FOR ADC

PORTA2 EQU 10H 
PORTB2 EQU 12H 
PORTC2 EQU 14H 
CONTROL_REG2 EQU 16H  

temperature_range db -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 
           db 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39
           

humidity_range db 25,26,27,28,29,30,31,32,33,34,35,3,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
               db 60,61,62,63,64,65,66,67,68,69,7,71,72,73,74
               
; LCD显示临时变量
temp_ascii db 3 dup(?) ; 存储温度的ASCII字符(负号+两位数字)
DATA ENDS

CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX

; --------------------------
; 原有ADC读取温度代码
; --------------------------
MOV AL, 02H
OUT PORTA2, AL

MOV AL, 06H
OUT CONTROL_REG2, AL

MOV AL, 00H
OUT CONTROL_REG2, AL

MOV AL,02H  
OUT CONTROL_REG2,AL

MOV AL,01H   
OUT CONTROL_REG2,AL

MOV AL,03H   
OUT CONTROL_REG2,AL

MOV AL,02H  
OUT CONTROL_REG2,AL 

MOV AL,00H  
OUT CONTROL_REG2,AL

IN AL, PORTC2
       
MOV AL, 10011010B
OUT CONTROL_REG2, AL

IN AL, PORTA2 ; AL中存储ADC读取的索引值

; --------------------------
; 1. 初始化LCD对应的8255端口
; --------------------------
MOV AL, 10000001B ; 8255控制字:A口输出(LCD数据),C口输出(LCD控制)
OUT CONTROL_REG1, AL

; --------------------------
; 2. LCD初始化命令
; --------------------------
MOV AL, 38H ; 8位数据、2行显示、5x7点阵
CALL LCD_CMD
MOV AL, 0CH ; 开启显示、关闭光标
CALL LCD_CMD
MOV AL, 01H ; 清屏
CALL LCD_CMD
MOV AL, 80H ; 光标定位到第一行首
CALL LCD_CMD

; --------------------------
; 3. 从temperature_range获取实际温度值
; --------------------------
MOV BX, OFFSET temperature_range
XLAT ; AL = [BX + AL],此时AL为实际温度值

; --------------------------
; 4. 温度值转ASCII字符
; --------------------------
MOV CL, AL
MOV SI, OFFSET temp_ascii

; 处理负数
CMP CL, 0
JGE POSITIVE
MOV BYTE PTR [SI], '-' ; 写入负号ASCII码
INC SI
NEG CL ; 取温度绝对值

POSITIVE:
; 转换十位数字
MOV AL, CL
MOV BL, 10
DIV BL
ADD AL, 30H ; 数字转ASCII
MOV [SI], AL
INC SI
; 转换个位数字
MOV AL, AH
ADD AL, 30H
MOV [SI], AL

; --------------------------
; 5. 发送温度到LCD显示
; --------------------------
MOV SI, OFFSET temp_ascii
MOV CX, 3
DISPLAY_LOOP:
MOV AL, [SI]
CALL LCD_DATA
INC SI
LOOP DISPLAY_LOOP

; 显示温度单位
MOV AL, 'C'
CALL LCD_DATA

; 程序终止
HLT

; --------------------------
; LCD发送命令子程序
; --------------------------
LCD_CMD:
OUT PORTA1, AL ; 命令送数据口
MOV AL, 00H ; RS=0(命令模式)、E=0
OUT PORTC1, AL
MOV AL, 01H ; E=1,产生触发脉冲
OUT PORTC1, AL
MOV AL, 00H ; E=0
OUT PORTC1, AL
CALL DELAY ; 等待命令执行
RET

; --------------------------
; LCD发送数据子程序
; --------------------------
LCD_DATA:
OUT PORTA1, AL ; 数据送数据口
MOV AL, 02H ; RS=1(数据模式)、E=0
OUT PORTC1, AL
MOV AL, 03H ; E=1,产生触发脉冲
OUT PORTC1, AL
MOV AL, 02H ; E=0
OUT PORTC1, AL
CALL DELAY ; 等待数据写入
RET

; --------------------------
; 延时子程序
; --------------------------
DELAY:
MOV CX, 0FFFFH
DELAY_LOOP:
LOOP DELAY_LOOP
RET

CODE ENDS
END START

关键代码说明

  1. LCD初始化:通过8255配置端口为输出模式,发送标准LCD初始化命令,设置显示参数。
  2. 温度映射:利用XLAT指令将ADC读取的索引值直接转换为temperature_range数组中的实际温度值。
  3. ASCII转换:处理正负温度逻辑,将数字转换为LCD可识别的ASCII字符,负数额外添加负号。
  4. LCD显示控制:通过子程序分别处理命令和数据发送,控制LCD的RS(命令/数据选择)和E(触发)引脚完成显示操作。

内容的提问来源于stack exchange,提问作者Mediana Aliya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:15:34