视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实验七 单片机键盘LED显示实验
2025-10-06 14:44:55 责编:小OO
文档
实验七 单片机键盘LED显示实验

1、实验目的

1、掌握键盘和LED显示器的接口方法和编程方法。

2、掌握键盘扫描和LED八段码显示器的工作原理。 

3、学习并口扩展的程序编写方法。

2、实验说明

利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成三个模块。

①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。

②显示模块:将显示单元的内容在显示器上动态显示。

③主程序:调用键输入模块和显示模块。 

3、实验仪器

计算机

伟福实验箱( lab2000P ) 

4、实验内容

1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。地址中的X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。列扫描码还可以分时用作LED的位选通信号。

2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。

3、本实验仪中 8位段码输出地址为0X004H,位码输出地址为 0X002H。此处X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。 

5、思考题

      1、按键接收到的数据加1显示出来;             

      2、实现第2功能键,即按下A后,再按下0-9键为加1显示; 

      3、保存前一个接收到的数据,数据向前推动显示。 

6、源程序修改原理及其仿真结果

OUTBIT           equ 08002h                          ; 位控制口

OUTSEG       equ 08004h                          ; 段控制口

IN               equ 08001h                          ; 键盘读入口

LEDBuf equ   60h                                   ; 显示缓冲

       ljmp  Start

LEDMAP:                                          ; 八段管显示码

       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h

       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

       db    3fh, 06h          ;表中增加两个数据,在查    表时最后两个数据+2后可    以正常显示

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   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

       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    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   LEDBuf,LEDBuf+1

       mov   LEDBuf+1,LEDBuf+2

       mov   LEDBuf+2,LEDBuf+3

       mov   LEDBuf+3,LEDBuf+4

       mov   LEDBuf+4,LEDBuf+5

在显示新数据前将原有数据向前赋值,实现推动显示(思考题三)

       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, #40h

       mov   LEDBuf+0, #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   r3,a    ;将A中的值存入R3保存起来

       cjne  a,#0ah,NEXT1    ;判断键盘输入的是否是A,不是    则跳转NEXT1进行正常显示

       jmp   NEXT2                   ;若是则跳转NEXT2进行加2显    示

        

NEXT1: mov   a,r3    ;取出A中原来的值

       anl   a, #0fh                      ; 显示键码

       mov   dptr, #LEDMap

       movc  a, @a+dptr       

       mov   LEDBuf+5, a

       ljmp  MLoop

MLOOP2:

       call  DisplayLED                   ; 显示

       call  TestKey                      ; 有键入?

       jz    MLoop2                    ; 无键入, 继续显示

       call  GetKey                       ; 读入键码

       

       mov   r3,a    ;与MLOOP1中的判断对称,实    现按下按键A两种显示方式跳转    (思考题二)

       cjne  a,#0ah,NEXT2

       jmp NEXT1

              

NEXT2: mov   a,r3

       anl   a, #0fh                      ; 显示键码

       mov   dptr, #LEDMap

       add   a,#2    ;在查表前+2实现显示数据+2(思    考题一)

       movc  a, @a+dptr      

       mov   LEDBuf+5, a

       ljmp  MLoop2

       end

仿真结果说明:

按下按键A之前按下按键LED推动显示原是数值,如按下333222,则LED显示出333222;按下A后显示出的数值依然推动显示在LED上,但是数值都相应加2,如按下A33322,则LED上会显示出C55544,以此类推,按下A两种输出方式会相互转换并在LED上推动显示出来。本程序基本实现了三个思考题要求的修改目标。下载本文

显示全文
专题