Thắc mắc về keypad

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Cho em có thắc mắc về cái keypad như trong hình ạ :)..Anh chị giải đáp giúp em với
 

Attachments

IceSandwich

Thành Viên PIF
Chỗ header 3 thì bạn chọn 1 trong 2 loại nguồn, mục đích là tạo trở kéo lên hay kéo xuống còn chân 9, 10 thì bạn cấp nguồn từ main qua.
 
nói thêm là trở kéo lên thì khi không có tín hiệu đk trạng thái đọc được là mức 1, còn trở mà kéo xuống thì trạng thái đọc được là mức 0:Dkhông kéo thì muốn sao là chuyện của cái button, nhiễu lắm:D
 

Manhdd

Cố Vấn CLB
Staff member
Về keypad, các bạn có thể tham khảo bài hướng dẫn ở link sau, viết khá chi tiết
http://www.hocavr.com/index.php/en/app/keypad

Keypad trong bài hướng dẫn này không dùng điện trở kéo ở bên ngoài mà dùng điện trở kéo lên/xuống nội trong MCU, chọn bằng phần mềm. PIC16F887 cũng có hỗ trợ thiết lập điện trở kéo lên nội, các bạn có thể tham khảo thêm ở datasheet.
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Vậy là chỗ 2 mình cắm vào 1 hay 3 cũng được phải không ạ :)..... còn 9,10 là mình cắm vào PORT nào cũng được phải không ạ :)
 

Manhdd

