Ðăng Nhập

View Full Version : hỏi về keypad 4x4 dùng ADC


tranhuyky
02-03-2009, 09:46 AM
Chào mọi người!
Mình đang làm 1 ứng dụng dùng keypad.
Cách thông thường là dùng 8 chân thì mình làm được rồi.
Nhưng do không đủ chân mình định dùng keypad ADC để tiết kiệm chân.
Mà mình không biết ưu điểm và khuyết điểm cũng như cách làm keypad ADC.
Có ai biết keypad ADC tư vấn cho mình nhe.
Xin cảm ơn.

namqn
02-03-2009, 08:28 PM
Chào mọi người!
Mình đang làm 1 ứng dụng dùng keypad.
Cách thông thường là dùng 8 chân thì mình làm được rồi.
Nhưng do không đủ chân mình định dùng keypad ADC để tiết kiệm chân.
Mà mình không biết ưu điểm và khuyết điểm cũng như cách làm keypad ADC.
Có ai biết keypad ADC tư vấn cho mình nhe.
Xin cảm ơn.
Google một cái là có ngay mà bạn, chẳng hạn:
http://lancer3.com/ADC%20Keypad.htm

Bạn thử nghĩ xem nếu nhấn hai nút đồng thời thì thế nào nhé.

Thân,

tranhuyky
02-03-2009, 11:29 PM
Google một cái là có ngay mà bạn, chẳng hạn:
http://lancer3.com/ADC%20Keypad.htm

Bạn thử nghĩ xem nếu nhấn hai nút đồng thời thì thế nào nhé.

Thân,
Cám ơn anh namqn đã đặt 1 câu hỏi làm sáng tỏ vấn đề.
Tiện thể anh có thể cho em xin code của driver keypad 4x4 viết bằng ngắt được không anh?

namqn
02-03-2009, 11:41 PM
Cám ơn anh namqn đã đặt 1 câu hỏi làm sáng tỏ vấn đề.
Tiện thể anh có thể cho em xin code của driver keypad 4x4 viết bằng ngắt được không anh?
Vì bạn cho biết cách thông thường bạn đã làm được, nên tôi giả thiết bạn đang hỏi cách hiện thực có dùng ADC. Bạn cho biết thêm bạn định viết code bằng hợp ngữ hay ngôn ngữ cấp cao nào, cho PIC cụ thể nào (vì PIC16F và PIC18F có nhiều khác biệt trong xử lý ngắt, mặc dù đều là PIC 8-bit).

Bạn cũng nên tránh hỏi riêng một ai đó trên diễn đàn, vì đâu phải chỉ có một người có thể giúp bạn.

Thân,

tranhuyky
02-03-2009, 11:47 PM
Vì bạn cho biết cách thông thường bạn đã làm được, nên tôi giả thiết bạn đang hỏi cách hiện thực có dùng ADC. Bạn cho biết thêm bạn định viết code bằng hợp ngữ hay ngôn ngữ cấp cao nào, cho PIC cụ thể nào (vì PIC16F và PIC18F có nhiều khác biệt trong xử lý ngắt, mặc dù đều là PIC 8-bit).

Bạn cũng nên tránh hỏi riêng một ai đó trên diễn đàn, vì đâu phải chỉ có một người có thể giúp bạn.

Thân,
Em đang dùng CCS viết cho PIC18F4550. Ứng dụng của em dùng keypad với LCD kèm theo 1 số giao tiếp khác.
Hiện tại đã dùng được driver thông thường. Nhưng cách này viết menu cho LCD thì không tiện.
Trong khi dùng ngắt thì lại gặp vấn đề không tương thích với các hàm delay của LCD.
Mong nhận được sự chỉ giáo của các đàn anh.

thvinh1010
04-03-2009, 05:47 PM
Mình cũng đang học về PIC, viết một ứng dụng đơn giản có sử dụng keypad + tính năng
ngắt. Nhưng vẫn chưa chạy tốt được. Vì lí do gì thì vẫn chưa hiểu được. Mặc
dù không có ngắt thay đổi điện áp bởi nhất nút keypad nhưng mà vẫn vào hàm ngắt.
Anh chị nào có kinh nghiệm, xin chỉ giáo. Cảm ơn.

Thông tin trên mạch như sau:
+ PB0-PB3 là Output, giá trị 0
+ PB4-PB7 là Input, được kéo Pullup lên Vcc
+ Khi nhấn nút thì PB0 -> PB4, or PB1 -> PB5, or PB2 -> PB6, or PB3 -> PB7. Làm cho
tín hiệu ở PB4-PB7 thay đổi từ H->L

