Tải bản đầy đủ (.doc) (5 trang)

Kỹ thuật quét ma trận phím trong vi điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (229.56 KB, 5 trang )

Kỹ thuật quét ma trận phím trong vi điều khiển

C1

C2

C3

C4

H1

30
31

1
2
3
4
5
6
7
8

H2
H3

ALE
EA

P1.0/T2


P1.1/T2EX
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

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

AT89C52

H4

Hình 1: Ma trận phím 4x4
Đầu tiên xuất giá trị 1 ra 7 chân của Port được giữ ở mức điện thế cao nhờ
các điện trở kéo lên. Một mức 0 ra chân còn lại thì khi nhấn một phím, phím đó sẽ
nối hàng với cột và nếu hàng hoặc cột nối phím nhấn đó có mức là 0 thì nó sẽ làm
cho chân còn lại cũng có điện áp mức 0. Và nếu ta biết được hàng và cột của phím

thì ta có thể biết được chính xác vị trí phím được nhấn.
Để đọc ma trận phím ta thực hiện các bước sau:
1. Xóa cổng bằng cách nạp giá trị 1111 1111 vào cổng P
1

25
26
27
28
10
11
12
13
14
15
16
17

2

1

Trong lập trình ứng dụng vi điều khiển việc giao tiếp giữa vi điều khiển
và thiết bị ngoại vi điều rất quan trọng. Do số cổng của vi điều khiển thường
không nhiều, trong khi vi điều khiển lại thực hiện nhiều nhiệm vụ khác nhau.
Để giải quyết bài toán đó bắt buộc phải mở rộng đầu vào cho vi điều khiển. Ta
có thể mở rộng đầu vào bằng nhiều phương pháp khác nhau như sử
dụng IC
C1
ghi dịch 74HC595, kỹ thuật quét ma trận phím. Sử dụng kỹ thuật quét phím để RP1

10k
33p
kiểm tra trạng thái của ma trận phím là một trong
những
kỹ
thuật
sử
dụng
+5V
+5V
C2
cổng đơn giản và hiệu quả hiệu quả.
U1 33p
Để thực hiện quét ma trận phím ta có thể thực hiện quét theo
dòng hoặc
19
39
XTAL1
P0.0/AD0
38
P0.1/AD1
theo cột. Ở đây tác giả trình bày về cách quétt hàng, C3
quét cột cũng hoàn toàn
37
P0.2/AD2
18
36
10uF
XTAL2
P0.3/AD3

35
tương tự.
P0.4/AD4
Reset
34
P0.5/AD5
33
P0.6/AD6
Thuật toán quét ma trận phím:
9
32
R20
RST
P0.7/AD7
Ta có ma trận 16 phím được nối
hàng và 4 cột vàP2.0/A8 2122
10k thành 4 +5V
P2.1/A9
23
P2.2/A10
được nối với một Port của vi điều khiển như hình 1. 29 PSEN
24
P2.3/A11


2. Đưa dữ liệu 0111 vào các bit Px.0 đến Px.33 của cổng P. Để kiểm tra các
phím trên cột đầu tiên (Px.0).
3. Đọc các chân từ Px.4 đến Px.7 vào. Nếu không có phím nào được nhấn trên cột
đó thì giá trị đọc vào sẽ là 1111. Ngược lại nếu có bất kỳ phím nào được nhấn
trên cột đó thì giá trị tương ứng sẽ đọc vào sẽ có giá trị là 0.

4. Tiếp tục đưa giá trị 1011 vào các chân Px.0 đến Px.3 của Px. Để kiểm tra các
phím trên cột thứ hai (Px.1). Sau đó sẽ đọc vào bốn bit Px.4 đến Px.7. Và tương
tự như trên ta xác định được vị trí của phím được nhấn trên cột này (nếu có).
5. Tương tự ta lần lượt đưa các giá trị 1101 và 1110 ra các chân Px.0 đến Px.3 và
đọc vào các giá trị của Px.4 đến Px.7 để xác định vị trí của các phím được nhấn
nếu có.
6. Chu trình này được lặp đi lặp lại vô hạn bằng cách quay về lại bước đầu tiên .
Ứng dụng ma trận phím:
Sử dụng vi điều khiển 8051 lập trình quét ma trận phím 4x4 cho hiển thị giá
trị của phím bấm lên LCD.
Sơ đồ nguyên lý
LCD1
LM016L

