www.pudn.com > H26.rar > H26.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