项目四 电子万年历系统设计
21 22 23 24 25 26 P2.5 27 P2.6 28 P2.7
RXD TXD ALE/P PSEN
10 11 30 29
4.2单片机与LCD液晶显示模块接口
#include <reg51.h>
#define uchar unsigned char
sbit LCDEN=P1^5;
//
使能信号,H为读,H跳变
74ABLS16124
CLK GND
8 VMCRC7
194
7AB4LS16124
CLK GND
8 VMCRC7
194
7AB4LS16124
CLK GND
8 VMCRC7
194
74ABLS16124
CLK GND
8 VMCRC7
194
B A
2 1
19 18
X1 X2
9 RESET
17 16
RXD TXD ALE/P PSEN
时钟脉冲,P0.0作为数据输出线。
DS1
DS2
DS3
DS4
DS5
U1
1 2 3 4 5 6 7 8
P10 P11 P12 P13 P14 P15 P16 P17
P00 P01 P02 P03 P04 P05 P06 P07
39 38 37 36 35 34 33 32
dp
8
g7
d
f6
c
ee 5
b
g
f
Y a=4?
N
发送第(4-a)个数码 管的字型码
sent(dispb[4-a])
Y i=8?
N
ch=ch<<1; DIN=CY; CLK=0; CLK=1;
显示子程序
a++ 返回
i++ 返回
4.1单片机与LED数码管接口
三、LED数码管动态显示原理
动态扫描显示接口是单片机中应用最为广泛的一种显示方 式之一。其接口电路是把所有数码管的8个笔划段a-h同名端连在 一起,而每一个数码管的公共极COM是各自独立地受控制。CPU向 字段输出口送出字形码时,所有显示器接收到相同的字形码,但 究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的, 所以就可以自行决定何时显示哪一位了。而所谓动态扫描就是指 采用分时的方法,轮流控制各个显示器的COM端,使各个显示器 轮流点亮。
4.1单片机与LED数码管接口
共阴数码管码表
0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f
0
1
2
3
4
5
6
7
8
, 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00
0x93f , 0x0A6 , 0x5b B, 0x4f , 0Cx66 , 0x6Dd , 0x7d , E0x07 , F0x7f 无显示
设置屏幕 1602程序
-----------------------------------------------------------------------------------------------------------*/
#define CLEAR_1602 屏
write_com(0x01)
10 11 30 29
RD WR
VCC
VCC
VCC
VCC
VCC
例:上图所示的显示电路,五个数码管分别显示23456。
4.1单片机与LED数码管接口
主程序
开始
显示子程序
设置a=0
发送字型码的子程序
设置i=0;
Ch=dispb[4-a];
给每个数码管赋字型码
dispb[0]=dispcode[2]; dispb[1]=dispcode[3]; dispb[2]=dispcode[4]; dispb[3]=dispcode[5]; dispb[4]=dispcode[6];
1 a DPY
2b
a
3 4
c d
f
g
b
5 ee
c
6f d
7g
dp
8 dp
DS?
DPY_7-SEG_DP
1 a DPY
2b
a
3 4
c d
f
g
b
5 ee
c
6f d
7g
dp
8 dp
DS?
DPY_7-SEG_DP
1 a DPY
2b
a
3 4
c d
f
g
b
5 ee
c
6f d
7g
dp
8 dp
gnd 9
gnd
gnd 9
6 5 4
Q2 Q1 Q0
3
13 12 11 10
Q7 Q6 Q5 Q4 Q3
6 5 4
Q2 Q1 Q0
3
13 12 11 10
Q7 Q6 Q5 Q4 Q3
6 5 4
Q2 Q1 Q0
3
13 12 11 10
Q7 Q6 Q5 Q4 Q3
6 5 4
Q2 Q1 Q0
3
U1
U2
U3
U4
U
8 VMCRC7
194
// 清
#define HOME_1602 返回原点
write_com(0x02)
// 光标
#define SHOW_1602 光标不闪动
write_com(0x0c) //开显示无
#define HIDE_1602
write_com(0x08) //关显示
#define CURSOR_1602
unsigned char sel=0x01;
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<6;i++)
{
P1= dispcode[i]; //字型码
P3=sel;
//位选
sel=sel<<1;
if(sel==0x40) sel=0x01;
}
}
P10 P11 P12 P13 P14 P15 P16 P17
13 12
INT1 INT0
C1
15 VCC 14
T1 T0
33PF Y1 12MHZ
C2
31 EA/VP
19 18
X1 X2
9 RESET
33PF R1 1.2K GND
17 16
RD WR
8031 S1
R2 100
C3 +5V
20
GND
共阳0数码管码表1
2
3
4
5
6
7
8
, 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00
9
A
B
C
D
E
4.1单片机与LED数码管接口
二、LED数码管静态显示原理
LED显示器工作方式有两种:静态显示方式和动态显示方式。 所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能 的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形 代码发送到接口电路,就不用管它了,直到要显示新的数据时, 再发送新的字形码,因此,使用这种方法单片机中CPU的开销小, 可以提供单独锁存的I/O接口电路很多(以串并转换电路74LS164 为例)。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短 暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉 效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度 足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
4.1单片机与LED数码管接口
VC C
40
U1
1 2 3 4 5 6 7 8
4.1单片机与LED数码管接口
g f GNDa b
a
f
b
g
e
c
d ·dp
e dGND c dp
(a)
a b c d e f g dp
共阴极
+5V
a b c
d e
f g dp
(b)
共阳极
使用LED显示器时,要注意区分这两种不同的接法。为了显示数 字或字符,必须对数字或字符进行编码。七段数码管加上一个小数 点,共计8段。因此为LED显示器提供的编码正好是一个字节。根据
到L时为写。
sbit LCDRW=P1^6; // H为读LCD
数据,L为向LCD写数据,如果仅是
写,此端口可直接接地。
sbit LCDRS=P1^7;
write_com(uchar com);
write_dat(uchar date);
4.2单片机与LCD液晶显示模块接口
/*----------------------------------------------------------------------------------------------------------
4.1单片机与LED数码管接口
提高题: 采用动态显示,用定时器以间隔1S在6位数码管上依次显示0、1、 2、3….C、D、E、F,重复。
4.2单片机与LCD液晶显示模块接口
1.阅读说明书 2.读子程序 3.显示简单字符
4.2单片机与LCD液晶显示模块接口
电路原理图
VCC
2 R2
3 3.3K
1 16