Cố Vấn CLB
Staff member
Bạn vẫn chưa hiểu à???
J_Jumper: chân 2 nối qua 1 (VCC) -> điện trở kéo lên , chân 2 nối qua 3 (GDN) -> điện trở kéo xuống. Kéo lên hay xuống sẽ ảnh hưởng đến việc lập trình đọc nút nhấn.
J1: 8 chân đầu nối vào 1 Port để điều khiển và đọc keypad. Chân 9, 10 đã ghi rõ là VCC và GND, cắm qua mạch main PIC, tức là lấy cùng nguồn với mạch main.
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
em cho nó gắn và VCC và code này không biết có đúng không ạ =.=~ mọi người chỉ em với
Code:
void main(void) {
    ANSEL = 0;
    ANSELH = 0;
	lcd_init();
	TRISC = 0x00;
	PORTC = 0xF0; //11110000
	unsigned char m_button[16]={0x87,0x8b,0x8d,0x8e,0x47,0x4b,0x4d,0x4e,0x27,0x2b,0x2d,0x2e,0x17,0x1b,0x1d,0x1e};
	
	unsigned char m_ledshow[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
								
	
    while (1) 
	{
	lcd_clear();
	
//Ma tran phim
	int i;
	for (i=0;i<=16;i++)
	{
		if (PORTC==m_button[i])
			lcd_putc(m_ledshow[i]);
	}
//End Ma tran phim	
	
    }

}
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
mà hình như bấm 1 cái là R va C mỗi cái 2.5V :-s
Không biết em mắc thế này đúng chưa ạ :-s
 

Attachments

Kisses Hacker

Art Supporter
Staff member
Cho em hỏi "điện trở kéo lên" hay "điện trở kéo xuống" là gì và dùng để làm gì thế ạ? Cái trở kéo lên/xuống đó có tác dụng gì với module keypad này?

Mạch keypad của em, em nối dây vào board để test phím, mới đưa tay vào chưa nhấn là LED đã nhảy lung tung rồi, có phải nó bị nhiễu không ạ? Khắc phục như thế nào vậy? :|
 

IceSandwich

Thành Viên PIF
mà hình như bấm 1 cái là R va C mỗi cái 2.5V :-s
Không biết em mắc thế này đúng chưa ạ :-s
Trong hình của bạn R, C là gì vậy?

Cho em hỏi "điện trở kéo lên" hay "điện trở kéo xuống" là gì và dùng để làm gì thế ạ? Cái trở kéo lên/xuống đó có tác dụng gì với module keypad này?

Mạch keypad của em, em nối dây vào board để test phím, mới đưa tay vào chưa nhấn là LED đã nhảy lung tung rồi, có phải nó bị nhiễu không ạ? Khắc phục như thế nào vậy? :|
Trở kéo lên là trở nối với VCC, kéo xuống là nối GND. Tại sao phải dùng trở kéo lên hay kéo xuống? Vì nếu bạn không dùng thì vđk sẽ không biết tín hiệu đang ở mức cao hay mức thấp hay thế chân đó không ổn định khi đọc giá trị về => dùng trở kéo.

Trường hợp của bạn có thể là do thế chân input không ổn định nên gây ra tình trạng trên. Bạn nên gắn trở kéo cho chân tín hiệu vào hoặc dùng trở kéo lên có sẵn trong PIC, ở PIC 16F887 thì có trở kéo lên ở PORT B.
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
í..quên nói rõ..cái R0,R1...C0,C1 như trong schematic của CLB đó ạ...mà mô phỏng nên em cắm hết vô PORTC luôn
 

IceSandwich

Thành Viên PIF
em cho nó gắn và VCC và code này không biết có đúng không ạ =.=~ mọi người chỉ em với
Code:
void main(void) {
    ANSEL = 0;
    ANSELH = 0;
	lcd_init();
	TRISC = 0x00;
	PORTC = 0xF0; //11110000
	unsigned char m_button[16]={0x87,0x8b,0x8d,0x8e,0x47,0x4b,0x4d,0x4e,0x27,0x2b,0x2d,0x2e,0x17,0x1b,0x1d,0x1e};
	
	unsigned char m_ledshow[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
								
	
    while (1) 
	{
	lcd_clear();
	
//Ma tran phim
	int i;
	for (i=0;i<=16;i++)
	{
		if (PORTC==m_button[i])
			lcd_putc(m_ledshow[i]);
	}
//End Ma tran phim	
	
    }

}
Code của bạn chỉ mới là so sánh giá trị đọc về và cũng chưa đúng.

Code:
for (i=0;i<=16;i++)
Nếu chạy phần tử của mảng thì phải sửa thành i<16 mới đúng vì giá trị bắt đầu mảng là array[0].

Phần code so sánh giá trị của bạn cũng không chính xác lắm vì bạn set tris PORTC là input (0x00) thì sao quét phím được?
Cách quét key pad là chọn 1 hàng hay cột bất kì rồi đọc trạng thái phím (dựa vào hàng được chọn và nút được nhấn) => phím nào được nhấn (1 lúc thì chỉ có 1 hàng hay cột được chọn thôi vì các nút khác nối chung với nhau).

Nếu quét theo hàng thì bạn có thể làm như sau:
Code:
TRISC = 0xF0; // 4 bit cao dùng để chọn hàng, 4 bit thấp đọc trị trả về
Khi đọc giá trị bạn nên viết 1 hàm cập nhật phím bấm và xuất ra 1 biến vd như "int input"

Khi quét phím, bạn chọn lần lượt từng hàng 1 rồi đọc giá trị input của nút nhấn. Bạn nên nối PORT của keypad vào PORTB vì PORTB này có hỗ trợ ngắt cả PORT (tức khi có xảy ra thay đổi bất kì pin nào của PORT thì sẽ xảy ra ngắt), khi vào ngắt bạn dựa vào hàng đang được chọn và trạng thái input của các chân => nút nào đang được nhấn và cập nhật vào biến input. Dựa vào giá trị biến input để xử lí :).
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Code vầy đúng chưa ạ :(( sao em mô phỏng mà không nhấn nút nó vẫn chạy :-<..cho TRISC = 0xF0 hay 00 đều vu vu.....cái code trước có hiện số 1, còn h thì mất số 1 hiện từ 2 trở đi không à...
Code:
void main(void) {
    ANSEL = 0;
    ANSELH = 0;
	lcd_init();
	TRISC = 0x00;
	unsigned char m_button[16]={10000111,10001011,10001101,10001110,01000111,01001011,01001101,01001110,00100111,00101011,00101101,00101110,00010111,00011011,00011101,00011110};
	
	unsigned char m_ledshow[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
								
	
    while (1) 
	{
	lcd_clear();
	
//Ma tran phim
	int i,j;
	
	for(i=0;i<=3;i++)
	{
	for (j=1;j<=4;j++)
	{
	__delay_ms(200);
	if (PORTC=(4*i+j))
		lcd_putc(m_ledshow[(4*i+j)]);
	}
	}
//End Ma tran phim	
	
    }

}
 

IceSandwich

Thành Viên PIF
Đọc giá trị keypad bằng phương pháp quét mà sao bạn để toàn PORTC là OUTPUT?
Code:
TRISC = 0x00;
Bạn nên xem kĩ tài liệu anh Manhdd gửi http://www.hocavr.com/index.php/en/app/keypad, đã giải thích chi tiết phương pháp quét keypad rồi :).

Bạn nên test trên mạch thực tế vì mô phỏng nó đặt vào điều kiện lí tưởng rồi :).
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
:(

Nhà nghèo tới h em vẫn chưa làm mấy cái module đó nữa..:-<...nên đành mô phỏng cho bik thui :((
 

light

Thành Viên PIF
cái đó có bao nhiêu đâu bạn, làm 1 cái đi, thuật toán quét led bạn coi trong tài liệu của c6 đó, làm i chang là chạy vèo vèo, hehe
 
Trên đó là cách quyét phím thông thường kinh điển......và dưới đây mình xin giới thiệu đến các bạn vài phương pháp khác cũng khá hay:

Nói chung như mình biết có vài cách để giao tiếp với Keypad..........một dây cũng có, 2 dây cũng có, hay quyét....vv..... và cái 1 dây thì mình cũng làm rồi, đó là dùng ADC để đọc mức điện áp được phân áp qua các trở ứng với từng Key......và sẽ xác định được key nào thôi.....và cái 2 dây thì bh mình cũng đã làm xong và chạy ổn định..... nguyên tắc dùng I2C đọc về----Code rất hiệu quả----mỗi khi có key nhấn thì tạo ra một ngắt, sau đó MCU sẽ nhảy vào hàm đọc Key về thôi mà không cần phải quyét rườm rà và tốn nhiều PINs để giao tiếp như thế....Mình sẽ post những module này lên diễn đàn sau khi thi DID nhé.....sợ đụng hàng....hehe............À mình bật mí một tí là dùng IC mở rộng Port có hổ trợ ngắt nhé.....các bạn có thể dùng PCA9555 sample của TI chẳng hạn, hoặc loại nào đó các bạn thích........
 
Dưới dây là Link chứa rất nhiều Tips cho MCU PIC.......cái này rất cho ích cho chúng ta......các bạn cũng nên một lần xem qua ha......sẽ biết đuợc nhiều điều lắm.........À trong tài liệu này nó cũng có Tip cho key pad 1 dây đó....tìm phần đó mà đọc qua ha.......
Thân!
 

bigboy061293

Thành Viên PIF
Dưới dây là Link chứa rất nhiều Tips cho MCU PIC.......cái này rất cho ích cho chúng ta......các bạn cũng nên một lần xem qua ha......sẽ biết đuợc nhiều điều lắm.........À trong tài liệu này nó cũng có Tip cho key pad 1 dây đó....tìm phần đó mà đọc qua ha.......
Thân!
anh Nhật đỉnh thiệt, có "hàng" mà dìm, tới giờ mới thả :)
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Dưới dây là Link chứa rất nhiều Tips cho MCU PIC.......cái này rất cho ích cho chúng ta......các bạn cũng nên một lần xem qua ha......sẽ biết đuợc nhiều điều lắm.........À trong tài liệu này nó cũng có Tip cho key pad 1 dây đó....tìm phần đó mà đọc qua ha.......
Thân!
Thằng này có tài liệu hay mà dìm hàng kinh quá. Thanks phát nào!
 
Top