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

📄 brs232.asm

📁 80c51单片机实现直流电机转速测量与控制
💻 ASM
字号:
;       双机通讯

OUTBIT   equ 0e101h  ; 位控制口
CLK164   equ 0e102h  ; 段控制口(接164时钟位)
DAT164   equ 0e102h  ; 段控制口(接164数据位)
IN       equ 0e103h  ; 键盘读入口
HasRcv equ   20h.0   ; 接收标志位
LEDBuf equ   40h     ; 显示缓冲
RCVBuf equ   50H     ; 接收缓冲

        ORG     0000H
       LJMP    START

; 串行口中断程序
        ORG     0023H
        JNB     TI,S0_R
        CLR     TI
        NOP
        SJMP    S0_RET
S0_R:                          ; 接收数据
        CLR     RI
        MOV     RCVBUF,SBUF    ; 保存数据
        SETB    HasRcv         ; 提示收到数据
        NOP
S0_RET:
        RETI

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          ; 共6个八段管
       mov   r2, #00100000b  ; 从左边开始显示
Loop:
       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a        ; 关所有八段管
       mov   a, @r0
       mov   B, #8           ; 送164
DLP:
       rlc   a
       mov   r3, a
       mov   acc.0, c
        mov   dptr, #DAT164
       anl a,#0fdh
       movx  @dptr, a
       mov   dptr, #CLK164
       orl a,#02h
       movx  @dptr, a
       anl a,#0fdh
       movx  @dptr, a
       mov   a, r3
       djnz  B, DLP
       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
       ret
TestKey:
       mov   dptr, #OUTBIT
       mov   a, #0h
       movx  @dptr, a        ; 输出线置为0
       mov   dptr, #IN
       movx  a, @dptr        ; 读入键状态
       cpl   a
       anl   a, #0fh         ; 高四位不用
       ret
KeyTable:                    ; 键码定义
       db    00h, 01h, 04h, 07h
       db    0fh, 02h, 05h, 08h
       db    0eh, 03h, 06h, 09h
       db    0dh, 0ch, 0bh, 0ah
       db    10H,10H,10H,10H,10H
       db    10H,10H,10H,10H,10H

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       ; 没有键按下, 返回 0ffh
       sjmp  Exit
Goon1:
       mov   r1, a           ; 键值 = 列 X 4 + 行

       mov   a, r2
       dec   a
       rl    a
       rl    a
       mov   r2, a           ; r2 = (r2-1)*4
       mov   a, r1           ; r1中为读入的行值
       mov   r1, #4
LoopC:
       rrc   a               ; 移位找出所在行
       jc    Exit
       inc   r2              ; r2 = 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
START:
       MOV   SP,  #60H
       mov   dptr,#0e100h
       mov   a,#03h
       movx  @dptr,a
       MOV   IE,  #0     ; DISABLE ALL INTERRUPT
       MOV   TMOD,#020H  ; 定时器1工作于方式2 (8位重装)
       MOV   TH1, #0F3H  ; 波特率?2400BPS @ 12MHz
       MOV   TL1, #0F3H
       ANL   PCON,#07FH  ; SMOD 位清零
       orl   PCON,#80h
       MOV   SCON,#050H  ; 串行口工作方式设置

       MOV   LEDBuf,   #039h    ; 显示 C-C=
       mov   LEDBuf+1, #040h
       mov   LEDBuf+2, #039h
       mov   LEDBuf+3, #048h
       mov   LEDBuf+4, #0
       mov   LEDBuf+5, #0
       SETB  TR1

       SETB  ES
       SETB  EA
 ;      mov   sbuf,a
 ;      jnb ti,$
;
MLoop:
       jb   HasRcv, RcvData   ; 收到数据?

       call  DisplayLED       ; 显示
       call  TestKey          ; 有键入?
       jz    MLoop            ; 无键入, 继续显示
       call  GetKey           ; 读入键码
       anl   a, #0fh          ; 通讯口输出键码
       MOV   SBUF,A
     ;  jnb ti,$
     ;  clr  ti
       LJMP  MLoop
RcvData:
       clr   HasRcv           ; 是
       mov   a, RcvBuf        ; 显示数据
       mov   b,a
       anl   a,#0fh           ; 显示低位
       mov   dptr, #LEDMap
       movc  a, @a+dptr
       mov   LEDBuf+5, a
       mov   a,b
       swap  a                ; 显示高位
       anl   a,#0fh
       mov   dptr, #LEDMap
       movc  a, @a+dptr
       mov   LEDBuf+4, a
       ljmp  MLoop
       END

⌨️ 快捷键说明

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