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

📄 keyboard.txt

📁 单片机的键盘扫描程序
💻 TXT
字号:

                         ;键盘扫描实验
r:nop
 OUTBIT   equ 0e101h  ; 位控制口
CLK164   equ 0e102h  ; 段控制口(接164时钟位)
DAT164   equ 0e102h  ; 段控制口(接164数据位)
IN       equ 0e103h  ; 键盘读入口
 LEDBuf	 equ  60h

AJMP MAICHONG
ORG   0003H; INT0外中断地址
     ; 显示缓冲

MAICHONG:MOV  A,P1
       ORL  A,#0FEH
       CJNE  A,#0FFH,MAICHONG
       MOV   50H,#03H           ;二极管显示
       AJMP  KAI
KAI:MOV  DPTR,#0A100h
     MOV  A,#01H
     MOVX  @DPTR,A
     Mov scon ,#00h
     setb  ex0
     SETB  EA;开总中断允许
     ljmp  uuuuu
      LEDMAP:              ; 八段管显示码
       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
       db    00H

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, #0
       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
	   mov dptr,#outbit
       movx  @dptr, a
       cpl   a
       rr    a
       mov   r1, a           ; 下一列
	   mov dptr,#in
       movx a,@dptr	
	  
       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
uuuuu:
       mov   sp, #40h
       mov   dptr,#0e100h
       mov   a,#03h
       movx  @dptr,a
       mov   LEDBuf, #0ffh    ; 显示 8.8.8.8.
       mov   LEDBuf+1, #0ffh
       mov   LEDBuf+2, #0ffh
       mov   LEDBuf+3, #0ffh
  	
       mov   LEDBuf+4, #0
       mov   LEDBuf+5, #0
MLoop:
       call  DisplayLED       ; 显示
       call  TestKey          ; 有键入?
       jz    MLoop            ; 无键入, 继续显示
       call  GetKey           ; 读入键码
             mov   r0,#0ah
	   mov   r7,a
	   subb  a,r0
	   jc    DU
	   ljmp  ZUO
DU:    mov   a,r7
       mov   r0,20h
	   mov   r1,21h
	   mov   r2,22h
	   mov   r3,23h
	   mov   r4,24h
	   mov   25h,r4
	   mov   24h,r3
	   mov   23h,r2
	   mov   22h,r1
	   mov   21h,r0
	   mov   20h,a
	   sjmp  XIAN
ZUO:   mov   a,r7
       cjne  a,#0dh,XIAN
	   mov   a,#01h
	   cjne  a,25h,CHU
	   mov   a,#02h
	   cjne  a,24h,CHU
	   mov   a,#03h
	   cjne  a,23h,CHU
	   mov   a,#04h
	   cjne  a,22h,CHU
	   mov   a,#05h
	   cjne  a,21h,CHU
	   mov   a,#06h
	   cjne  a,20h,CHU
	  
XIAN:  anl   a, #1fh          ; 显示键码
       mov   dptr, #LEDMap
       movc  a, @a+dptr
       mov   LEDBuf+5, a
       ljmp  MLoop
       nop
       ret 
CHU:  MOV  A,50H
      DEC  A
      MOV  50H,A
      MOV  DPTR,#0A102H
      MOV  A,50H
      MOVX  @DPTR,A
   end
    

⌨️ 快捷键说明

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