⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h26.asm

📁 空调恒温控制 利用实验仪上显示电路
💻 ASM
字号:

mode  equ  082h   ; 方式0,PA,PC输出,PB输入
PortA equ  8000h  ; Port A
PortB equ  8001h  ; Port B
PortC equ  8002h  ; Port C
CAddr equ  8003h  ; 控制字地址

ADPort   equ 0a000h  ; AD采样输入片选
CS273    equ 0a000h  ; 控制输出片选


UP        equ 16h    ; Next
DOWN      equ 15h    ; Last
LowLimit  equ 10
HighLimit equ 30
LowTemp   equ -40    ; A/D 0
HighTemp  equ 50     ; A/D 255

Heat      equ 1      ; 加热控制
Cool      equ 2      ; 致冷控制



OUTBIT   equ 09002h  ; 位控制口
OUTSEG   equ 09004h  ; 段控制口
IN_KEY   equ 09001h  ; 键盘读入口

data   segment
LEDBuf db  6 dup(?)    ; 显示缓冲
Num    db  1 dup(?)    ; 显示的数据
DelayT db  1 dup(?)
CurTemp db  1 dup(?)
SetTemp db  1 dup(?)
PortABuf   db  1 dup(?)

LEDMAP:                ; 八段管显示码
       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

KeyTable:              ; 键码定义
       db    16h, 15h, 14h, 0ffh
       db    13h, 12h, 11h, 10h
       db    0dh, 0ch, 0bh, 0ah
       db    0eh, 03h, 06h, 09h
       db    0fh, 02h, 05h, 08h
       db    00h, 01h, 04h, 07h
data   ends

code   segment
       assume cs:code, ds:data

Delay  proc  near
       push  ax            ; 延时子程序
       push  cx

       mov   al, 0
       mov   cx,ax
       loop  $

       pop   cx
       pop   ax
       ret
Delay  endp

DisplayLED proc near
       mov   bx, offset LEDBuf
       mov   cl, 6         ; 共6个八段管
       mov   ah, 00100000b ; 从左边开始显示
DLoop:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx,al         ; 关所有八段管
       mov   al, [bx]
       mov   dx, OUTSEG
       out   dx,al

       mov   dx, OUTBIT
       mov   al, ah
       out   dx, al       ; 显示一位八段管

       push  ax
       mov   ah, 1
       call  Delay
       pop   ax

       shr   ah, 1
       inc   bx
       dec   cl
       jnz   DLoop

       mov   dx, OUTBIT
       mov   al, 0
       out   dx,al        ; 关所有八段管
       ret
DisplayLED endp


TestKey proc near
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al       ; 输出线置为0
       mov   dx, IN_KEY
       in    al, dx       ; 读入键状态

       not   al
       and  al, 0fh       ; 高四位不用
       ret
TestKey endp

GetKey proc near
       mov   ch, 00100000b
       mov   cl, 6
KLoop:
       mov   dx, OUTBIT
       mov   al, ch           ; 找出键所在列
       not   al
       out   dx, al
       shr   ch, 1

       mov   dx, IN_KEY
       in    al, dx
       not   al
       and   al, 0fh
       jne   Goon_        ; 该列有键入
       dec   cl
       jnz   KLoop

       mov   cl, 0ffh    ; 没有键按下, 返回 0ffh
       jmp   Exit1
Goon_:
       dec   cl
       shl   cl, 2       ; 键值 = 列 X 4 + 行

       mov   ch, 4
LoopC:
       test  al, 1
       jnz   Exit1
       shr   al, 1
       inc   cl
       dec   ch
       jnz   LoopC
Exit1:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al

       mov   ch, 0
       mov   bx, offset KeyTable
       add   bx, cx
       mov   al, [bx]          ; 取出键码
       mov   bl, al

WaitRelease:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al            ; 等键释放

       mov   ah, 10
       call  Delay
       call  TestKey
       jne   WaitRelease
       mov   al, bl
       ret
GetKey endp

; ===================================

DisplayResult proc near
       mov   al, CurTemp
       test  al, 80h
       jz    GE0

       mov   LEDBuf, 40h    ; '-'
       dec  al
       not  al
       jmp   Goon
GE0:
       mov   LEDBuf, 0  ; ' '
Goon:
       mov   cl, 10
       mov   ah, 0
       div   cl

       mov   bl, al
       mov   bh, 0
       add   bx, offset LEDMAP
       mov   al, [bx]
       mov   LEDBuf+1, al

       mov   bl, ah
       mov   bh, 0
       add   bx, offset LEDMAP
       mov   al, [bx]
       mov   LEDBuf+2, al

       mov   LEDBuf+3, 0   ; ' '

       mov   al, SetTemp
       mov   ah, 0
       mov   cl, 10
       div   cl

       mov   bl, al
       mov   bh, 0
       add   bx, offset LEDMAP
       mov   al, [bx]
       mov   LEDBuf+4, al

       mov   bl, ah
       mov   bh, 0
       add   bx, offset LEDMAP
       mov   al, [bx]
       mov   LEDBuf+5, al

       ret
DisplayResult endp

ReadAD proc near
       mov   dx, ADPort
       mov   al, 0
       out   dx, al

       mov   al, 60
rr:
       dec   al           ; delay
       jnz   rr

       mov   dx, ADPort
       in    al, dx
       ret
ReadAD endp

ReadTemp proc near
       mov   bx, 0
       mov   cl, 16
RLoop:
       call  ReadAD
       mov   ah, 0
       add   bx, ax
       dec   cl
       jnz   RLoop

       shr   bx, 4
       mov   ax, bx
       mov   cl, HighTemp - LowTemp
       mul   cl
       mov   al, ah             ; /256
       add   al, LowTemp
       mov   CurTemp, al
       ret
ReadTemp endp

Start  proc near
       mov   ax, data
       mov   ds, ax
       mov   al, mode
       mov   dx, CAddr
       out   dx, al       ; 输出控制字
       mov   SetTemp, 20
MLoop:
       call  TestKey
       jne   KeyPressed

       call  DisplayResult
       call  DisplayLED
       call  ReadTemp

       mov   al, SetTemp
       dec   al
       dec   al
       cmp   CurTemp, al
       jge   GN2
       or    PortABuf, Heat
       and   PortABuf, not Cool
       jmp   GN4
GN2:
       mov   al, SetTemp
       inc   al
       inc   al
       cmp   CurTemp, al
       jle   GN3
       or    PortABuf, Cool
       and   PortABuf, not Heat
       jmp   GN4
GN3:
       and   PortABuf, not (Cool+Heat)
GN4:
       mov   dx, PortA
       mov   al, PortABuf
       out   dx, al
       jmp   MLoop

KeyPressed:
       call  GetKey

       cmp   al,  DOWN
       jne   Key0
       cmp   SetTemp,  LowLimit
       je    Key1
       dec   SetTemp
       jmp   Key1
Key0:
       cmp   al,  UP
       jne   Key1
       cmp   SetTemp,  HighLimit
       je    Key1
       inc   SetTemp
Key1:
       jmp  MLoop

start  endp
code   ends
       end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -