LED 7 đoạn phương pháp chốt Trong ô nhớ địachỉ 31H củaRAM chứasố hàng ngàn và hàng trăm, còn ô nhớ 30H chứasố hàng chụcvàhàng đơnvị. •Lập trình cho VXL 89c51 hiểnthị lên LED 7 đoạn! phương pháp quét giao tiếp với LCD
Trang 1Chương 4: Giao tiếp hiển thị
Trang 24.1 LED 7 đoạn
Trang 44.2 Phương pháp chốt
Trang 529 30 31
1 2 4 5 7 8
21 22 24 25 27 28 10 11 13 14 16 17
39 38 36 35 33 32
RST XTAL2
PSEN ALE/PROG EA/VPP
P1.0 P1.2 P1.4 P1.5 P1.7
P2.0/A8 P2.2/A10 P2.4/A12 P2.5/A13 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
P0.0/AD0 P0.2/AD2 P0.4/AD4 P0.5/AD5 P0.7/AD7
D6
5V
U7B 74LS02
5 6
4
RN5 330x8
U7C 74LS02
8 9
15 13 11 10 9
6 4
A C Y0 Y2 Y3 Y5 Y6
G1 G2A G2B
Y1 R1 100
U7A 74LS02
2 3
1
RN3 330x8
C2 30
D[0:7]
U7D 74LS02
11 12
LED2
7 6 4 2 1 9 10 5
3 8
Trang 6Ví 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
Trang 7#include "regx51.h“ #include "absacc.h"
unsigned char x; unsigned char y;
void main(void)
{x=0x82;
XBYTE[0XE000]=x; // xuat LED 4 ra gia tri 6x=0x80;
XBYTE[0XC000]=x; // xuat LED 3 ra gia tri 8x=0x99;
XBYTE[0XA000]=x; // xuat LED 2 ra gia tri 4x=0xF9;
XBYTE[0X8000]=x; // xuat LED 1 ra gia tri 1}}
Trang 8#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)
{x=6;
Trang 9Ví 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!
Trang 10#include "regx51.h“ #include "absacc.h" unsigned char x,y;
unsigned char z[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
Trang 124.3 Phương pháp quét
Trang 135V
D4 L3
4 5 3
13 12 11 10 9 15 14
D0 D1 D2 D3 BI/RBO RBI LT
A B C D E F G
10k
1k LED3
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
a b c d e f g p
AN0 AN1
R2 10k
Q7 A1015
L0
10k
D[0:7]
Q6 A1015
C3 10u
LED1
7 6 4 2 1 9 10 5
3 8
29 30
31
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
PSEN ALE/PROG EA/VPP
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
Trang 14Mã 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.0P1.1
P1.2P1.3
P1.4LED4
P1.5LED3
P1.6LED2P1.7
LED1
Trang 15A0 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 A2 A4 A6
XTAL2 18 XTAL1 19
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27U1
330 330 330
330 330 330
330 330 330
330 330 330
330 330 330
330 330 330
330 330 330
Trang 16Ví dụ 03
• Xuất ra LED 7 đoạn hiển thị số 12345678 Chú ý: 8051 sử dụng thạch anh 12 MHz.
Trang 17#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();
{TMOD &= 0xF0; TMOD |= 0x00; ET0 = 0;
while (TF0 == 0) {} TR0 = 0; /* Stop Timer 0 */ }
Trang 184.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
DB1 DB2 DB3 DB4 DB5 DB6 DB7
HD44780U 2x16
Trang 19Sơ đồ 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
3
Nguồn nuôi +5V Vcc
Trang 20• 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.
Trang 21mã ký
tự của LCD
Trang 22Lệ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ự
2h Đưa con trỏ về vị trí top/left
Trang 23Lệnh Chức năng
Trang 24Ví dụ kết nối 8051 và LCD5V
5V
C3 10u
R5 5k
C2 30
Y1
5V
R2 10k
29 30 31
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
PSEN ALE/PROG EA/VPP
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
Trang 25D7 D6 D5 D4 D3 D2 D1 D0
XTAL1 19
ALE 30
EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1
P1.1 2
P1.2 3
P1.3 4
P1.4 5
P1.5 6
P1.6 7
P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14
P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
Trang 2629 30 31
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
PSEN ALE/PROG EA/VPP
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
5V 5V
5V 5V
C1 30
Trang 27Đị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 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
Trang 28/* Đị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
Trang 29/* Chương trình con kiểm tra trạng thái bận của LCD */
Trang 30/* 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 */
Trang 31/* chương trình con cài đặt ban đầu cho LCD */
Trang 32vị 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);
}
Trang 33/* 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;
Trang 34/* Chương trình con hiển thị một ký tự (char) lên LCD */
void writeChar( unsigned char x)
Trang 368 9 10 11 12 13 14 15
0 1 2 3 4 5 6
2 3
D3 D3
D1 D2 D3 D4 D5 D6 D7 D8
D6 D7
29 30
31
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
PSEN ALE/PROG EA/VPP
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
A13
D7
A15 D4
D6
R2 10k
SW1 Reset
5 6