当前位置:
文档之家› 多功能电子钟--51单片机C语言程序(附详细注释)
多功能电子钟--51单片机C语言程序(附详细注释)
16 b 15 g 14 a 13 c 12 11 f 10 9
Q3 PNP PNP6
BIT31 BIT22 d3
4 e5 BIT16 dp 7 BIT08
VCC
Q4 PNP PNP5
D2 LED2 BIT1 B BIT2 G DA DOT2 C E DOT BIT3 F DP NO BIT4 NO
8255A 有 3 个并行接口,分别为 PA、PB 和 PC。其中 PC 口有分为高 4 位口和低 4 位口 两部分。各 I/O 都可以通过软件编程来设置工作方式。
PA、PB 和 PC 都为 8 位并行端口,但功能有差异。PA 口可编程为输入/输出或双向口, PB 口可编程为输入/输出口,PC 口分为两个 4 位并行口,可分别编程为输入/输出口,PC 口 除做 I/O 口外,还作为 PA、PB 口工作于选通方式时的状态控制信号。只有 PA 口具有双向口 功能。
5 4 3 2 1
ห้องสมุดไป่ตู้PB3 PB4 PB5 PB6 PB7
CON5
PB2
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
4 3 2 1 40 39 38 37
R16 R15 R14 R13 R12 R11 R10 R9
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
18 19 20 21
;CDEF
;89AB
;4567
;3210
1
生物医学测量实践 8255A 在矩阵键盘及 LED 动态显示中的应用
二、8255A 与单片机的连接
本实验板中 8255A 仅用于单片机 I/O 口扩展,工作在方式 0,因此与单片机连接较为简 单,PC 口全部用于数据口,下图为单片机与 8255A 接口原理图:
图 2 8255A 与单片机接口原理
(精仪学院 2008 级生物医学工程 1 班 王本全 学号:3008202309)
摘要
8255A 并行接口芯片在早期的单片机应用系统中得到了广泛应用,很好地解决了单 片机口线紧张的问题。本文简要介绍了 8255A 的控制和使用,并以实践中所用实验板为 例,讲述了 8255A 在矩阵键盘及 LED 动态显示中的应用,包括与单片机的接口方式,与 矩阵键盘和 LED 的接口方式,所给出的用于实验板的键盘和 LED 显示函数,能够有效提 高编程效率。本文最后给出了一个综合使用 8255A 的例程——具有校时、秒表、闹钟、 整点报时等多种功能的电子钟的 C 语言程序实现,并进行了详细注释,较好地体现了合 理使用 8255A、模块化编程等思想。 关键字:并行接口芯片 8255A 矩阵键盘 动态 LED 电子钟
BUT2 2
1
BUT3 2
1
BUT0 2
1
BUT1 2
1
BUT2 2
1
BUT3 2
1
BUT0 2
1
BUT1 2
1
BUT2 2
1
BUT3 2
1
BUT4 2
1
BUT5 2
1
BUT6 2
1
BUT7 2
1
图 3 8255A 与键盘及 LED 连接
本实验板中 8255A 主要用于实现矩阵键盘及 LED 动态显示功能,共使用 8255 的 PA 口、 PC 口及 PB 口低 3 位,PB 口剩余高 5 位仍可以作为其他功能的输入使用。因为 8255A 的 PC 口可以对高低四位分别设置,个人认为若将 PB 口的按键移到 PC 口,可以使剩余的口线配 置更为灵活。上述电路原理图中,8255A 的 PA 口配置为输出模式,用于输出 LED 段码,PB 口用于进行键盘行扫描,其中 PB0 及 PB1 分别扫描 4 列按键,PB2 扫描 8 列按键。PB0 与 PC
端口
地址高 8 位(2 进制)
地址高 8 位(16 进制)
PA
010 00 xxx
0x40
PB
010 01 xxx
0x48
PC
010 10 xxx
0x50
控制寄存器
010 11 xxx
0x58
表 2 8255A 端口地址
因 8255A 地址与单片机 P0 口无关,故地址低 8 位可为任意数值,一般设为 0。
PB0 PB1 PB2 PB3
R3 R2 R1
22 PB4
23 PB5
24 PB6
25 PB7
PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
14 15 16 17 13 12 11 10
BBBBBBBBUUUUUUUUTTTTTTTT73210456RRRRRRRR2222211143210987
四、矩阵键盘的原理与实现
图 4 矩阵键盘原理 矩阵键盘是单片机系统中非常常用的一种键盘连接形式,其连接方式简单,节省单片机 口线,但编程控制较为繁琐。一种常用的 4×4 矩阵键盘原理如图,行、列分别连接到单片 机的一组口线上,其键盘扫描过程如下: 首先将列全部置 0,行全部置 1,不断查询行的状态,当有按键按下时,对应行会被拉 低,当检测到行输入不为全 1 时,表明有按键按下,进行一定时间延时,进行防抖,延时结 束后,再次读入行状态,若行仍然不为全 1,表明确实有键按下,此时可确定按键所在的行, 然后将列逐一置 1,保持其他列为 0,当行状态重新变为全 1 时,可以得到按键所在的列, 这样便可以通过行列确定按键位置。 实验板上矩阵键盘为 16 键,但没有采用 4×4 方式,在实验板中,使用 PB 口低 3 位作 为行扫描,PC 口作为列扫描,这样总共可以控制 24 个按键,但实验板上只设置了 16 个按 键。实现 16 键矩阵键盘更节省口线的方式为 4 行 4 列模式,在实现 4×4 按键的条件下只使 用了 8 条口线,比实验板上方式节省 3 根口线。采用这种方式可以将矩阵键盘的行、列分别 接到 PC 口的高低 4 位,但因为同时 PC 口作为 LED 的位选码输出口,因此在编程时需要频 繁切换 PC 口工作模式,增加编程的复杂程度。另一种方法是将高低四位分别连接到 PB、PC 口的低(或高)4 位,但因为 PC 口 8 条口线全部用于 LED 显示,因此剩余的口线只有 PB 口 的高(或低)4 位,相比于实验板的连接方法,反而多占用了一条口线。 由于矩阵键盘编程操作较为复杂,对矩阵键盘的扫描程序进行封装可以大大提高编程的 效率,降低编程难度,这也体现了模块化编程的思想。下面分别给出实验板矩阵键盘扫描程 序的汇编语言和 C 语言实现。
4
生物医学测量实践 8255A 在矩阵键盘及 LED 动态显示中的应用
;=======================矩阵键盘扫描汇编实现===============================
;出口:A,为键码值
;占用:R0,R2,R4,R6,R7,2 字节堆栈
;键值:(对应实验板上实际键盘排列方式)(16 进制)
100 100 100 100 100 100 100 100
a b c d e f g dp
BIT71 BIT62 d3
4 e5 BIT56 dp 7 BIT48
10K 10K 10K VCC
PNP7
D1 LED1
BIT1 B BIT2 G DA DOT2 C E DOT BIT3 F DP NO BIT4 NO
目录
一、8255A 简介…………………………………………………………………………………1 二、8255A 与单片机的连接……………………………………………………………………2 三、8255A 与键盘及 LED 的连接………………………………………………………………3 四、矩阵键盘的原理与实现……………………………………………………………………4 五、动态 LED 显示的原理与实现………………………………………………………………7 六、键盘、LED 综合应用例程…………………………………………………………………9 七、总结…………………………………………………………………………………………20
3
生物医学测量实践 8255A 在矩阵键盘及 LED 动态显示中的应用
共同控制的按键对应实验板第一行 4 个按键,PB1 与 PC 共同控制的按键对应实验板第二行 4 个按键,PB2 与 PC 共同控制的按键对应实验板最后两行 8 个按键,这样用 11 个口线实现 了 16 个键盘输入。
PA 口作为 LED 的段码输出口,PC 口作为 LED 的位选输出口,通过 PNP 型三极管为 LED 提供位电流。实验板使用的 LED 为两组 4 位共阳数码管,组合实现 8 个数字或符号的显示。
生物医学测量实践 8255A 在矩阵键盘及 LED 动态显示中的应用
一、8255A 简介
8255A 是英特尔公司生产的一种可编程并行 I/O 接口芯片,在早期单片机系统中十分常 见,广泛应用于实际工程中,例如 8255A 与 A/D、D/A 配合构成数据采集系统,通过 8255A 连接的两个或多个系统实现相互之间的通信,系统与外设之间通过 8255A 交换信息,等等。
8255A 除 PA、PB、PC 三组端口外,还有一组没有输入输出的控制口,作为 8255A 的控 制寄存器,与 PA、PB、PC 统一编址,用于控制 8255A 的工作方式。8255A 控制寄存器有 8 位,每位功能如下图:
图 1 8255A 控制字 8255A 有 0、1、2 三种工作方式,分别为基本输入/输出方式、选通输入/输出方式、选 通输入/输出方式。本实验板使用方式 0。在方式 0 中,每组端口都可以编程为输入、输出 口,但不可以编程为双向口。本实验板使用工作方式 0,且 PA 口作为输出,控制 LED 段码、 PC 口作为输出,控制 LED 位选码和键盘列扫描,PB 口作为输入,控制键盘行扫描,因此 8255A 的控制字为:10000010(2),即 0x82。