如何在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
关键代码说明
- LCD初始化:通过8255配置端口为输出模式,发送标准LCD初始化命令,设置显示参数。
- 温度映射:利用
XLAT指令将ADC读取的索引值直接转换为temperature_range数组中的实际温度值。 - ASCII转换:处理正负温度逻辑,将数字转换为LCD可识别的ASCII字符,负数额外添加负号。
- LCD显示控制:通过子程序分别处理命令和数据发送,控制LCD的RS(命令/数据选择)和E(触发)引脚完成显示操作。
内容的提问来源于stack exchange,提问作者Mediana Aliya
相关产品推荐
相关产品推荐

