电压表.ASM

来源:互联网 发布:扬州seo关键词优化 编辑:程序博客网 时间:2024/04/29 02:46
大学时一段微机原理的课程设计 用机房的实验箱上的实验系统一个电压表 已经是好久的事了
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