![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 1
: |
Xin hỏi về phím bấm giữ khoảng 5s
Chào các bác, em đang làm con Pic6F877A, với chương trình khi bấm phím Cancel thì a=1, nhưng khi bấm giữ phím cancel khoảng 5s thì b=1. Nhưng em chưa biết viết chương trình như thế nào, bác nào giúp em đoạn chương trình này với. Thank nhiều!
|
![]() |
![]() |
![]() |
#2 | |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Nơi Cư Ngụ: TPHCM
Bài gửi: 12
: |
Trích:
Bạn dùng ngắt Timer 0 như sau: Code:
#include ... ... int16 count; int1 a = 0; int1 b = 0; // Ngat Timer 0 #INT_TIMER0 void TIMER0_isr() { if (a == 1) { set_timer0(57); // 256 - 199 = 57 count++; if (count >= 490) { // 490 * 199 * 51.2 us = 5s count = 0; a = 0; // a = 0 va b = 1 b = 1; } } else { count = 0; } } // Chuong trinh chính void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Chu ky 51.2 us setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER0); // Ngat Timer 0 enable_interrupts(GLOBAL); while (1) { if (input(...)) { //Input cua nut Cancel b = 0; a = 1; set_timer0(57); count = 0; } else { a = 0; } } } Xin mấy đại ca xem giúm em code đúng chưa. thay đổi nội dung bởi: minh_cly, 31-03-2011 lúc 08:19 PM. |
|
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Dec 2011
Bài gửi: 2
: |
Chào các bạn:
Liên quan đến keyboad tôi có bài toán đang khó. Tôi đang sử dụng 18F452, viết bằng CCS. Trong chương trình có sử dụng hàm keyboad (#include <Thien_kbd.c>) như sau: // kbd.c: // Khai bao trong File main.h nhu sau /*//Keypad connection: #define row0 PIN_D0 #define row1 PIN_D1 #define row2 PIN_D2 #define row3 PIN_D3 #define col0 PIN_D4 #define col1 PIN_D5 #define col2 PIN_D6 #define col3 PIN_D7*/ // Keypad layout: char const KEYS[4][4] = {{'0','1','2','3'}, {'4','5','6','7'}, {'8','9','A','B'}, {'C','D','E','F'}}; #define KBD_DEBOUNCE_FACTOR 33 // Set this number to apx n/333 where // n is the number of times you expect // to call kbd_getc each second void kbd_init() { //set_tris_b(0xF0); //output_b(0xF0); port_b_pullups(true); } short int ALL_ROWS (void) { if(input (row0) & input (row1) & input (row2) & input (row3)) return (0); else return (1); } char kbd_getc() { static byte kbd_call_count; static short int kbd_down; static char last_key; static byte col; byte kchar; byte row; kchar='\0'; if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) { switch (col) { case 0: output_low(col0); output_high(col1); output_high(col2); output_high(col3); break; case 1: output_high(col0); output_low(col1); output_high(col2); output_high(col3); break; case 2: output_high(col0); output_high(col1); output_low(col2); output_high(col3); break; case 3: output_high(col0); output_high(col1); output_high(col2); output_low(col3); break; } if(kbd_down) { if(!ALL_ROWS()) { kbd_down=false; kchar=last_key; last_key='\0'; } } else { if(ALL_ROWS()) { if(!input (row0)) row=0; else if(!input (row1)) row=1; else if(!input (row2)) row=2; else if(!input (row3)) row=3; last_key =KEYS[row][col]; kbd_down = true; } else { ++col; if(col==4) col=0; } } kbd_call_count=0; } return(kchar); } Chạy tốt rồi, nhưng tôi muốn có thêm chức năng giữ phím Ví dụ: nếu giữ phím 1 trong 5s thì kchar phải được gán giá trị nào đó để ngoài CT chính sử dụng tiếp. Thực ra tôi chưa hiểu biến kbd_down trong đó như thế nào. Mong các bạn chỉ giúp. |
![]() |
![]() |
![]() |
|
|