Chương 4: Giao tiếp hiển thị
4.1 LED 7 đoạn
4.2 Phương pháp chốt
D1
D[0:7]
U6 74LS573
1
10
11
20
19 18 17 16 15 14 13 12
2 3 4 5 6 7 8 9
OE
GND
LE
VCC
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8 RN4
330x8
1 2 3 4 5 6 7 8
910111213141516
A15
5V
5V
A13
LED4
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1 5V
U4 74LS573
1
10
11
20
19 18 17 16 15 14 13 12
2 3 4 5 6 7 8 9
OE
GND
LE
VCC
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8
C3 10u
5V
5V
A14 U1
AT89C51 9
18 19
20
29 30
31
40
1 2 3 4 5 6 7 8
21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 39
38 37 36 35 34 33 32
RST XTAL2 XTAL1
GND
PSEN ALE/PROG
EA/VPP
VCC
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 D6
D[0:7]
5V
U7B
74LS02 5
6
4
147
RN5 330x8
1 2 3 4 5 6 7 8
910111213141516
D4
5V
5V D3
5V
SW1 Reset
U7C 74LS02 8
9
10
147
C1 30 D7
D[0:7]
5V
5V
U2 74LS138 1
2 3
15 14 13 12 11 10 9 7 6
4 5
A B C
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 G1 G2A G2B
Y1 R1 100
U7A 74LS02 2
3
1
147
RN3 330x8
1 2 3 4 5 6 7 8
910111213141516
RN2 330x8
1 2 3 4 5 6 7 8
910111213141516
D[0:7]
D2 D0
C2 30 D[0:7]
U7D 74LS02 11
12
13
147
5V LED1
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
5V
U5 74LS573
1
10
11
20
19 18 17 16 15 14 13 12
2 3 4 5 6 7 8 9
OE
GND
LE
VCC
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8
R2 10k
LED2
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
LED3
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
U3 74LS573
1
10
11
20
19 18 17 16 15 14 13 12
2 3 4 5 6 7 8 9
OE
GND
LE
VCC
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8
5V
D[0:7]
5V
5V
D5
LED 1: 8000h LED 2: A000h LED 3: C000h LED 4: E000h
Ví dụ 01
• Lập trình cho VXL 89c51 hiển thị lên LED 7 đoạn một số có 4 chữ số:
1486
2357
3769
1087
2789
#include "regx51.h“ #include "absacc.h"
unsigned char x; unsigned char y;
void main(void)
{ while (1) {
x=0x82;
XBYTE[0XE000]=x; // xuat LED 4 ra gia tri 6 x=0x80;
XBYTE[0XC000]=x; // xuat LED 3 ra gia tri 8 x=0x99;
XBYTE[0XA000]=x; // xuat LED 2 ra gia tri 4 x=0xF9;
XBYTE[0X8000]=x; // xuat LED 1 ra gia tri 1 }}
#include "regx51.h“ #include "absacc.h"
unsigned char x; unsigned char y;
unsigned char z[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };
void main(void)
{ while (1) {
x=6;
XBYTE[0XE000]=z[x];
x=8;
XBYTE[0XC000]=z[x];
x=4;
XBYTE[0XA000]=z[x];
x=1;
XBYTE[0X8000]=z[x];
}}
Ví dụ 02
• Trong ô nhớ địa chỉ 31H của RAM chứa số hàng ngàn và hàng trăm, còn ô nhớ 30H chứa số hàng chục và hàng đơn vị.
• Lập trình cho VXL 89c51 hiển thị lên LED
7 đoạn!
#include "regx51.h“ #include "absacc.h" unsigned char x,y;
unsigned char z[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };
void main(void)
{ while (1)
{ y=CBYTE[0x0030]; x= y & 0x0F;
XBYTE[0XE000]=z[x]; x=y & 0xF0;
x>>=4;
XBYTE[0XC000]=z[x]; y=CBYTE[0x0031];
x=y & 0x0F;
XBYTE[0XA000]=z[x]; x=y & 0xF0;
x>>=4;
XBYTE[0X8000]=z[x]; // xuat LED 1 ra gia tri hang ngan
} }
4.3 Phương pháp quét
1k
10k
L1 5V
R1 100
1k Q8
A1015
5V
D[0:7]
5V
D4 L3
D3 D[0:7]
D1
L2
U11
74LS247 7
1 2 6
4 5 3
13 12 11 10 9 15 14
168
D0 D1 D2 D3
BI/RBO RBI LT
A B C D E F G
VCCGND
10k
LED3 1k
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
LED4
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1 1k
L1
L3
5V
5V
D5 Q9 A1015
C2 30 10k
D[0:7]
LED2
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
R2 10k
Q7 A1015
L0 10k
D[0:7]
Q6 A1015
L2
C3 10u LED1
7 6 4 2 1 9 10 5 3 8
a b c d e f g p AN0 AN1
D6 D0 U1
AT89C51 9
18 19
20
29 30
31
40
1 2 3 4 5 6 7 8
21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 39
38 37 36 35 34 33 32
RST XTAL2 XTAL1
GND
PSEN ALE/PROG
EA/VPP
VCC
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD P0.0/AD0
P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
C1 30 Y1 5V
5V
5V 5V
D2
L0
SW1 Reset
Mã nhị phân trên port P1
4 bit BCD hàng ngàn
1 1
1 0
4 bit BCD hàng trăm
1 1
0 1
4 bit BCD hàng đơn chục
1 0
1 1
4 bit BCD hàng đơn vị
0 1
1 1
P1.0 P1.1
P1.2 P1.3
P1.4 LED4 P1.5
LED3 P1.6
LED2 P1.7
LED1
A[0..6]
A[0..6] A[0..6]
A[0..6] A[0..6]A[0..6]
A[0..6]
A[0..6]
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
A0 A1 A2 A3 A4 A5 A6
XTAL2 18
XTAL1 19
30 ALE 31 EA 29 PSEN
9 RST
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
1 P1.0 2 P1.1 3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WRP3.5/T1 1615 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27
U1
AT89C51
X1
12MHz
C1
33nF
C2
33nF
+5V
C3
1nF
R1
100
R2
10k +5V
+5V
+5V
330 330 330 330
330 330 330
R3
1k
Q1
AC128
+5V
330 330 330 330
330 330 330
R18
1k
Q2
AC128
+5V
330 330 330 330
330 330 330
R26
1k
Q3
AC128
+5V
330 330 330 330
330 330 330
R34
1k
Q4
AC128
+5V
330 330 330 330
330 330 330
R42
1k
Q5
AC128
+5V
330 330 330 330
330 330 330
R50
1k
Q6
AC128
+5V
330 330 330 330
330 330 330
R58
1k
Q7
AC128
+5V
330 330 330 330
330 330 330
R66
1k
Q8
AC128
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
Q1 Q2 Q3 Q4 Q5
Q6 Q7 Q8
Ví dụ 03
• Xuất ra LED 7 đoạn hiển thị số 12345678.
Chú ý: 8051 sử dụng thạch anh 12 MHz.
#include "regx51.h“ unsigned char x;
unsigned char z[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };
unsigned char y[8] = {254, 253, 251, 247, 239, 223, 191, 131};
void Delay();
void main(void)
{ P2=0x00; P1=0x00;
while (1)
{ P2=0;
for (x=1;x<8;x++)
{P1=z[x]; P2=y[x-1]; Delay(); }// Delay 10mS P2=0; } }
void Delay()
{TMOD &= 0xF0; TMOD |= 0x00; ET0 = 0;
TH0 = 0xD8; TL0 = 0xEF; TF0 = 0; TR0 = 1;
while (TF0 == 0) {} TR0 = 0; /* Stop Timer 0 */ }
4.4 Giao tiếp với LCD
• LCD viết tắt của từ Liquid Crystal Display (Màn hình tinh thể lỏng).
• LCD có nhiều loại 1x16, 2x16, 4x16, 2x40, 4x40…
LCD1
LCD
1 2 3 4 5 6 7
8 9 10 11 12 13 14
GND Vcc Vee
RS R/WEN DB0DB1
DB2 DB3 DB4 DB5 DB6 DB7
HD44780U 2x16
Sơ đồ chân và chức năng của LCD HD44780
Đường dẫn dữ liệu 7 DB7
14
Đường dẫn dữ liệu 6 DB6
13
Đường dẫn dữ liệu 5 DB5
12
Đường dẫn dữ liệu 4 DB4
11
Đường dẫn dữ liệu 3 DB3
10
Đường dẫn dữ liệu 2 DB2
9
Đường dẫn dữ liệu 1 DB1
8
Đường dẫn dữ liệu 0 DB0
7
Cho phép EN
6
Đọc/ghi RW
5
Lựa chọn thanh ghi lệnh/dữ liệu RS
4
Chỉnh độ tương phản (0 đến +5V) Vee
3
Nguồn nuôi +5V Vcc
2
Nối mass hoặc đất Vss
1
Mô tả Ký hiệu
Chân số
• RS (Register Select): Dùng để điều khiển quá trình gửi một byte lệnh hay 1 byte vào LCD. RS ở mức thấp (0) thì byte gửi tới là lệnh, RS ở mức cao (1) thì byte gửi tới là dữ liệu và được hiển thị trên LCD.
• RW (Read/Write): dùng để khẳng định quá trình ghi vào hay đọc ra. Khi RW ở mức thấp (0) thì thông tin trên bus dữ liệu sẽ ghi vào LCD, RW ở mức cao là đọc trạng thái của LCD.
• EN (Enable): Đây là chân điều khiển, dùng để cho LCD biết rằng LCD đang được nhận dữ liệu vào. Khi EN ở mức thấp (0) thì LCD cho phép nhận dữ liệu, khi EN ở mức cao thì LCD sẽ cho phép truyền thông tin trạng thái.
• Bus dữ liệu 4 bit D4-D7 hay 8 bit D0-D7 phụ thuộc
vào chọn chế độ hoạt động của LCD.
Bảng mã ký tự của LCD
Lệnh của LCD
0Eh Bật mở con trỏ dạng gạch chân ký tự
14h Đưa con trỏ sang phải 1 ký tự
10h Đưa con trỏ sang trái 1 ký tự
Đưa con trỏ về vị trí top/left 2h
Dịch tất cả các dòng sang bên trái 1 ký tự
18h
Dịch tất cả các dòng sang bên phải 1 ký tự
1Eh
4-bit interface, 1 line, 5*7 Pixels
20h
28h
4-bit interface, 2 lines, 5*7 Pixels
30h
8-bit interface, 1 line, 5*7 Pixels 8-bit interface, 2 lines, 5*7 Pixels
38h
Lệnh
Chức năng
Lệnh của LCD
80+địa chỉ
Xác định vị trí con trỏ Xóa màn hình hiển thị
01h
Để trống hiển thị (không xóa)
08h
Tắt con trỏ
0Ch
0Fh Bật mở con trỏ dạng nhấp nháy
Lệnh
Chức năng
Ví dụ kết nối 8051 và LCD
5V 5VC3 10u
LCD
5V LCD1LCD
1 23
4 5 6
7891011121314
GND Vcc Vee RS R/W EN
DB0DB1DB2DB3DB4DB5DB6DB7
C1 30
R1 100 SW1 Reset
R5 5k
C2 30
Y1 5V
R2 10k
5V
U1
AT89C51 9
18 19
20
29 30
31
40
1 2 3 4 5 6 7 8
21 22 23 2425 26 27 28 10
11 12 1314 15 16 17
39 38 37 36 35 34 33 32
RST XTAL2 XTAL1
GND
PSEN ALE/PROG
EA/VPP
VCC
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD
P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
D[0..7]
D7
D0 D1 D2 D3 D4 D5 D6
D7 D6 D5 D4 D3 D2 D1 D0
D714D613D512D411D310D29D18D07
E6RW5RS4
VSS1 VDD2 VEE3
XTAL2 18
XTAL1 19
30 ALE 31 EA 29 PSEN
9 RST
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
1 P1.0 2 P1.1 3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WRP3.5/T1 1615 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 GND
5 V
GND
GND 5 V
Y1
5V
U1
AT89C51 9
18 19
20
29 30
31
40
1 2 3 4 5 6 7 8
21 22 23 24 25 26 27 28 10
11 12 13 14 15 16 17
39 38 37 36 35 34 33 32
RST XTAL2 XTAL1
GND
PSEN ALE/PROG
EA/VPP
VCC
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD
P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
SW1 Reset
R1 100 R2 10k C3 10u
LCD
LCD1
LCD
1 2 3 4 5 6
7891011121314
GND Vcc Vee RS R/W EN
DB0DB1DB2DB3DB4DB5DB6DB7
C2 30
R5 5k
5V 5V
5V
5V C1 30
Định nghĩa các dòng lệnh cho LCD
typedef unsigned char bit8; // dữ liệu 8 bit /* các dòng lệnh cho LCD */
const bit8 spec = 0x38; // ô hiển thị có 5x8 điểm ảnh const bit8 LcdCur_ON = 0x0E; // bật tắt con trỏ
const bit8 Lcd_Clr = 0x01; // xoá hết LCD
const bit8 Curser_Right = 0x06; // di dời con trỏ sang phải
const bit8 Curser_HOME = 0x02; // di dời con trỏ về vị trí đầu
/* Định nghĩa chân tín hiệu */
sbit RS = P2^0; // Chân reset
sbit RW = P2^1; //Chân đọc viết Read/write
sbit E = P2^2; // Chân enable/disable
sbit busyCheck = P3^7; //Chân kiểm tra bận
/* Chương trình con kiểm tra trạng thái bận của LCD */
void getReady() {
E = 0; /* Cho LCD hoạt động */
busyCheck = 1; /* Bit bận = 1 */
RS = 0; /* Ra lệnh cho LCD */
RW = 1; /* LCD đọc lệnh */
while (busyCheck != 0) /* Đợi cho đến khi LCD hết bận*/
{
E = 0;
E = 1;
} E = 1;
}
/* chương trình con xuất mã lệnh cho LCD */
void writeCmd(bit8 cmd) {
getReady(); /* kiểm tra trạng thái bận ?*/
E = 0; /* Cho phép LCD hoạt động*/
P3 = cmd; /* mã lệnh gửi tới Port3 */
RS = 0; /*Chọn thanh ghi*/
RW = 0; /* Cho phép ghi vào LCD */
E = 1;
E = 0;
}
/* chương trình con cài đặt ban đầu cho LCD */
void init() {
writeCmd(spec);
writeCmd(LcdCur_ON);
writeCmd(Lcd_Clr);
writeCmd(Curser_Right);
writeCmd(Curser_HOME);
}
vị trí con trỏ LCD
Lệnh xác định vị trí con trỏ LCD: 80h + địa chỉ con trỏ /*Chương trình con di dời vị trí con trỏ*/void
LcdMoveCursor(unsigned char row, unsigned char col) {
writeCmd((0x80) + (row << 6) + col);
}
/* Chương trình con hiển thị một đoạn chữ lên LCD*/
/* Khai báo con trỏ 8 bit ban đầu*/
bit8 code *text;
/* Chương trình con*/
void writeString(bit8 *str) {
bit8 i;
unsigned int j;
getReady();
E = 0;
for(i=0;str[i]!='\0';i++) {
P3=str[i];
RS = 1;
RW = 0;
E = 1;
E = 0;
for(j = 0; j<25000; j++);
} }
/* Chương trình con hiển thị một ký tự (char) lên LCD */
void writeChar( unsigned char x) {
unsigned int j;
unsigned char i;
i=0;
i=x+0x30; /* Chuyển đổi Char qua mã ASCII*/
getReady();
E = 0;
P3=i; /* Xuất mã ASCII của ký tự ra LCD*/
RS = 1;
RW = 0;
E = 1;
E = 0;
for(j = 0; j<25000; j++);
}
4.4 LED ma trận
LED12
LED Matric 8x8 0
1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
0 1 2 3 4 5 6
7 8 9 10 11 12 13 14 15
D4
U4
74LS138 12
3
1514 1312 1110 97 64
5 A BC
Y0 Y1Y2 Y3Y4 Y5Y6 Y7 G1 G2AG2B
LED9 LED Matric8x8
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
0 1 2 3 4 5 6
7 8 9 10 11 12 13 14 15
D0
D[0:7]
5V
R1 100 A14
D2
U5A 7402
2 31
D3 D3
5V A13
D3
5V
5V
U2
74ACQ573/FP 1
10
11
20
1918 1716 1514 1312 23
45 67 89
OE GND LE
VCC
Q1 Q2Q3 Q4Q5 Q6Q7 Q8 D1 D2D3 D4D5 D6D7 D8
D7
D6D7
A[13:15]
D0
D5
A14
A[13:15]
D4
D2
D1
U1
AT89C51 9
1819
20
2930 31
40
1 23 45 67 8
2122 2324 2526 2728
10 1112 1314 1516 17 3938
3736 3534 3332
RST XTAL2 XTAL1
GND
PSEN ALE/PROG
EA/VPP
VCC
P1.0P1.1 P1.2P1.3 P1.4P1.5 P1.6P1.7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD P0.0/AD0
P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
A13
D[0:7]
D7
A15 D4
D6
R210k ResetSW1
Y1
Dia chi U2: C000H Dia chi U3: E000H
5V C1 30
D2
C3 10u
D1
D1 5V
D5
D5
A[13:15]
D6
C2 30
D0
A15
U3
74ACQ573/FP
1
10
11
20
19 18 17 16 15 14 13 12
2 3 4 5 6 7 8 9
OE
GND
LE
VCC
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8
U5B 7402
5 64