==> khi đổ xuống PIC, thấy xuất ra ký tự "C" liên tục :-(. Xin được giúp đỡ.

#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000,crystal)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


#int_rb
void detect_rb_change() {
putc('c');
}

void main() {

set_tris_b(0xF0);

enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

ext_int_edge(H_to_L);

while (TRUE)
{
}
}

picpen
05-03-2009, 12:55 AM
Làm sao bạn biết là nó luôn nhảy vào ngắt ??
Bạn cho hiển thị ký tự " C " lên LCD hay máy tính vậy , Mà sao chương trình không thấy báo bảo khởi tạo LCD
Mình bị một lần : khai báo lệnh " enable_interrupts(INT_RB); " thì không thể nào vào ngắt đươc , sau đó mình thay đổi bằng lệnh :

ENABLE_INTERRUPTS( INT_RB7);
ENABLE_INTERRUPTS( INT_RB6);

Thì chạy bình thường
Trường hợp của bạn có thể do phần cứng , bạn dò lại mạch xem nhé

tranhuyky
05-03-2009, 08:17 AM
Làm sao bạn biết là nó luôn nhảy vào ngắt ??
Bạn cho hiển thị ký tự " C " lên LCD hay máy tính vậy , Mà sao chương trình không thấy báo bảo khởi tạo LCD
Mình bị một lần : khai báo lệnh " enable_interrupts(INT_RB); " thì không thể nào vào ngắt đươc , sau đó mình thay đổi bằng lệnh :

ENABLE_INTERRUPTS( INT_RB7);
ENABLE_INTERRUPTS( INT_RB6);

Thì chạy bình thường
Trường hợp của bạn có thể do phần cứng , bạn dò lại mạch xem nhé
ủa, làm gì có interrupt INT_RB6, INT_RB7.
Chắc bạn thvinh1010 chưa cho xuất ra LCD chỉ mới xuất ra cổng com thôi.
Mình cũng đang bị vướng chổ ngắt RB cho con 18F4550, chưa biết làm sao hểt :(

picpen
05-03-2009, 01:29 PM
ủa, làm gì có interrupt INT_RB6, INT_RB7.
Chắc bạn thvinh1010 chưa cho xuất ra LCD chỉ mới xuất ra cổng com thôi.
Mình cũng đang bị vướng chổ ngắt RB cho con 18F4550, chưa biết làm sao hểt :(

Không có hay bạn không biết ? Nếu bạn chỉ đọc bản help của CCS thì cả đời cũng chẳng bao giờ nhìn thấy lệnh đó . Vì thằng HELP của CCS còn khá sơ sài
Bạn có thể mở các file .H trong bộ cài ở forder DRIVERS ra tìm hiểu

Chúc may mắn ......

tranhuyky
05-03-2009, 01:41 PM
Không có hay bạn không biết ? Nếu bạn chỉ đọc bản help của CCS thì cả đời cũng chẳng bao giờ nhìn thấy lệnh đó . Vì thằng HELP của CCS còn khá sơ sài
Bạn có thể mở các file .H trong bộ cài ở forder DRIVERS ra tìm hiểu

Chúc may mắn ......

Thật sự thì mình chưa biết.
Mình đã xem rồi. Các khai báo INT_RB6, INT_RB7 chỉ có trong 1 số file .h thôi.
Riêng con 18F4550 thì không có!!!

tranhuyky
05-03-2009, 06:11 PM
Mình đã điều khiển ngắt RB được rồi, mình gởi source để mọi người cùng tham khảo.
Port B được nối với keypad 4x4. Nếu nhấn 1 nút trên port B thì sẽ xuất 1 ký tự 'c' qua RS232.

Nhưng có 1 chỗ mình chưa hiểu là nếu mình comment khối lệnh IF trong hàm ngắt RB_isr() thì ký tự 'a' được xuất ra liên tục(hàm ngắt xãy ra liên tục).
Có ai giải thích dùm mình được không?



#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000,crystal)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#byte portb = 0xf81
#use fast_io(B)

static int old_b_state;
#int_RB
void RB_isr(void) {
putc('a');
if (old_b_state != portb)
{
disable_interrupts(INT_RB);
putc('c');
enable_interrupts(INT_RB);
}
}

void main() {

port_b_pullups(TRUE);
output_b(0xf0);
set_tris_b(0xf0);

old_b_state = portb;

enable_interrupts(INT_RB);
enable_interrupts(global);

while (TRUE)
{
}
}