10k

33p

+5V

C3

18

10uF

9

R20


C1
H1
H2
H3

C2

C3

C4

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

33p


XTAL1

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

XTAL2

RST

+5V
29
30
31

1
2
3
4
5
6
7
8

2

3
4
5
6
7
8
9

1

U1

10k

RS
RW
E

10k

+5V

C2

19

Reset

51%


RP1

4
5
6

RV1

C1

1
2
3

VSS
VDD
VEE

+5V

P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

PSEN

ALE
EA

P1.0/T2
P1.1/T2EX
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

39
38
37
36
35
34
33
32


+5V

21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17

AT89C52

H4

Hình 2: Sơ đồ nguyên lý giao tiếp vi điều khiển với LCD và ma trận phím 4x4

2


Chương trình điều khiển:
#include <regx52.h>

#define RS P3_0
//RS=0 => code,RS=1 => data
#define RW P3_1
//RW=0 => ghi,RW=1 => doc
#define EN P3_2
//Chan chot
#define lcd_port P0
#define busy P0_7
#define hang1 P1_0
#define hang2 P1_1
#define hang3 P1_2
#define hang4 P1_3
#define cot1 P1_4
#define cot2 P1_5
#define cot3 P1_6
#define cot4 P1_7
unsigned char k;
void delay_ms (unsigned int delay)
{
unsigned char i=121;
while(delay--){
while(i--){}
}
}
void wait_busy ()
{
busy=1;
RS=0;
RW=1;
while (!busy)

{
EN=1;
EN=0;
}
}
void lcd_putcmd(unsigned char cmd)
{
RS=0;
RW=0;
lcd_port=cmd;
EN=1;
EN=0;
wait_busy ();
}
void lcd_putchar(unsigned char chr){
RS=1;
RW=0;
lcd_port=chr;
EN=1;
EN=0;
3


wait_busy ();
}
void lcd_init()
{
delay_ms(15);
lcd_putcmd(0x38);
delay_ms(5);

lcd_putcmd(0x0C);
delay_ms(2);
lcd_putcmd(0x01);
delay_ms(2);
}
void lcd_clear()
{
lcd_putcmd(0x01);
}
void lcd_putsf(unsigned char *s){
while (*s){
lcd_putchar(*s);
s++;
}
}
void lcd_gotoxy(unsigned char x, unsigned char y)
{
lcd_putcmd((0x80+y*64)+x);
delay_ms(1);
}
void quet_phim()
{
hang1=1;hang2=1;hang3=1;hang4=1; // P1=0x0f;
cot1=0;cot2=0;cot3=0;cot4=0;
if(hang1==0)
{
hang1=0;
cot1=1;cot2=1;cot3=1;cot4=1; // P1=0xf0;
if(cot1==0){k=99;}
if(cot2==0){k=1;}

if(cot3==0){k=2;}
if(cot4==0){k=3;}
}
if(hang2==0)
{
hang2=0;
cot1=1;cot2=1;cot3=1;cot4=1;
if(cot1==0){k=4;}
if(cot2==0){k=5;}
if(cot3==0){k=6;}
if(cot4==0){k=7;}
}
if(hang3==0)

4


{
hang3=0;
cot1=1;cot2=1;cot3=1;cot4=1;
if(cot1==0){k=8;}
if(cot2==0){k=9;}
if(cot3==0){k=10;}
if(cot4==0){k=11;}
}
if(hang4==0)
{
hang4=0;
cot1=1;cot2=1;cot3=1;cot4=1;
if(cot1==0)

{k=12;}
if(cot2==0){k=13;}
if(cot3==0){k=14;}
if(cot4==0){k=15;}
}
}
void hien_thi()
{
lcd_gotoxy(7,1);
lcd_putchar(k%100/10+48);
lcd_gotoxy(8,1);
lcd_putchar(k%10+48);
}
void main()
{
lcd_init();
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(" PHIM NHAN LA:");
while (1)
{
quet_phim();
hien_thi();
}
}

Trên đây là thuật toán và ứng dụng của ma trận phím, giúp ta giải quyết bài
toán mở rộng đầu vào cho vi điều khiển đơn giản và hiệu quả. Với giải thuật này
bạn có thể ứng dụng cho mình thiết kế một số project như: kiểm tra vào ra cho vi
điều khiển, máy tính điện tử, điều khiển hệ thống bằng tay …


5



×