Ðăng Nhập

View Full Version : Xin hỏi về phím bấm giữ khoảng 5s


tranhoangbac
30-03-2011, 02:17 PM
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!

minh_cly
31-03-2011, 08:11 PM
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!

Mình viết bằng CCS C nha bạn.
Bạn dùng ngắt Timer 0 như sau:


#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;
}
}
}


Bạn thử code trên đi.
Xin mấy đại ca xem giúm em code đúng chưa.

thienhv.vaeco
14-12-2011, 04:27 PM
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.