实验七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