实验七8255键盘显示实验

  • 格式:doc
  • 大小:227.00 KB
  • 文档页数:7

实验七 8255 键盘显示实验

一. 实验目的

1.掌握8255与单片机的接线和I/O编程方法;

2.掌握8255扫描键盘与读取键值的编程;

3.掌握数码管的显示原理与编程。

二、实验内容

1.使用单片机、8255模块和数码管显示电路,编程实现在数码管上从右至左显示0-5;

2. 使用单片机、8255模块和键盘显示电路,编程实现在数码管最右1位显示按键的键码。

三、实验设计

1.硬件电路设计

使用8255模块(E3区),PA口作为位扫描口(键扫描口), PB口输出字形码,PC口作为键值读入口,与数码管显示电路和矩阵键盘模块电路(F6区)相应接口连接, 8255的数据总线D0-D7、读(/RD)、写(/WR)、端口选择A0、A1和片选/CS已和单片机接好,各端口地址如下:

PA口:0FF28H;PB口:0FF29H;PC口:0FF2AH;控制口:0FF2BH

单片机与8255的接线原理图和8255与键盘显示模块接线原理图如下:

2.程序设计

主程序流程图和显示子程序、读键子程序流程图见图6-1,6-2,6-3.

Y

N 入口

数据存储区取数据

数据表中取字形码

输出字形码 输出位扫描信号

6位显示完否?

返回 延时

图6-2 显示子程序 Y N 开始

初始化

扫描键盘有键按下?

延时消抖

读键值

显示键码

图6-1 主程序流程图 显示数据

程序设计要点:

(1) 数码管显示:数码管是共阴极的,但数码管的接口电路(74LS240,754510)决定了PB口应输出共阳码,PA口应输出低电平扫描信号,数码管才能正确显示数据;

(2) 每一位数码管选通时间应保持在1-5ms之内,PA口轮扫一遍的时间应保持在50ms之内;

(3) 扫描键盘:PA口输出00H, PC口读入,判断A的值不等于03H,有键按下;

(4) 延时消抖:检测到有按键后,延时10-20ms再读键值;

(5) 读键值:PA口分列输出0,PC口读入,根据A的值和扫描的列数值确定键值。

三、实验操作

1. 硬件连线:根据硬件电路原理图连接各模块,SW3、SW4、SW5拨向off。

2. 程序调试:

(1) 利用单步/宏单步执行指令,观察记录0-5数字显示的过程;

(2)利用单步/宏单步执行指令,观察记录按键的显示过程;

(3)连续运行程序,观察记录数字显示和按键显示的结果;

(4)改变扫描周期的时间,观察记录数码管显示的效果。

四、实验总结

(1) 数码管显示工作原理和编程要点

(2)键盘扫描工作原理和编程要点

(3)按键消抖的原理和编程

(4)说明扫描时间的长短对数码管显示效果的影响

(5)其他

五、课外练习:

编写程序,实现秒表功能。

计时最小单位为0.lS,最大计时100秒,

并使用按键实现启动计时、停止计时和清零等功能。

N

… Y

N 入口

扫描第一列

有键按下?

扫描第二列

有键按下?

返回 Y

计算键值

查表取键码

图6-3 读键值子程序流程图 有键按下?

N Y 扫描第八列 试验品:

org 0000h

ajmp main

org 0100h

main:

Display:

mov a, #80h

mov dptr, #0ff2bh

movx @dptr, A

Display1:

mov r1, #00h

mov r3, #0feH

mov a, r3

LD0:

mov dptr, #0ff28h

movx @dptr, a

mov a, r1

mov dptr, #DTAB

movc a, @a+dptr

mov dptr, #0ff29h

movx @dptr, a

Lcall delay

inc r1

mov a, r3

jnb acc.5, LD1

RL a

mov r3, a

ajmp LD0

LD1:

RET

DTAB:

DB 0c0h, 0f9h, 0a4h,0b0h,99h, 92h

delay:

mov r7, #02h

delay1:

mov r6, #0ffh

delay2:

djnz r6, delay2

djnz r7, delay1

ret

end

org 0000h

ajmp main

org 0100h

main:

Display:

mov a, #80h

mov dptr, #0ff2bh

movx @dptr, A

Display1:

mov r1, #00h

mov r3, #0feH

mov a, r3

LD0:

mov dptr, #0ff28h

movx @dptr, a

mov a, r1

mov dptr, #DTAB

movc a, @a+dptr

mov dptr, #0ff29h ;

movx @dptr, a

Lcall delay

inc r1

mov a, r3

jnb acc.5, LD1

RL a

mov r3, a

ajmp LD0

LD1:

Ljmp display

DTAB:

DB 0c0h, 0f9h, 0a4h,0b0h,99h, 92h

delay:

mov r7, #02h

delay1:

mov r6, #0ffh

delay2:

djnz r6, delay2

djnz r7, delay1

ret

end

试验品: org 0000h

ajmp main

org 0100h

main:

mov sp, #60h

mov 30h, #00h

mov dptr, #0ff2bh

mov a, #81h

movx @dptr, a

dsp:

nop

acall displaykey

scan:

mov dptr, #0ff28h ;PA

mov a, #00h ;00->A

movx @dptr, a ;00->PA

mov dptr, #0ff2ah ;PC

movx a, @dptr ;PC->A

anl a, #03h

cjne a, #03h, startscan

ajmp dsp

startscan:

acall delay12ms

mov r2, #08h

mov r3, #0feh

mov r1, #00h

keyscan:

mov a, r2

mov dptr, #0ff28h

movx @dptr, a

rl a

mov r2, a

mov dptr, #0ff2ah

movx a, @dptr

anl a, #03h

cjne a, #03h, pdkey

inc r1

djnz r3, keyscan

ljmp dsp

pdkey:

JNB acc.0, jsadd1

JNB acc.1, jsadd2

ljmp scan

jsadd1:

mov a, #00h

ajmp jsadd jsadd2:

mov a, #08h

jsadd:

add a, r1

mov dptr, #keytab

movc a, @a+dptr

mov 30h, a

lcall displaykey

keytab:

DB 7, 4, 8, 5, 9, 6, 0ah,0bh

DB 1, 0, 2, 0fh,3, 0eh,0ch,0dh

displaykey:

mov dptr, #0ff28h

mov a, #0feh

movx @dptr, a ; fix wei

mov dptr, #dtab

mov a, 30h

movc a, @a+dptr

mov dptr, #0ff29h

movx @dptr, a

lcall delay1ms

ret

dtab:

DB 0c0h, 0f9h, 0a4h, 0b0h, 099h, 092h, 082h, 0f8h

DB 080h, 090h, 088h, 083h, 0c6h, 0a1h, 086h, 08eh

delay1ms:

mov r7, #02h

delay1:

mov r6, #0ffh

delay2:

djnz r6, delay2

djnz r7, delay1

ret

delay12ms:

mov r7, #18h

Loop2:

mov r6, #0ffh

Loop1:

djnz r6, loop1

djnz r7, loop2

ret

end