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

📄 h26.asm

📁 (1)完成键盘
💻 ASM
字号:

mode   equ 082h
PORTA  equ 08000h
CTL    equ 08003h

OUTBIT   equ 09002h
OUTSEG   equ 09004h  ; 段控制口
IN       equ 09001h

LEDBuf equ   60h
       ORG   0000H
       ljmp  Start

LEDMAP:
       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

Delay:
       mov   r7, #0
DelayLoop:
       djnz  r7, DelayLoop
       djnz  r6, DelayLoop
       ret

DisplayLED:
       mov   r0, #LEDBuf
       mov   r1, #6
       mov   r2, #00100000b
Loop:
       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a

       mov   a, @r0
       mov   dptr, #OUTSEG
       movx  @dptr, a
       mov   dptr, #OUTBIT
       mov   a, r2
       movx  @dptr, a

       mov   r6, #1
       call  Delay

       mov   a, r2
       rr    a
       mov   r2, a

       inc   r0

       djnz  r1, Loop

       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a

       ret

TestKey:
       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a
       mov   dptr, #IN
       movx  a, @dptr
       cpl   a
       anl   a, #0fh

       ret

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

GetKey:
       mov   dptr, #OUTBIT
       mov   P2, dph
       mov   r0, #Low(IN)
       mov   r1, #00100000b
       mov   r2, #6
KLoop:
       mov   a, r1
       cpl   a
       movx  @dptr, a
       cpl   a
       rr    a
       mov   r1, a

       movx  a, @r0
       cpl   a
       anl   a, #0fh
       jnz   Goon1

       djnz  r2, KLoop

       mov   r2, #0ffh
       sjmp  Exit
Goon1:
       mov   r1, a

       mov   a, r2
       dec   a
       rl    a
       rl    a
       mov   r2, a           ; r2 = (r2-1)*4

       mov   a, r1
       mov   r1, #4
LoopC:
       rrc   a
       jc    Exit
       inc   r2
       djnz  r1, LoopC
Exit:
       mov   a, r2
       mov   dptr, #KeyTable
       movc  a, @a+dptr
       mov   r2, a

WaitRelease:
       mov   dptr, #OUTBIT
       clr   a
       movx  @dptr, a

       mov   r6, #10
       call  Delay
       call  TestKey
       jnz   WaitRelease

       mov   a, r2
       ret

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

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

ADPort    equ 0a000h
Heat      equ 1
Cool      equ 2

SetTemp   equ 50h
CurTemp   equ 51h

DisplayResult:
       mov   a, CurTemp
       jnb   acc.7, GE0

       mov   LEDBuf, #40h    ; '-'
       dec   a
       cpl   a
       jmp   Goon
GE0:
       mov   LEDBuf, #0  ; ' '
Goon:
       mov   b, #10
       div   ab
       mov   dptr, #LEDMAP
       movc  a, @a+dptr
       mov   LEDBuf+1, a

       mov   a, b
       movc  a, @a+dptr
       mov   LEDBuf+2, a

       mov   LEDBuf+3, #0   ; ' '

       mov   a, SetTemp
       mov   b, #10
       div   ab
       movc  a, @a+dptr
       mov   LEDBuf+4, a

       mov   a, b
       movc  a, @a+dptr
       mov   LEDBuf+5, a

       ret


ReadAD:
       mov   dptr, #ADPort
       clr   a
       movx  @dptr, a       ; start A/D

       mov   a, #0
       djnz  acc, $         ; delay

       movx  a, @dptr
       ret

ReadTemp:
       mov   r1, #0
       mov   r2, #0
       mov   r0, #16
RLoop:
       call  ReadAD
       add   a, r2
       mov   r2, a
       jnc   GN1
       inc   r1
GN1:
       djnz  r0, RLoop

       mov   a, r2
       swap  a
       anl   a, #0fh
       xch   a, r1
       swap  a
       anl   a, #0f0h
       orl   a, r1            ; a = r1r2/16

       mov   b, #(HighTemp-LowTemp)
       mul   ab
       mov   a, b             ; /256
       add   a, #LowTemp
       mov   CurTemp, a
       ret

Start:
       mov   sp, #70h
       mov   a, #mode
       mov   dptr, #CTL
       movx  @dptr, a         ; 设置8255工作方式,PA,PC输出,PB输入
       
       mov   SetTemp, #20
MLoop:
       call  TestKey
       jnz   KeyPressed

       call  DisplayResult
       call  DisplayLED
       call  ReadTemp


       mov   a, CurTemp
       jb    acc.7, LE0

       clr   c
       mov   b, SetTemp
       dec   b
       dec   b
       subb  a, b
       jnc   GN2
LE0:
       mov   a, #Heat
       mov   dptr, #PORTA
       movx  @dptr, a
       sjmp  GN4
GN2:
       mov   a, CurTemp
       setb  c
       mov   b, SetTemp
       inc   b
       inc   b
       subb  a, b
       jc    GN3
       mov   a, #Cool
       mov   dptr, #PORTA
       movx  @dptr, a
       sjmp  GN4
GN3:
       mov   a, #0
       mov   dptr, #PORTA
       movx  @dptr, a
GN4:
       sjmp  MLoop

KeyPressed:
       call  GetKey

       mov   b, a
       xrl   a, #DOWN
       jnz   Key0
       mov   a, SetTemp
       xrl   a, #LowLimit
       jz    Key1
       dec   SetTemp
       sjmp  Key1
Key0:
       mov   a, b
       xrl   a, #UP
       jnz   Key1
       mov   a, SetTemp
       xrl   a, #HighLimit
       jz    Key1
       inc   SetTemp
Key1:
       sjmp  MLoop

       end

⌨️ 快捷键说明

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