大学时一段微机原理的课程设计 用机房的实验箱上的实验系统一个电压表 已经是好久的事了
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;数码管显示0~9的字码表
X1234 DB ?,?,?,? ;存储数码管X1-X2-X3-X4要显示的数字
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
BEGIN: MOV BX,OFFSET X1234
MOV AL,0
MOV [BX],AL ;将存储区域清0
MOV [BX+1],AL
MOV [BX+2],AL
MOV [BX+3],AL
OUT 00H,AL ;启动ADC0809进行采样转化
CALL DALLY
IN AL,00H ;获取转化后的数值
MOV AH,0
PUSH BX
MOV BL,0BAH ;0BAH=186D=4.76V/255*10000(4,76V是电压表测出的实际电压)
MUL BL ;将数值转化成对应的电压值
POP BX
X1: CMP AX,2710H ;2710H=10000D 取电压值第一位
JB X2
SUB AX,2710H
PUSH AX
MOV AL,[BX]
INC AL
MOV [BX],AL
POP AX
JMP X1
X2: CMP AX,03E8H ;03E8H=1000D 取电压值第二位
JB X3
SUB AX,03E8H
PUSH AX
MOV AL,[BX+1]
INC AL
MOV [BX+1],AL
POP AX
JMP X2
X3: CMP AX,0064H ;0064H=100D 取电压值第三位
JB X4
SUB AX,0064H
PUSH AX
MOV AL,[BX+2]
INC AL
MOV [BX+2],AL
POP AX
JMP X3
X4: CMP AX,000AH ;000AH=10D 取电压值第四位
JB X5
SUB AX,000AH
PUSH AX
MOV AL,[BX+3]
INC AL
MOV [BX+3],AL
POP AX
JMP X4
X5: CMP AX,0005H ;将电压值第五位进行四舍五入
JB OVER ;小于5则无需进位
MOV AL,[BX+3] ;大于等于5时电压值的第四位+1
INC AL
MOV [BX+3],AL
CMP AL,0AH ;在比较+1后是否小于10
JB OVER ;小于10的话则要将第四位改为0将第三位+1
MOV AL,0
MOV [BX+3],AL
MOV AL,[BX+2]
INC AL
MOV [BX+2],AL
CMP AL,0AH ;再判断第三位
JB OVER
MOV AL,0
MOV [BX+2],AL
MOV AL,[BX+1]
INC AL
MOV [BX+1],AL
CMP AL,0AH ;判断第二位
JB OVER
MOV AL,0
MOV [BX+1],AL
MOV AL,[BX]
INC AL
MOV [BX],AL ;第一位不可能大于10因为最大为255*186=47430
OVER: MOV CL,0FEH ;11111110用来选择数码管的
LED:
MOV AL,89H ;初始化8255为10001001 C口入、A口出(位选)
OUT 63H,AL ; B口出(要显示的字码数据)
MOV AL,CL
OUT 60H,AL ;选择一个数码管
MOV AL,[BX] ;要显示的数据
MOV DI,OFFSET TABLE
PUSH BX
MOV BL,0
BJ: CMP AL, BL ;查询要显示的数据在字码表中对应的字码
JZ OUTPUT
INC BL
INC DI
JMP BJ
OUTPUT:
POP BX
MOV AL,[DI] ;获取查询后的字码
TEST CL,01H ;测试要选通的数码管是否为最高位(即X1数码管)
JNZ NOTPOINT ;不是最高位,不显示小数点
ADD AL,80H ;是最高位则+80H显示小数点
NOTPOINT:
OUT 61H, AL ;将字码送到B口从数码管显示
CALL DALLY ;延时,否则前几个数码管显示不清晰
INC BX ;指向数据的指针+1获取下一个数据(电压值的下一个位)
ROL CL,1 ;移位选择下一个数码管
CMP CL,0EFH ;与11101111比较
JA LED ;大于表明一趟显示未结束
JMP BEGIN ;小于或等于表明一趟显示结束,则应转去继续采样
DALLY:PUSH CX ;延时的子程序
PUSH AX
MOV CX,0010H
A1: MOV AX,0010H
A2: DEC AX
JNZ A2
LOOP A1
POP AX
POP CX
RET
CODE ENDS
END START