第二十二课 键盘接口与编程 二
上一课我们讨论了独立式键盘的工作原理和编程方法 这一课再来讲解矩阵式键盘的工作原理和
编程方法
一 矩阵式键盘的连接方法和工作原理
什么是矩阵式键盘 当键盘中按键数量较多时 为了减少 I/O 口线的占用 通常将按键排列成矩 阵形式 如下图所示 在矩阵式键盘中 每条水平线和垂直线在交叉处不直接连通 而是通过一个按键 加以连接 这样做有什么好处呢 大家看下面的电路图 一个并行口可以构成 4*4=16 个按键 比之直 接将端口线用于键盘多出了一倍 而且线数越多 区别就越明显 比如再多加一条线就可以构成 20 键
的键盘 而直接用端口线则只能多出一个键9 键由此可见 在需要的按键数量比较多时 采用矩 阵法来连接键盘是非常合理的
矩阵式结构的键盘显然比独立式键盘复杂一些 识别也要复杂一些 在上图中 列线通过电阻接
电源 并将行线所接的单片机 4 个 I/O 口作为输出端 而列线所接的 I/O 口则作为输入端 这样 当按 键没有被按下时 所有的输出端都是高电平 代表无键按下 行线输出是低电平 一旦有键按下 则输 入线就会被拉低 这样 通过读入输入线的状态就可得知是否有键按下了 具体的识别及编程方法如下 所述
二 矩阵式键盘的按键识别方法
确定矩阵式键盘上任何一个键被按下通常采用 行扫描法 或者 行反转法 行扫描法又称为 逐行或列扫描查询法 它是一种最常用的多按键识别方法 因此我们就以 行扫描法 为例介绍矩
阵式键盘的工作原理
87
----------------
1 判断键盘中有无键按下
将全部行线 X0-X3 置低电平 然后检测列线的状态 只要有一列的电平为低 则表示键盘中有键 被按下 而且闭合的键位于低电平线与 4 根行线相交叉的 4 个按键之中 若所有列线均为高电平 则表 示键盘中无键按下
2 判断闭合键所在的位置
在确认有键按下后 即可进入确定具体闭合键的过程 其方法是 依次将行线置为低电平即在 置某根行线为低电平时 其它线为高电平当确定某根行线为低电平后 再逐行检测各列线的电平状
态 若某列为低 则该列线与置为低电平的行线交叉处的按键就是闭合的按键
下面给出一个具体的例子
单片机的 P1 口用作键盘 I/O 口 键盘的列线接到 P1 口的低 4 位 键盘的行线接到 P1 口的高 4
位 也就是把列线 P1.0-P1.3 分别接 4 个上拉电阻到电源 把行线 P1.4-P1.7 设置为输出线 4 根行线
和 4 根列线形成 16 个相交点 如上图所示
检测当前是否有键被按下 检测的方法是 P1.4-P1.7 输出全 0读取 P1.0-P1.3 的状态 若
P1.0-P1.3 为全 1则说明无键闭合 否则有键闭合
去除键抖动 当检测到有键按下后 延时一段时间再做下一次的检测判断 若仍有键按下 应识 别出是哪一个键闭合 方法是对键盘的行线进行扫描 P1.4-P1.7 按下述 4 种组合依次输出 P1.7-1110
P1.6-1101 P1.5-1011 P1.4-0111 在每组行输出时读取 P1.0-P1.3 若全为 1则表示为 0 一 行的没有键闭合 否则就是有键闭合 由此得到闭合键的行值和列值 然后可采用计算法或查表法将闭
合键的行值和列值转换成所定义的键值 为了保证按键每闭合一次 CPU 仅作一次处理 必须去除键释放 时的抖动 看下面的实例
三 矩阵式键盘的实验程序 ORG 0030H ; SCAN MOV P1,#0FH ;
MOV
A,P1
;
ANL
A,#0FH
;
CJNE A,#0FH,NEXT1 ; SJMP NEXT3 ; NEXT1:ACALL D20Ms ; MOV A,#0EFH ; NEXT2:MOV R1,A ;
MOV
P1,A
;
MOV
A,P1
;
ANL
A,#0FH
;
CJNE A,#0FH,KCODE ; MOV A,R1 ; SETB C ; RLC A ;
JC NEXT2 ; NEXT3:MOV R0,#00H ;
RET ;
KCODE:MOV
B,#0FBH
;
NEXT4:RRC
A
;
INC B ;
JC NEXT4 ; MOV A,R1 ;
88
----------------
SWAP A ; NEXT5:RRC A ; INC B ; JC NEXT5 ; NEXT6:MOV A,P1 ; ANL A,#0FH ; CJNE A,#0FH,NEXT6;
MOV
R0,#0FFH
;
RET
;
END
由于我们的实验设备不能做这个实验 所以上面的程序只能请大家自行分析一下 事实上开发多 键盘的应用系统是非常复杂的 为了不增加大家的学习难度 这里只给大家讲一个基本的概念 您只要 稍微了解一下就可以了 详细的内容我们将留到下册中再来仔细地讨论 如果你确实在实际的应用中碰 到了这样的问题 可以电话或者 E-mail 与我联系 我会尽力的帮助你大家
四 本课总结
事实上 在比较复杂的单片机系统中 键盘的的设计只是程序设计的一部分 在这种系统中 还 会有很多的其他程序 设计这种系统也是一项非常复杂的工作 作为初学者我们对此有所了解就已经可 以了 若您想尽快的掌握这方面的知识 请继续学习教程的下册部分
五 第 22 课习题
1 矩阵式键盘采用什么样的扫描方式
2 识别矩阵式键盘包括哪几个步骤
89
----------------
第二十三课 数码管接口与编程 一
如果说键盘构成的是单片机的输入系统 那么数码管就是单片机的输出系统 和学会使用键盘接
口一样 学会数码管的接口与编程对单片机的开发同样有着十分重要的意义 这一课我们就来讲解数码 管的接口与编程方法
一 LED 数码显示器的连接与显示方法
在单片机系统中 通常用 LED 数码显示器来显示各种数字或符号 由于它具有显示清晰 亮度高
使用电压低 寿命长的特点 因此使用非常广泛 那么数码管是如何工作的呢 我们学习数字电路时讲
过 可能大家都忘得差不多了 这里我再从头给大家讲一遍 您可不要觉得我烦哦
还记得我们小时候玩过的 火柴棒游戏 吗 几根火柴棒组合起来 可以拼成各种各样的图形
LED 显示器实际上就是利用这个原理做成的
八段 LED 显示器由 8 个发光二极管组成 其中 7 个长条形的发光管排列成一个 日 字形 另一 个圆点形的发光管在显示器的右下角作为显示小数点用 它能显示各种数字及部份英文字母 LED 显示
器有两种不同的连接形式 一种是 8 个发光二极管的正极连在一起 称之为共阳极 LED 显示器 另一种
是 8 个发光二极管的负极连在一起 称之为共阴极 LED 显示器 它们的内部电路图如下所示
勘误 图中有一点点小错误 把 H 端漏了 由于这是用 CAD14 画的 现在改起来不方便 请大
家注意一下由图可以看出 共阳和共阴结构的 LED 显示器各笔划段名的安排位置是相同的 当二极管 导通时 相应的笔划段就发亮 由发亮的笔划段组合而显示出各种字符 八个笔划段 h在许多书中用
dp 来表示 其实是一个意思gfedcba 对应于一个字节8 位的 D7 D6 D5 D4 D3 D2 D1 D0,于是用 8
位二进制码就可以表示欲显示字符的字形代码 例如 对于共阴 LED 显示器 当公共阴极接地 零电平
阳极 hgfedcba 各段为 01110011 时 显示器就显示 P 字符 即 P”字符的字形码是 73H 而如果是共 阳极 LED 显示器 公共阳极接高电平 显示 P”字符的字形代码应为 100011008CH这里必须注意
的是 很多产品为了方便接线 常常不按照规则的方法去对应字段与位的关系 这时字形码就必须根据
接线来自行设计了 后面我们会给出一个例子让大家参考 那么数码管和单片机又是如何连接的呢 请 继续往下看
90
----------------
二 LED 数码管的静态显示方法
在单片机的应用系统中 数码管显示器的显示常采用两种方法 静态显示和动态扫描显示 所谓 静态显示 就是把多个 LED 显示器的每一段与一个独立的并行口连接起来 而公共端则根据数码管的种 类连接到 VCC 或 GND 端 这种连接方式的每一个显示器都要占用一个单独的具有锁存功能的 I/O 端口 用于笔划段字形代码 单片机只需把要显示的字形代码发送到接口电路 就不用再管它了 直到 要显示新的数据时 再发送新的字形码 因此 使用这种方法当显示位数较多时单片机中 I/O 口的开销 很大 需要提供的 I/O 接口电路也较复杂 但它具有编程简单 显示稳定 CPU 的效率较高的优点
下面我们以常用的串-并转换电路 74LS164 为例 介绍一种常用的静态显示电路 以使大家对静态 显示有一个基本的了解 请看下面的电路图
MCS-51 单片机串行口方式称为移位寄存器方式 外接 6 片 74LS164 作为 6 位 LED 显示器的静态显
示接口 我们把单片机的 RXD 作为数据输出线 TXD 作为移位时钟脉冲 74LS164 为 TTL 单向 8 位移位 寄存器 可实现串行输入 并行输出 其中 A B1 2 脚为串行数据输入端 2 个引脚按逻辑 与
运算规律输入信号 只有一个输入信号时可并接 T8 脚为时钟输入端 可连接到串行口的 TXD 端
每一个时钟信号的上升沿加到 T 端时 移位寄存器移一位 8 个时钟脉冲过后 8 位二进制数全部移入
74LS164 中 R9 脚为复位端 当 R=0 时 移位寄存器各位复 0只有当 R=1 时 时钟脉冲才起作
用 Q1 Q8 3-6 脚和 10-13 脚 为并行输出端 分别接到 LED 显示器的 hgfedcba 各段对应的引脚上
关于 74LS164 还可以作如下的介绍 所谓时钟脉冲端 其实就是需要高 低 高 低的脉冲 不 管这个脉冲是怎么来的 比如 我们用根电线 一端接 T 一端用手拿着 分别接高电平 低电平 那
也是给出时钟脉冲 在 74LS164 获得时钟脉冲的瞬间再讲清楚点 是在脉冲的前沿如果数据输入 端1 2 脚是高电平 则就会有一个 1 进入到 74LS164 的内部 如果数据输入端是低电平 则就
会有一个 0 进入其内部 在给出了 8 个脉冲后 最先进入 74LS164 的第一个数据到达了最高位 然
后再来一个脉冲会有什么情况发生呢 第一个脉冲就会从最高位移出 就象车站排队买票 栏杆就那么
长 要从后面进去一个人 就必须要从前面走出去一个人才行
搞清了这一点 让我们再来看电路图电路图在后面的附录中6 片 74LS164 首尾相串 而时钟 端则连接在一起 这样 当第一次输入 8 个脉冲时 从单片机 RXD 端输出的数据就进入到了第一片 74LS164
中了 而当第二次 8 个脉冲到来后 这个数据就进入到了第二片 74LS164 新的数据则进入了第一片
74LS164 中 这样 当第六次 8 个脉冲完成后 首次送出的数据被送到了最左面的 74LS164 中 其他 的数据则依次出现在第一 二 三 四 五片 74LS164 中 这里有个问题 在第一次 8 个脉冲到来时
除了第一片 74LS164 中接收数据外 其他各片在干吗呢 它们也在接收数据 因为它们的时钟端都是被 接在一起的 可是数据还没有送到其他各片呢 它们在接收什么数据呢 其实所谓数据不过是一种说法 而已 它实际上就是电平的高或低 当第一次 8 个脉冲到来时 第一片 74LS164 固然是从单片机接收数
91
----------------
据了 而其它各片也接到前一片的 Q8 上 而 Q8 是一根电线 在数字电路中它只可能有两种状态 低电 平或高电平 也就是 0”和 1” 所以它的下一片 74LS164 也相当于是在接收数据 只是接收的全部是
0 或 1 而已 这个问题放在这儿来讲 可能有的朋友不屑一顾 而有的朋友可能还是不清楚 这 实际上涉及到数的本质的问题 如果不懂 请并回到前面的内容再仔细的复习一遍 或找一些数字电路 方面的书籍看一下 理解了 74LS164 的工作原理 再来看这个问题就会变得简单多了 这里就算给大家 留个习题吧 希望大家务必把 74LS164 的工作原理搞清楚 搞懂了这一点 您的级别就超过初级了 变 成中级了
接下来让我们做一个实验 做这个实验也需要一套附件 这套附件由于大家只用一次 所以各位 可以到我这儿来借 同样免费使用 不过还是那句老话 请各位多多爱惜哦 不要把它搞坏了
我们把附件的两根线连接到实验板的 P3 口扩展插座和实验仪的电源接口上 先看实验要求
输入 把要显示的数分别放在显示缓冲区 60H-65H 共 6 个单元中 并且分别对应各个数码管
LED1-LED6
输出 将预置在显示缓冲区中的 6 个数转换成相应的显示字形码 然后输出到显示器中显示出来
程序如下
ORG 0000H ; AJMP START ; ORG 30H ; START:MOV SP,#6FH;
MOV
65H,#0
;
MOV
64H,#1
;
MOV
63H,#2
;
MOV
62H,#3
;
MOV
61H,#4
;
MOV
60H,#5
;
LCALL DISP ; SJMP $ ;
DISP:MOV SCON,#00H ;初始化串行口方式 0
MOV
R1,#06H
;显示 6 位数
MOV
R0,#65H
;60H-65H 为显示缓冲区
MOV
DPTR,#SETTAB
;字形表的入口地址
LOOP:MOV A,@R0 ;取最高位的待显示数据
MOVC A,@A+DPTR ;查表获取字形码 MOV SBUF,A ;送串口显示 DELAY:JNB TI,DELAY ;等待发送完毕
CLR
TI
;清发送标志
DEC
R0
;指针下移一位
准备取下一个待显示数
DJNZ
R1,LOOP
;直到 6 个数据全显示完
RET
;
SETTAB: ;字形表 前面有介绍 后面我们会介绍字形表的制作
DB 03H,9FH,27H,0DH,99H,49H,41H,1FH,01H,09H,0FFH; END
如果按图示数码管排列 则以上程序将显示 543210
不过我们的实验板是做不了这个实验的 为什么 我们稍候再讲 先让我们来讲解一下字形表的 制作问题 先就上述标准的图形来做 写出数据位和字形的对应关系并列一个表如下共阳接法 也就
是输出为 0 时笔段亮
92
----------------
怎么样 不算复杂吧 就是这样列个表格 根据要求0 亮 1 灭写出相应位的 0 和 1
就可以了 接着练习一下 写出显示 A-F 的字形码
数据位 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
字型码 |
笔段位 |
A |
B |
C |
D |
E |
F |
G |
H |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
03H |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
9FH |
2 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
27H |
3 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0DH |
4 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
99H |
5 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
49H |
6 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
41H |
7 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1FH |
8 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
01H |
9 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
09H |
不过这是按照上面的标准接线排列的 在实际的程序设计中 有时为了接线方便常常会把接线顺
序打乱
我们的实验板就是这样的
那么此时的字形表又该如何做呢 其实也很简单 一样地列表
以我们的实验板为例 同样显示 9876543210 共阴极接法
注意 和共阳极接法的区别
接线如下
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 对应 g f a b h c d e 则字形码如下所示
0 11101110/EEH 1 00101000/28H 2 11001101/ CDH 3 01101101/ 6DH 4 00101011/
2BH 5 01100111/67H 6 11100111/E7H 7 00101100/2CH 8 11101111/EFH 9 00101111/ 2FH
继续练习 写出显示 A-F 的字形码 下面提个问题 如果是共阳极的接法 字形码又该是怎么样的呢
不用我再说了吧 如果学到现在连这个还不明白 那真的是惨了
现在让我们来继续上面的实验 把 543210 的字形码放入上面的查表程序中 即 DB 后面
如果要显示 012345 我们的程序又该如何修改呢 自己想一下
三 本课总结
这一课主要讨论数码管的静态显示原理及编程方法 在实际的应用中远比这些要复杂的多 不过
在我们的上册课程中 目的是为了让大家尽快的进入到单片机的应用中来 所以我这里只能讲这么多
如果您想学习更多的知识 只有继续学习课程的下册部分 当然如果您现在就要用到这方面的内容 我 可以协助您开发和设计
四 第 23 课习题
1
什么是 LED 数码管的共阳接法
它与共阴接法有什么不同
2
深入了解 74LS164 的工作原理
3
了解 74LS165 的作用和功能
93
----------------
第二十四课 数码管接口与编程 二
上一课讲解了数码管的静态显示方法 这一课专门来讨论数码管的动态显示方法
一 LED 数码显示器的动态显示方法
由于静态显示占用的 I/O 口线较多 CPU 的开销很大 所以为了节省单片机的 I/O 口线 常采用 动态扫描方式来作为 LED 数码管的接口电路 在实际的工程应用中 它是使用最为广泛的一种显示方式
其接口电路是把所有显示器的 8 个笔划段 h-a 同名端连在一起 而每一个显示器的公共极 COM 端与各自 独立的 I/O 口连接 当 CPU 向字段输出口送出字形码时 所有显示器接收到相同的字形码 但究竟是那 个显示器亮 则取决于 COM 端 而这一端是由另外的 I/O 口控制的 所以我们就可以自行决定何时显示 哪一位了 而所谓动态扫描就是指我们采用分时的方法 一位一位地轮流控制各个显示器的 COM 端 使 各个显示器每隔一段时间点亮一次
在轮流点亮的扫描过程中 每位显示器的点亮时间是极为短暂的约 1ms 左右由于人的视觉 暂留现象及发光二极管的余辉效应 尽管实际上各位显示器并非同时点亮 但只要扫描的速度足够快
给人的印象就是一组稳定的显示数据 不会有闪烁感
在我们实验板的电路图中 我们把 89C52 的 P2 口作为位选端即同名端 abcdefgh并联起来
而把它们的片选端分别与 P3.5 和 P3.6 连接 图中为了增加 P3.5 和 P3.6 的驱动能力采用了一个三极管
这样由 P3.5 和 P3.6 控制对应数码管的亮或灭 只要给 P2.0 送入不同的字形码 就能显示不同的数了
下面的这个程序 就是用我们实验板上的两个数码管来显示 0 和 1电路的连接方法请看后面的 实验板电路图
FIRST EQU P3.6 ;第一位数码管的位控制 SECOND EQU P3.5 ;第二位数码管的位控制 DISPBUFF EQU 5AH ;显示缓冲区为 5AH
ORG 0000H ; AJMP START ; ORG 30H ;
START:MOV SP,#5FH ;设置堆栈
MOV
P0,#0FFH
;
MOV
P1,#0FFH
;
MOV
P2,#0FFH
;初始化所有显示器
LED 灭
MOV
DISPBUFF,#0
;第一位显示 0
MOV
DISPBUFF+1,#1
;第二位显示 1
LOOP:LCALL DISP ;调用显示程序
AJMP LOOP ;主程序到此结束
DISP:PUSH ACC ;ACC 入栈
PUSH PSW ;PSW 入栈
MOV A,DISPBUFF ;取第一个待显示数
MOV DPTR,#DISPTAB ;字形表首地址
MOVC A,@A+DPTR ;取数字 0 的字形码
MOV P2,A ;将字形码送 P2 口
SETB FIRST ;打开第一位显示器位选端
LCALL DELAY ;延时 1 毫秒
CLR FIRST ;关闭第一位显示器开始准备第二位的数据
94
----------------
MOV A,DISPBUFF+1 ;取显示缓冲区的第二位
MOV DPTR,#DISPTAB ;第二个字形码地址
MOVC A,@A+DPTR ;去数字 1 的字形码
MOV P2,A ;将第二个字形码送 P2 口 SETB SECOND ;打开第二位显示器位选端 LCALL DELAY ;延时 1 毫秒
CLR SECOND ;关闭第二位显示器
POP
PSW
;
POP
ACC
;
RET
;
DELAY:PUSH PSW ;
SETB RS0 ; MOV R7,#50 ; D1:MOV R6,#10 ; D2:DJNZ R6,$ ; DJNZ R7,D1 ;
POP
PSW
;
RET
;
DISPTAB:DB 0EEH 28H 0CDH 6DH 2BH 67H 0E7H 2CH 0EFH 2FH
END
从上面的例子中可以看出 动态扫描显示必须由 CPU 不断地调用显示程序 才能保证持续不断的 显示 上面的这个程序虽然可以实现数字的显示 但过于简单了 我们学到现在也应该做点复杂一些的 实验 比如让两个 LED 从 0 显示到 99 不断的循环 这可是很经典的程序 几乎所有用数码管显示的 系统都会把它作为初始化的显示程序 看下面的实验程序
a_bit equ 20h ;个位数存放处 b_bit equ 21h ;十位数存放处 temp equ 22h ;计数器寄存器 star: mov temp,#0 ;初始化计数器 stlop: acall display
inc temp mov a,temp
cjne a,#100,next ;=100 重来
mov temp,#0
next: ljmp stlop
;显示子程序
display: mov a,temp ;将 temp 中的十六进制数转换成 10 进制
mov b,#10 ;10 进制/10=10 进制
div ab
mov b_bit,a ;十位在 a mov a_bit,b ;个位在 b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示 1000 次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的 7 段代码
95
----------------
mov p2,a ;送出个位的 7 段代码
clr p0.7 ;开个位显示 acall d1ms ;显示 1ms setb p0.7
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的 7 段代码
mov p2,a ;送出十位的 7 段代码
clr p0.6 ;开十位显示 acall d1ms ;显示 1ms setb p0.6
djnz r1,dplop ;100 次没完循环
djnz r0,dpl1 ;4 个 100 次没完循环
ret
;*************************1MS 延时(按 12MHZ 算)************************ D1MS: MOV R7,#50 ;
D1:MOV R6,#200 ; D2:DJNZ R6,$ ; DJNZ R7,D1
RET
numtab: db DB 0EEH 28H 0CDH 6DH 2BH 67H 0E7H 2CH 0EFH 2FH
END
细心的朋友可能看出来了 这段指令中有的是用大写字母来写的 而有的是用小写字母来写的
有什么区别吗 在 KEIL C51 中用汇编写程序的时候是不区分大小写的 你完全可以根据自己的书写习 惯来写 不过标号是不能前面的用大写 后面的用小写 这样编译时会出错 好了 不多说了 你还是 自己试试吧
这段程序可以完成从 0-99 的显示循环 当然在实际的产品中 不可能只显示两个数字不做其他的
事 不过程序的结构和思路是没有问题的
从上面的程序中我们可以看出 与静态扫描相比 动态扫描的程序稍微有点复杂 但这是值得的
因为它可以大大节省单片机的 I/O 口线资源 所以在实际的工程应用中几乎都采用动态扫描的方法来进 行数码管的显示 我们的这个程序也具有一定的通用性 只要改变端口的值及计数器的值就可以显示更 多的位数了
不过正如我前面所说的那样 单片机的程序设计在实际应用中还会考虑很多的其他问题 所以这 一课的内容同样只是给大家以后的学习打一个基础 倒是下面的 LED 数码管的选择原则和驱动方法大家 有必要了解一下
二 LED 数码管的选择和驱动
LED 数码管是单片机人机界面输出中用的最多也是最简单的显示方式 由于单片机口线的驱动能 力是有限的 所以如何来选择和驱动 LED 数码管是单片机初学者的基本功 下面就来给大家介绍一下
前面我们已经讲过 LED 数码管有两种连接方法 一种是共阳接法 一种是共阴接法 在单片机
的应用中 对于共阳接法 我们一般把它叫做 接电源 方法 即把 COM 端接 VCC通过控制 COM
端引脚电平的高低来达到片选的目的 而对于共阴接法 则通常叫做 接地 方法 即把 COM 端接 GND
由于受单片机口线驱动能力的限制 采用直接驱动的方法 只能连接小规格的 LED 数码管 目前 市场上有一种高亮度的数码管 每段工作电流约为 2-3mA 这样当 LED 全亮时 工作电流在 10-20mA 左
右 是普通数码管的 1/5 正好能用单片机的口线直接驱动 因此在条件允许的情况下 应尽量采用这
种 LED 数码管作为显示器件
当然如果想用更高亮度或更大尺寸的数码管来作为显示器件 比如户外的电子钟 大型广告牌等
96
----------------
等 就必须采用适当的扩展电路来实现与单片机的接口 常用的接口元件可以是三极管 集成电路和专 用芯片等
三极管的规格可以根据数码管所需的驱动电流大小进行选择 电流比较小的可以用 9013 8550 等小功率晶体管 电流比较大的则可以用 TIP217 等大功率三极管 而当显示器的位数较多时 一般也 会采用集成电路来作接口 此类集成电路有 2003 2803 7406 75452 等 它们的功能其实就是由多路 晶体管组成的达林顿电路具体电路请大家自己找一些相关的资料查一下 另外还可以使用一种叫译码/
驱动器的芯片 这种芯片能将二-十进制码BCD 码译成七段码a-g以驱动数码管 采用这种芯片 的最大好处是编程简单 并且能提高 CPU 的运行效率 如 CD4511 或 74LS47 等就是此类芯片不过 它
们的驱动能力也是有限的 具体数据请参考有关的 DS 介绍
勘误 真是不好意思 左面的这个图又画错了 四个三极管应该用来驱动片选端 而不是位选
端 请大家千万别照抄 不然出了问题可不要来找我哦 *^*
近几年来 国内外厂商还开发了许多基于串行总线SPI和 I2C 总线方式的 LED 接口芯片 这些 芯片采用 SPI 总线或 I2C 总线方式与单片机进行通讯 具用占用单片机口线少 程序易于实现的特点
比如美信的 MAX7219 力源的 PS7219SPI 总线和 SAA1064I2C 总线等 有些芯片还集成了键盘控 制器 可以实现键盘和显示的双重功能 如 zlg7289 等 关于这方面的内容请您自己找一些相关的资料
来看一下
其实 除了数码管显示外 在实际的工程应用中 单片机还有很多的显示方法 其中比较常用的 就是液晶显示器 液晶显示器是一种低压低功耗的显示器件 它的工作电压一般只要几伏 工作电流仅 有几个微安 是任何数码管显示器件所无法比拟的 除此之外 液晶显示器的最大优点就是可以显示文
字 图形和曲线 与传统的数码管显示器相比 显示界面有了质的提高 采用点阵式的液晶显示器配合 大规模集成电路能够显示大量的信息 目前已经广泛使用在各类中高档仪器仪表及家用电器中 比如数 字万用表 手机 数码相机等等 不过它的使用方法与编程就比较复杂了 我们只有等到下册中再来给 大家讲解了
二 本课总结
到本课为止 我们课程的上册部分已经全部讲完 希望大家课后多进行 练习 因为学习单片机是一种非常注重实践的课程 如果离开了实际的应
用 那么学习再多的理论知识也是非常无效的 课程的下册部分我还在继
97 :http://www.51hei.com 单片机学习中心,为您免费发布大量的学习资源以及商业代码
续的编写之中 等全部写完了会通知大家
由于本人的才疏学浅 教材中难免有疏漏 甚至有许多不正确的地方
希望大家多多批评指正
最后申明 本教程的编写其实多数参考了平凡老师的教程 只
不过看到他写的内容有很多的错误之处 我就进行了大量的整理 和修改 并应用到实际的教学工作中 据说他现在的教程已经出版了 如果大家打印不方便 看电子书觉得累 还是去买一本
不要老想着图小便宜 毕竟人家也是化了很多心血的 支持一下 嘛老想着图小便宜的人也是做不了什么大事的
大家如果看得起我 可以任意的转载和使用 但决不允许把本 教程作为商业用途 只希望后来的兄弟少走一点弯路 我的目的
也就达到了
另外如果您在实际的产品开发中有什么问题的话 可以给我来电或发
98
----------------