实验三 A/D、D/A转换实验
一、实验目的
1. 熟悉DAC0832并行接口数模转换器和TLC2543串行接口模数转换器的基本原理和编程方法。
2. 进一步熟悉单片机应用系统开发步骤和方法。
二、实验电路
实验所用元件清单如下表所示:
1. 串行A/D转换器TLC2543
2. 并行D/A转换器DA0832
三、相关知识
(一)串行A/D转换器TLC2543
1. TLC2543的特性与引脚
TLC2543是TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。由于是串行输入结构,能够节省80C51系列单片机的I/O资源,而且价格适中。
2. TLC2543的工作过程
TLC2543的工作过程分为两个周期:I/O 周期和实际转换周期。
1)I/O周期
I/O周期由外部提供的I/O CLOCK定义,延续8、12或16个时钟周期,决定于选定的输出数据长度。器件进入I/O周期后同时进行两种操作。
(1)在I/O CLOCK的前8个脉冲的上升沿,以MSB前导方式从DATA INPUT端输入8位数据流到输入寄存器。其中前4位为模拟通道地址,控制14通道模拟多路器从11个模拟输入和3个内部自测电压中,选通一路送到采样保持电路,该电路从第4个I/O CLOCK脉冲的下降沿开始,对所选信号进行采样,直到最后一个I/O CLOCK脉冲的下降沿。I/O周期的时钟脉冲个数与输出数据长度(位数)有关,输出数据长度由输入数据的D3、D2选择为8、12或16位。当工作于12或 16位时,在前8个时钟脉冲之后,DATA INPUT无效。
(2)在DATA OUT端串行输出8、12或16位数据。当保持为低时,第一个数据出现在EOC的上升沿;若转换由控制,则第一个输出数据发生在的下降沿。这个数据串是前一次转换的结果,在第一个输出数据位之后的每个后续位均由后续的I/O CLOCK脉冲下降沿输出。
2)转换周期
在I/O周期的最后一个I/O CLOCK脉冲下降沿之后,EOC变低,采样值保持不变,转换周期开始,片内转换器对采样值进行逐次逼近式A/D转换,其工作由与I/O CLOCK同步的内部时钟控制。转换完成后 EOC变高,转换结果锁存在输出数据寄存器中,待下一个I/O周期输出。I/O周期和转换周期交替进行,从而可以减小外部的数字噪声对转换精度的影响。
TLC2543的工作时序如图7.41所示。
3. TLC2543与89C52的接口电路
下图是89C52与TLC2543的接口电路,TLC2543的5条接口线可接到单片机的任何通用双向I/O口上。
(二)并行D/A转换器DAC0832
1.D/A转换是把数字量转换成模拟量的变换,实验台上D/A电路输出的是模拟电压信号。要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。要产生正弦波,较简单的方法是造一张正弦数字量表。即查函数表得到的值转换成十六进制数填表。D/A转换取值范围为一个周期,采样点越多,精度越高些。本例采用的采样点为256点/周期。
3、8位D/A转换器的输入数据与输出电压的关系为
U(0∽-5V)=Uref/256×N
U(-5V∽+5V)=2·Uref/256×N-5V (这里 Uref为+5V)
4、DAC0832与89C52的接口电路
四、 实验内容
1. 按照上图设计仿真电路原理图。
2. 编写程序实现采集AI0~AI11十二个输入通道模拟输入,并转换结果从串口送到模拟终端显示。
3. 编写程序实现产生方波、三角波和梯形波的程序,并在虚拟示波器上显示波形。
五、 参考程序
1、 A/D转换接口实验
COMMON.c程序
#include <REG52.H> /* special function register declarations */
#include <intrins.h>
/*********************************************************
* 函数说明:延时5us,晶振改变时只用改变这一个函数!
1、对于11.0592M晶振而言,需要2个_nop_();
2、对于22.1184M晶振而言,需要4个_nop_();
* 入口参数:无
* 返回: 无
*********************************************************/
void delay_5us(void)//延时5us,晶振改变时只用改变这一个函数!
{
_nop_();
_nop_();
//_nop_();
//_nop_();
}
/************ delay_50us ***************/
void delay_50us(void)//延时50us
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/******** 延时100us ******************/
void delay_100us(void)//延时100us
{
delay_50us();
delay_50us();
}
/*********** 延时单位:ms *******************/
void time(unsigned int ucMs)//延时单位:ms
{
unsigned char j;
while(ucMs>0){
for(j=0;j<10;j++) delay_100us();
ucMs--;
}
}
/********** 初始化串口波特率 ************/
void initUart(void)/*初始化串口波特率,使用定时器2*/
{
/* Setup the serial port for 9600 baud at 11.0592MHz */
SCON = 0x50; //串口工作在方式1
RCAP2H=(65536-(3456/96))>>8;
RCAP2L=(65536-(3456/96))%256;
T2CON=0x34;
TI = 1; /* 置位TI*/
}
common.h程序
#include <REG52.H> /* special function register declarations */
#include <stdio.h> /* prototype declarations for I/O functions */
#include <intrins.h>
#include <Absacc.h>
#include <string.h>
#include <ctype.h>
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned char
#define WORD unsigned int
#define TRUE 1
#define FALSE 0
extern void initUart(void);/*初始化串口*/
extern void time(unsigned int ucMs);//延时单位:ms
Main.c程序
#include "common.h"
extern void CollectADmodule(uint *ad_result);
/******** main 函数 *********/
void main (void) {
uint idata TLC2543[11];
uchar i;
initUart(); /* 初始化串口 */
do{
CollectADmodule(TLC2543);//调用11通道AD转换
for(i=0;i<11;i++){
printf("TLC2543[%bd]=%u\n",i,TLC2543[i]);//打印输出结果
}
printf("\n\n");//回车2次
time(1000);
}while(TRUE);
}
Tlc2543.c程序
#include <reg52.h>
#include <intrins.h>
#include <Absacc.h>
#include <string.h>
#include <ctype.h>
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned char
#define WORD unsigned int
uint read2543(uchar port);
void CollectADmodule(uint *ad_result);
extern void time(unsigned int ucMs);//延时单位:ms
/**************************************
2543控制引脚宏定义
*************************************/
sbit AD_EOC = P1^0; /* TLC2543转换完成指示引脚EOC */
sbit CLOCK = P1^2; /*2543时钟*/
sbit AD_CS = P1^3; /*2543片选*/
sbit D_IN = P1^4; /*2543输入*/
sbit D_OUT = P1^5; /*2543输出*/
/**************************************
TLC2543驱动程序
*************************************/
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
uint read2543(uchar port)
{
uint ad=0;
uchar i;
P1=0xeb;
CLOCK = 0;
AD_CS = 0;
port<<=4;
for(i=0;i<8;i++) //读高8位
{
if(D_OUT) ad|=0x01;
D_IN=(bit)(port&0x80);
CLOCK=1;
CLOCK=0;
port<<=1;
ad<<=1;
}
for(i=8;i<12;i++) //读低4位
{
if(D_OUT) ad|=0x01;
CLOCK=1;
CLOCK=0;
ad<<=1;
}
AD_CS=1;
ad>>=1;
return(ad);
}
/**************************************************
* 函数说明:采集实际端口的数据
* 入口参数:
*ad_result 存各模拟通道的结果
**************************************************/
void CollectADmodule(uint *ad_result)
{
uchar i;
AD_EOC=1;
read2543(0); //启动0通道转换,第一次转换结果不准确,丢弃
while(!AD_EOC){} //等待转换完成
time(3);
read2543(0);
while(!AD_EOC){} //等待转换完成
for(i=0;i<11;i++){
ad_result[i]= read2543(i+1); //读转换结果,并启动下次转换
while(!AD_EOC){} //等待转换完成
time(3);
read2543(i+1); //读转换结果,并启动下次转换
while(!AD_EOC){} //等待转换完成
}
}
2.D/A转换接口实验
锯齿波程序:
ORG 0000H
LJMP START
ORG 0100H
START: MOV R0,#0FEH
MOVX @R0,A
INC A
LCALL DELAY
SJMP START
DELAY: MOV R1,#2H
LP: MOV R2,#20H
DJNZ R2,$
DJNZ R1,LP
RET
END
六、 实验要求
写出实验报告,内容包括:
(1) 实验目的。
(2) 实验电路组成及各单元描述
(3) 软件组成及主要模块流程图
(4) 写出详细的调试步骤,记录实验现象。可通过μVision3 IDE提供的单步、断点、连续等调试功能查看实验电路和内部寄存器、存储器的变化情况。
七、 思考与讨论
串行接口A/D转换器与并行接口A/D转换器比较有什么优点?
第二篇:实验五 DAAD转换实验 完整版
实验五 D/A、A/D转换实验
一、实验目的
了解数/模、模/数转换基本原理,
掌握DAC0832、ADC0809的使用方法;
掌握定时数据采集程序的编制方法。
二、实验内容
1、D/A转换实验
通过0832D/A转换输出一个从0V开始逐渐升至5V,再从5V降至0V的可变电压输出驱动直流电机。
(1)实验接线图
D/A转换实验接线图
(2)实验程序框图
(3)实验程序清单
CODE SEGMENT ;H0832-2.ASM 0-->5v
ASSUME CS:CODE
DAPORT EQU 0FF80h
PA EQU 0FF20H ;字位口
PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口
ORG 1110H
START: JMP START0
BUF DB ?,?,?,?,?,?
data1: db 0c0h,0f9h,0a4h,0b0h,99h,92h
db 82h,0f8h,80h,90h,88h,83h,0c6h,0a1h
db 86h,8eh,0ffh,0ch,89h,0deh,0c7h
db 8ch,0f3h,0bfh,8FH
START0: call buf1
DACON0: MOV AL,00H
DACON1: MOV DX,DAPORT
OUT DX,AL
push ax
call conv
MOV CX,0040H
DISCON: PUSH CX
call disp
POP CX
LOOP DISCON
pop ax
INC AL
CMP AL,00H
JNZ DACON1
MOV AL,0FFH
DACON2: MOV DX,DAPORT
OUT DX,AL
push ax
call conv
MOV CX,0040H
DISCON2: PUSH CX
call disp
POP CX
LOOP DISCON2
pop ax
DEC AL
CMP AL,0FFH
JNZ DACON2
JMP DACON0
CONV: MOV AH,AL
AND AL,0FH
MOV BX,OFFSET BUF
MOV [BX+5],AL
MOV AL,AH
AND AL,0F0H
MOV CL,04H
SHR AL,CL
MOV [BX+4],AL
RET
DISP: MOV AL,0FFH ;00H
MOV DX,PA
OUT DX,AL
MOV CL,0DFH ;20H; 5ms显示子程序
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1
ADD BX,AX
MOV AL,[BX]
POP BX
MOV DX,PB
OUT DX,AL
MOV AL,CL
MOV DX,PA
OUT DX,AL
PUSH CX
DIS2: MOV CX,00A0H
DELAY: LOOP DELAY
POP CX
CMP CL,0FEH ;01H
JZ LX1
INC BX
ROR CL,1 ;SHR CL,1
JMP DIS1
LX1: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
RET
BUF1: MOV BUF,00H
MOV BUF+1,08H
MOV BUF+2,03H
MOV BUF+3,02H
MOV BUF+4,00H
MOV BUF+5,00H
RET
DELY: PUSH CX
DEL2: PUSH CX
DEL3: PUSH CX
LOOP $
POP CX
LOOP DEL3
POP CX
LOOP DEL2
POP CX
LOOP DELY
RET
CODE ENDS
END START
2、A/D转换实验
利用实验系统上电位器提供的可调电压作为0809模拟信号的输入,编制程序,将模拟量转换为数字量,通过数码管显示出来。
(1)实验接线图
D/A转换实验接线图
(2)编程指南
ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和WR,故启动A/D转换只须如下两条指令:
MOV DX,ADPORT ;ADC0809端口地址
OUT DX,AL ;发CS和WR信号并送通道地址
用延时方式等待A/D转换结果,使用下述指令读取A/D转换结果。
MOV DX,ADPORT ;ADC0809端口地址 IN AL,DX
循环不断采样A/D转换的结果,边采样边显示A/D转换后的数字量。
(3)实验程序框图
(4)实验步骤
①将0809 CS4插孔连到译码输出FF80H插孔、连JX6→JX17。
②将通道0模拟量输入端IN0连电位器W1的中心插头AOUT1(0-5V)插孔,8MHZ→T。
③运行实验程序
如在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM文件夹,点击H0809.ASM文件,单击“确定”即可装入A/D转换实验源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“R运行”或工具图标运行,即开始运行程序。如果在没有PC机的情况下,则在8086K系统显示监控提示符“P.”时,用户段地址固定为0000(省略输入),按SCAL键,输入起始偏移地址1000,按EXEC键,在系统上显示“0809 XX”。“XX”表示输入模拟量转换后的数字量。
④调节电位器Wl, 显示器上会不断显示新的转换结果。
模拟量和数字量对应关系的典型值为:
0V→00H +2.5V→80H +5V→FFH
⑤按RST键退出。
以上两种方式运行结果完全一致,因此,在下面的实验中,不管按何种方式均能运行实验程序。
(5)实验程序清单
CODE SEGMENT ;H0809.ASM
ASSUME CS:CODE
ADPORT EQU 0FF80h
PA EQU 0FF20H ;字位口
PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口
ORG 1000H
START: JMP START0
BUF DB ?,?,?,?,?,?
data1:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h
db 0f8h,80h,90h,88h,83h,0c6h,0a1h
db 86h,8eh,0ffh,0ch,89h,0deh,0c7h
db 8ch,0f3h,0bfh,8FH
START0: CALL BUF1
ADCON: MOV AL,00
MOV DX,ADPORT
OUT DX,AL
MOV CX,0500H
DELAY: LOOP DELAY
MOV DX,ADPORT
IN AL,DX
CALL CONVERS
CALL DISP
JMP ADCON
CONVERS: MOV AH,AL
AND AL,0FH
MOV BX,OFFSET BUF
MOV [BX+5],AL
MOV AL,AH
AND AL,0F0H
MOV CL,04H
SHR AL,CL
MOV [BX+4],AL
RET
DISP: MOV AL,0FFH ;00H
MOV DX,PA
OUT DX,AL
MOV CL,0DFH ;20H 初始数位
MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1
ADD BX,AX
MOV AL,[BX]
POP BX
MOV DX,PB
OUT DX,AL
MOV AL,CL
MOV DX,PA
OUT DX,AL
PUSH CX
DIS2: MOV CX,00A0H
LOOP $
POP CX
CMP CL,0FEH ;01H
JZ LX1
INC BX
ROR CL,1 ;SHR CL,1
JMP DIS1
LX1: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
RET
BUF1: MOV BUF,00H
MOV BUF+1,08H
MOV BUF+2,00H
MOV BUF+3,09H
MOV BUF+4,00H
MOV BUF+5,00H
RET
CODE ENDS
END START
3、数据采集实验
要求:用8253定时器1通道定时,每隔半秒使从ADC0809的0通道IN0采集一个数据,若模拟电压在0-2V范围内(0-102),则使LED显示器L7-L4亮;若模拟电压大于2V,小于3V,则使L5-L2亮;若模拟电压大于等于3V,则使LED显示器L3-L0亮。
(主程序重复所采集的数据)
(1) 实验接线图
(2) 实验程序框图
主程序流程图
中断程序流程
(3)实验程序清单
CODE SEGMENT ;H0809.ASM
ASSUME CS:CODE
INTPORT1 EQU 0FF80H
INTPORT2 EQU 0FF81H
INTQ3 EQU INTREEUP3
TCONTR0 EQU 0043H
TCON1 EQU 0041H ;定时器的口地址
IOCONPT EQU 0FF2BH
IOBPT EQU 0FF29H
IOAPT EQU 0FF28H
PA EQU 0FF20H ;字位口
PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口
ADPORT EQU 0FE00H
ORG 12D0H
START: JMP START0
BUF DB ?,?,?,?,?,?
intcnt db ?
RES DB ?
data1 db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h
db 0f8h,80h,90h,88h,83h,0c6h
db 0a1h,86h,8eh,0ffh,0ch,89h,0deh
db 0c7h,8ch,0f3h,0bfh,8FH
START0: CLD
CALL BUF1
CALL WRINTVER ;WRITE INTRRUPT ;装填中断向量
MOV AL,13H
MOV DX,INTPORT1
OUT DX,AL
MOV AL,08H
MOV DX,INTPORT2
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0F7H
OUT DX,AL
MOV intcnt,25 ;软件计数25(0.5秒=20ms*25)
MOV DX,TCONTR0
MOV AL,74H ;8253初始化011110100方式二,频率发生器,自动
OUT DX,AL
MOV DX,TCON1 ;计数器1定时20ms
MOV AX,40000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,0FF2BH
MOV AL,80H ;8255初始化10000000
OUT DX,AL
STI
WATING: CALL DISP ;DISP 0809XX
JMP WATING
WRINTVER: MOV AX,0H
MOV ES,AX
MOV DI,002CH
LEA AX,INTQ3
STOSW
MOV AX,0000h
STOSW
RET
INTREEUP3: DEC INTCNT ;重装计数值
JNZ INTRE2
MOV INTCNT, 25 ;重装计数值
ADCON: MOV AX,00 ;选通道
MOV DX,ADPORT ;启动A\D
OUT DX,AL
MOV CX,0500H
DELAY: LOOP DELAY
MOV DX,ADPORT
IN AL,DX
MOV RES,AL
CALL CONVERS
MOV AL,RES
CMP AL, 66H ;是否为2V
JA NEXT1
MOV AL, 0F0H ;小于2V时,左边四个灯亮
MOV DX, IOAPT
OUT DX,AL
JMP INTRE2
NEXT1: CMP AL, 99H ;是否为3V
JA NEXT2
MOV AL, 0C3H ;中间四个灯亮
MOV DX, IOAPT
OUT DX,AL
JMP INTRE2
NEXT2: MOV AL, 0FH ; 大于3V时,右边四个灯亮
MOV DX, IOAPT
OUT DX,AL
INTRE2: MOV AL,20H
MOV DX,INTPORT1
OUT DX,AL
IRET
CONVERS: MOV AH,AL
AND AL,0FH
MOV BX,OFFSET BUF
MOV [BX+5],AL
MOV AL,AH
AND AL,0F0H
MOV CL,04H
SHR AL,CL
MOV [BX+4],AL
RET
DISP: MOV AL,0FFH ;00H
MOV DX,PA
OUT DX,AL
MOV CL,0DFH ;20H
MOV BX,OFFSET BUF
DIS1: MOV DX,PC
OUT DX,AL
MOV AL,[BX]
MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1
ADD BX,AX
MOV AL,[BX]
POP BX
MOV DX,PB
OUT DX,AL
MOV AL,CL
MOV DX,PA
OUT DX,AL
PUSH CX
DIS2: MOV CX,00A0H
LOOP $
POP CX
CMP CL,0FEH ;01H
JZ LX1
INC BX
ROR CL,1
JMP DIS1
LX1: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
RET
BUF1: MOV BUF,00H
MOV BUF+1,08H
MOV BUF+2,00H
MOV BUF+3,09H
MOV BUF+4,00H
MOV BUF+5,00H
RET
CODE ENDS
END START
思考题:
用IN4采集数据,当电压大于4.5V,使PA口的LED全亮
实验报告:
要求:用8253定时器1通道定时,每隔半秒从ADC0809的2通道IN2采集一个数据存于RES单元。当开关K2(PC2)闭合时进行如下检测:若模拟电压在0-2V范围内(0-102),则使LED显示器L7-L4亮;若模拟电压大于2V,小于3V,则使L5-L2亮;若模拟电压大于等于3.V,则使LED显示器L3-L0亮,当电压大于3.8V,使PA口的LED全亮。
画出系统连接图,编写控制程序(对程序加以注释)
(主程序重复显示0809XX)
CODE SEGMENT ;H0809.ASM
ASSUME CS:CODE
INTPORT1 EQU 0FF80H
INTPORT2 EQU 0FF81H
INTQ3 EQU INTREEUP3
TCONTR0 EQU 0043H
TCON1 EQU 0041H ;定时器的口地址
IOCONPT EQU 0FF2BH
IOBPT EQU 0FF29H
IOAPT EQU 0FF28H
IOCPT EQU 0FF2AH
PA EQU 0FF20H ;字位口
PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口
ADPORT EQU 0FE00H
ORG 12D0H
START: JMP START0
BUF DB ?,?,?,?,?,?
intcnt db ?
RES DB ?
data1 db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h
db 0f8h,80h,90h,88h,83h,0c6h
db 0a1h,86h,8eh,0ffh,0ch,89h,0deh
db 0c7h,8ch,0f3h,0bfh,8FH
START0: CLD
CALL BUF1
CALL WRINTVER ;WRITE INTRRUPT ;装填中断向量
MOV AL,13H
MOV DX,INTPORT1
OUT DX,AL
MOV AL,08H
MOV DX,INTPORT2
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0F7H
OUT DX,AL
MOV intcnt,25 ;软件计数25(0.5秒=20ms*25)
MOV DX,TCONTR0
MOV AL,74H
OUT DX,AL
MOV DX,TCON1 ;计数器1定时20ms
MOV AX,40000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,0FF2BH
MOV AL,81H ;加开关
OUT DX,AL
STI
WATING: CALL DISP ;DISP 0809XX
JMP WATING
WRINTVER: MOV AX,0H
MOV ES,AX
MOV DI,002CH
LEA AX,INTQ3
STOSW
MOV AX,0000h
STOSW
RET
INTREEUP3: DEC INTCNT
JNZ INTRE2 ;重装计数值
MOV INTCNT, 25
ADCON: MOV AX,02 ;选通道
MOV DX,ADPORT ;启动A\D
OUT DX,AL
MOV CX,0500H
DELAY: LOOP DELAY
MOV DX,ADPORT
IN AL,DX
MOV RES,AL
CALL CONVERS
MOV DX,IOCPT ;读C口状态
IN AL,DX
TEST AL,04 ;测试K2是否闭合
JZ INTRE2
MOV AL,RES
CMP AL, 66H ;是否为2V
JA NEXT1
MOV AL,0FH ;L8-L5亮
MOV DX, IOAPT
OUT DX,AL
JMP INTRE2
NEXT1: CMP AL, 99H ;是否为3V
JAE NEXT2
MOV AL, 0C3H ;中间四个灯亮L6-L4
MOV DX, IOAPT
OUT DX,AL
JMP INTRE2
NEXT2: CMP AL, 0C2H ;是否为3.8V
JA NEXT3
MOV AL, 0F0H ;左边四个灯亮L4-L1
MOV DX, IOAPT
OUT DX,AL
JMP INTRE2
NEXT3: MOV AL, 00H ;灯全亮
MOV DX, IOAPT
OUT DX,AL
INTRE2: MOV AL,20H
MOV DX,INTPORT1
OUT DX,AL
IRET
CONVERS: MOV AH,AL
AND AL,0FH
MOV BX,OFFSET BUF
MOV [BX+5],AL
MOV AL,AH
AND AL,0F0H
MOV CL,04H
SHR AL,CL
MOV [BX+4],AL
RET
DISP: MOV AL,0FFH ;00H
MOV DX,PA
OUT DX,AL
MOV CL,0DFH ;20H
MOV BX,OFFSET BUF
DIS1: MOV DX,PC
OUT DX,AL
MOV AL,[BX]
MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1
ADD BX,AX
MOV AL,[BX]
POP BX
MOV DX,PB
OUT DX,AL
MOV AL,CL
MOV DX,PA
OUT DX,AL
PUSH CX
DIS2: MOV CX,00A0H
LOOP $
POP CX
CMP CL,0FEH ;01H
JZ LX1
INC BX
ROR CL,1
JMP DIS1
LX1: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
RET
BUF1: MOV BUF,00H
MOV BUF+1,08H
MOV BUF+2,00H
MOV BUF+3,09H
MOV BUF+4,00H
MOV BUF+5,00H
RET
CODE ENDS
END START