• Không có kết quả nào được tìm thấy

• Lập trình cho VXL 89c51 hiển thị lên LED 7 đoạn một số có 4 chữ số:

N/A
N/A
Protected

Academic year: 2022

Chia sẻ "• Lập trình cho VXL 89c51 hiển thị lên LED 7 đoạn một số có 4 chữ số:"

Copied!
36
0
0

Loading.... (view fulltext now)

Văn bản

(1)

Chương 4: Giao tiếp hiển thị

(2)

4.1 LED 7 đoạn

(3)
(4)

4.2 Phương pháp chốt

(5)

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

(6)

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

(7)

#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 }}

(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)

{ 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];

}}

(9)

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!

(10)

#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

} }

(11)
(12)

4.3 Phương pháp quét

(13)

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

(14)

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

(15)

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

(16)

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.

(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();

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 */ }

(18)

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

(19)

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ố

(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.

(21)

Bảng mã ký tự của LCD

(22)

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

(23)

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

(24)

Ví dụ kết nối 8051 và LCD

5V 5V

C3 10u

LCD

5V LCD1

LCD

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

(25)

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

(26)

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

(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 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

(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

(29)

/* 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;

}

(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 */

RS = 0; /*Chọn thanh ghi*/

RW = 0; /* Cho phép ghi vào LCD */

E = 1;

E = 0;

}

(31)

/* 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);

}

(32)

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);

}

(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;

/* 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++);

} }

(34)

/* 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++);

}

(35)

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

(36)

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

Tài liệu tham khảo

Tài liệu liên quan