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 ;字形表首地址
MOV C A,@A+DPTR ;取数字 0 的字形码
MOV P2,A ;将字形码送 P2 口
SETB FIRST ;打开第一位显示器位选端
LCALL DELAY ;延时 1 毫秒
CLR FIRST ;关闭第一位显示器开始准备第二位的数据
94
----------------
MOV A,DISPBUFF+1 ;取显示缓冲区的第二位
MOV DPTR,#DISPTAB ;第二个字形码地址
MOV C 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 重来
上一页 [1] [2] [3] [4] 下一页
本文关键字:工作原理 键盘 51单片机,单片机-工控设备 - 51单片机