Muốn học tốt được vi điều khiển thì việc đấu tiên ta nên làm quen những bài tập
cơbản của vi điều khiển. ở đây là quan trọng IO như:LED, nút nhấn, ma
trận.Hôm nay tôi giới thiệu đến các pác 1 thuật toán quét ma trận phím đầu
vào. Ở đây là quét ma trận 3x4 với thuật toán quét đơn giản nhưng mà chưa tối
ưu. Giá trịcủa ma trận phím được hiện thịlên LED 7Seg! Bắt đầu!
Chú ý : Đây là bài thực hành nên tôi không đưa các linh kiện như:ULN2803, A1015
8 trang |
Chia sẻ: maiphuongtt | Lượt xem: 2623 | Lượt tải: 5
Bạn đang xem nội dung tài liệu Quét ma trận phím 3 x 4 hiện thị LED 7seg, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Quét ma trận phím 3 x 4 hiện thị LED 7seg
Nguồn : biendt.biz
Muốn học tốt được vi điều khiển thì việc đấu tiên ta nên làm quen những bài tập
cơ bản của vi điều khiển. ở đây là quan trọng IO như :LED, nút nhấn, ma
trận....Hôm nay tôi giới thiệu đến các pác 1 thuật toán quét ma trận phím đầu
vào. Ở đây là quét ma trận 3x4 với thuật toán quét đơn giản nhưng mà chưa tối
ưu. Giá trị của ma trận phím được hiện thị lên LED 7Seg! Bắt đầu!
Chú ý : Đây là bài thực hành nên tôi không đưa các linh kiện như :ULN2803,
A1015
1 ) Cấu tạo của ma trận phím 3x4
Ma trận phím này được cấu tạo bởi : 3 hàng và 4 cột. các hàng và cột được nối
với các chân cổng vào ra của vi điều khiển Psoc CY8C29466. Khi một phím được
bấm, nó sẽ nối một hàng và một cột tương ứng.Như vậy ta sẽ có 12 nút nhấn
mà chỉ mất có 7 chân vi điều khiển còn muốn tiếp kiệm hơn nữa là các pác dùng
còn giải mã 3 >> 8 (74138) hay dùng 74ls154.(Cái này cũng không cần bit đâu
vì bài của mình đâu lớn như thế) nên nối trực tiếp vào chân vi điều khiển cho nó
nhanh.
Khi nút 0 được nhấn thì nó nối giữa cột 1 hàng 1. CÒn nút 1 được nhấn thì cột 2
và hàng 1 được nối hay nút 2 được nhấn thì nối giữa cột 3 và hàng 1... cứ như
vậy đến nút thứ 12!
Đối với kết cấu của ma trận này chưa được chống nhiễu phím. Nếu muỗn chống
nhiễu thì các bạn thêm con tụ khoảng 104 vào các nút nếu không muốn thì
chống nhiễu bằng phần mền cũng được!
2 ) Mạch hiện thị.
Ở mạch này ta lại sử dụng cách quét LED 7. Loại LED này mua ngoài chợ chỉ có
5k thôi! L
oại này là loại Anot chung. Các chân a,b,c,d,.. được nối với nhau và hai chân
điều khiển dùng để điều khiển hiện thị LED.Có nghĩa là muốn cho LED 1 sáng thì
ta cấp dòng vào cho chân điều khiển của LED 1 và tương tự như như LED2.Đối
với LED này muốn cho LED sáng thì phải cấp vào các chân điều khiển mức 1 và
các chân a,b,c,..mức 0 (Mã LED phải tính ở mức 0)
Nguyên lý quét LED ở đây tôi đã trình bày ở trong mục quét LED ở trang chủ.
Nhưng qua đây tôi nói qua tại mỗi thời điểm ta chỉ hiện thị được 1 LED nên
muốn hiện thị 2 LED mà ta có thể nhìn thấy thì cần phải quét 2 giá trị này liên
tục. Do ta quét với tần số nhanh nên mắt ta không cảm nhận được là từng cái
sáng 1 (Cái này xem điện ảnh họ làm 24h/s). Mình thì cứ hiểu thế thôi. Quét
càng nhanh thì ta sẽ không nhìn thấy các điểm nháy của LED. Nếu không tin các
pác có thể cho delay cao lên sẽ thấy từng LED sáng 1.
3) Sơ đồ nguyên lý:
Ở đây tôi dùng các chân như sau:
+ Phần hiện thị LED : Tôi dùng P0 được nối với (a,b,c,d...) Hai chân điều khiển
được nối với P1_7 và P1_6. Ở đây không dùng ổn dòng nên LED nó hơi tối!
+ Phần ma trận phím: Các hàng từ Hàng 1 đến Hàng 3 được nối vào từ P2_0
đến P2_2. Còn các cột từ cột 1 đến cột 4 được nối vào P2_4 đến P2_7.
+ Thêm 1 mạch reset cho mạch: dùng 1 công tắc nối với chân số 19 thông qua
1 điện trở 1k và đầu kia được nối lên VCC. Khi công tắc được đóng thì mạch sẽ
tự reset. Còn 1 tụ được nối giữa chân 28 và 14 là để không bị mất nguồn trong
khoảng thời gian ngắn
4) Nguyên lý quét
Ở đây tôi làm theo phương pháp quét cột còn phương pháp quét theo hàng thì
các pác làm tự.
+ Bước 1 : Đầu tiên ta đưa cột 1 xuống mức 0V. Sau đó ta kiểm tra 3 hàng
(hàng 1 , hàng 2, hàng 3) được nối với cột đó.Nếu nút 0 được nhấn tức là cột 1
được nối với hàng 1 khi đó hàng 1 được nhấn tín hiệu từ cột 1 và về mức 0 ==>
cho ta giá trị 0. Nếu nút 4 được nhấn tức là cột 1 được nối với hàng 2 khi đó
hàng 2 được nhận tín hiệu từ cột 1 và mức 0 ==> Cho ta giá trị 4. Nếu nút 8
được nhấn tức là nối cột 1 với hàng 3 khi đó hàng 3 được nhấn tín hiệu từ cột 1
và về mức 0 ==> cho ta giá trị 8. Vậy trong 1 cột cho ta 3 giá trị khác nhau từ 3
hàng.
+ Bước 2: Sau khi cho cột 1 bằng 0V sau đó ta cho tiếp cột 2 bằng 0V và tiếp
tực kiểm tra các hàng 1 đến hàng 3 xem nào có hàng nào được nhấn không.
Nếu nút 1 được nhấn tức là ta lại nối cột 2 với hàng 1, đưa giá trị của hàng 1 về
0V ==> cho giá trị 2. Nếu nút 5 được nhấn là ta lại nối cột 2 với hàng 2 khi đó
đưa hàng 2 xuống 0V ==> cho giá trị 5. Nếu nút 9 được nhấn là ta lại nối cột 2
với hàng 3 và đưa hàng 3 xuống 0V ==> Cho ta giá trị 9. Như vậy ở lần này
cũng cho ta 3 giá trị là các số 1,5,9
+ Bước 3, 4 : Cũng tương tự lần lượt như bước 1 và 2 và cách làm cũng tương
tự. Như vậy ta cũng thu được 6 giá trị nữa là : 2,6,10,3,7,11
Như vậy ta đã xong việc quét ma trận phím và thu được các giá trị từ ma trận
phím và giá trị này được hiện thị lên LED7 thanh.
5) Chương trình:
Đây là chương trình được viết bằng C và trình biên dịch bằng phần mền PSoc.
Chương trình này chỉ tham khảo vì chương trình chỉ mang tính chất hiểu nguyên
lý chưa tối ưu.
//-----------------MA TRAN PHIM 3 x 4 HIEN THI LEN LED 7SEG-----------------------
/* Viet boi : biendt - biendt.biendt@gmail.com
Dung P2 la cac chan dau vao va ra
+ P20->P22 dat o che do Pull up
+ P24->P27 dat o che do Strong
Dung P0 va P1 (P1_7 and P1_6) de hien thi len 7 Seg
Dung Psoc CY8C29466 */
//----------------------------------------------------------------------------
#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define hang1 (PRT2DR&0x01)
#define hang2 (PRT2DR&0x02)
#define hang3 (PRT2DR&0x04)
/*-----------------------Ham delay---------------------------------*/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<100;i++);
for(j=0;j
}
/*--------------------Ham hien thi LED 7seg----------------------------*/
unsigned char
codeled[10]={0x40,0xf9,0x24,0x30,0x99,0x12,0x82,0x78,0x80,0x10};
void hienthi(unsigned int data)
{
unsigned int digit1,digit2;
digit1=data/10;
digit2=data%10;
PRT0DR=codeled[digit1];
PRT1DR=PRT1DR|0x80;
delay(10);
PRT1DR=PRT1DR&0x7f;
PRT0DR=codeled[digit2];
PRT1DR=PRT1DR|0x40;
delay(10);
PRT1DR=PRT1DR&0xbf;
}
/* -----------------------------------Ham quet phim-------------------*/
unsigned char quetcot[4]={0xef,0xdf,0xbf,0x7f};
unsigned char giatribp=0;
unsigned int x,lap;
unsigned char quetbanphim()
{
for(x=0;x<4;x++)
{
PRT2DR=quetcot[x];
for(lap=0;lap<50;lap++)
{
if(!hang1) giatribp=0+x;
if(!hang2) giatribp=4+x;
if(!hang3) giatribp=8+x;
}
}
return giatribp;
}
/*==========================Ham
chinh================*/
void main()
{
PRT1DR=0xff;
PRT0DR=0xff;
PRT2DR=0xff;
while(1)
{
quetbanphim();
hienthi(giatribp);
}
}