kbdd

Upload: gregory-gutierrez

Post on 15-Oct-2015

19 views

Category:

Documents


0 download

TRANSCRIPT

  • 5/25/2018 KBDD

    1/12

    KBDD.C ////

    //// Generic keypad scan driver ////

    //// ////

    //// kbd_init() Must be called before any other function. ////

    //// ////

    //// c = kbd_getc(c) Will return a key value if pressed or /0 if not ////

    //// This function should be called frequently so as ////

    //// not to miss a key press. ////

    //// ////

    ///////////////////////////////////////////////////////////////////////////

    //// (C) Copyright 1996,2003 Custom Computer Services ////

    //// This source code may only be used by licensed users of the CCS C ////

    //// compiler. This source code may only be distributed to other ////

    //// licensed users of the CCS C compiler. No other use, reproduction ////

    //// or distribution is permitted without written permission. ////

    //// Derivative programs created using this software in object code ////

    //// form are not restricted in any way. ////

    ///////////////////////////////////////////////////////////////////////////

    ////////////////// The following defines the keypad layout on port D

    // Un-comment the following define to use port B

    // #define use_portb_kbd TRUE

    // Make sure the port used has pull-up resistors (or the LCD) on

    // the column pins

  • 5/25/2018 KBDD

    2/12

    #if defined(__PCH__)

    #if defined use_portb_kbd

    #byte kbd = 0xF81 // This puts the entire structure

    #else

    #byte kbd = 0xF83 // This puts the entire structure

    #endif

    #else

    #if defined use_portb_kbd

    #byte kbd = 6 // on to port B (at address 6)

    #else

    #byte kbd = 8 // on to port D (at address 8)

    #endif

    #endif

    #if defined use_portb_kbd

    #define set_tris_kbd(x) set_tris_b(x)

    #else

    #define set_tris_kbd(x) set_tris_d(x)

    #endif

    //Keypad connection: (for example column 0 is B2)

    // Bx:

    #ifdef blue_keypad ///////////////////////////////////// For the blue keypad

  • 5/25/2018 KBDD

    3/12

    #define COL0 (1

  • 5/25/2018 KBDD

    4/12

    {'7','8','9'},

    {'*','0','#'}};

    #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() {

    }

    char kbd_getc( ) {

    static BYTE kbd_call_count;

    static int1 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 : set_tris_kbd(ALL_PINS&~COL0);

    kbd=~COL0&ALL_PINS;

    break;

    case 1 : set_tris_kbd(ALL_PINS&~COL1);

  • 5/25/2018 KBDD

    5/12

    kbd=~COL1&ALL_PINS;

    break;

    case 2 : set_tris_kbd(ALL_PINS&~COL2);

    kbd=~COL2&ALL_PINS;

    break;

    }

    if(kbd_down) {

    if((kbd & (ALL_ROWS))==(ALL_ROWS)) {

    kbd_down=FALSE;

    kchar=last_key;

    last_key='\0';

    }

    } else {

    if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {

    if((kbd & ROW0)==0)

    row=0;

    else if((kbd & ROW1)==0)

    row=1;

    else if((kbd & ROW2)==0)

    row=2;

    else if((kbd & ROW3)==0)

    row=3;

    last_key =KEYS[row][col];

    kbd_down = TRUE;

    } else {

    ++col;

  • 5/25/2018 KBDD

    6/12

    if(col==3)

    col=0;

    }

    }

    kbd_call_count=0;

    }

    set_tris_kbd(ALL_PINS);

    return(kchar);

    }

    LCDD.C ////

    //// Driver for common LCD modules ////

    //// ////

    //// lcd_init() Must be called before any other function. ////

    //// ////

    //// lcd_putc(c) Will display c on the next position of the LCD. ////

    //// The following have special meaning: ////

    //// \f Clear display ////

    //// \n Go to start of second line ////

    //// \b Move back one position ////

    //// ////

    //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////

    //// ////

    //// lcd_getc(x,y) Returns character at position x,y on LCD ////

    //// ////

    ///////////////////////////////////////////////////////////////////////////

    //// (C) Copyright 1996,2007 Custom Computer Services ////

  • 5/25/2018 KBDD

    7/12

    //// This source code may only be used by licensed users of the CCS C ////

    //// compiler. This source code may only be distributed to other ////

    //// licensed users of the CCS C compiler. No other use, reproduction ////

    //// or distribution is permitted without written permission. ////

    //// Derivative programs created using this software in object code ////

    //// form are not restricted in any way. ////

    ///////////////////////////////////////////////////////////////////////////

    // As defined in the following structure the pin connection is as follows:

    // D0 enable

    // D1 rs

    // D2 rw

    // D4 D4

    // D5 D5

    // D6 D6

    // D7 D7

    //

    // LCD pins D0-D3 are not used and PIC D3 is not used.

    // Un-comment the following define to use port B

    // #define use_portb_lcd TRUE

    struct lcd_pin_map { // This structure is overlayed

    BOOLEAN enable; // on to an I/O port to gain

    BOOLEAN rs; // access to the LCD pins.

    BOOLEAN rw; // The bits are allocated from

  • 5/25/2018 KBDD

    8/12

    BOOLEAN unused; // low order up. ENABLE will

    int data : 4; // be pin B0.

    } lcd;

    #if defined use_portb_lcd

    //#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port

    #ifdef __pch__

    #locate lcd = 0xf81

    #else

    #locate lcd = 6

    #endif

    #define set_tris_lcd(x) set_tris_b(x)

    #else

    //#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port

    #ifdef __pch__

    #locate lcd = 0xf83

    #else

    #locate lcd = 8

    #endif

    #define set_tris_lcd(x) set_tris_d(x)

    #endif

    #ifndef lcd_type

    #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines

    #endif

  • 5/25/2018 KBDD

    9/12

    #define lcd_line_two 0x40 // LCD RAM address for the second line

    BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type

  • 5/25/2018 KBDD

    10/12

    delay_us(1);

    low = lcd.data;

    lcd.enable = 0;

    set_tris_lcd(LCD_WRITE);

    return( (high 4);

  • 5/25/2018 KBDD

    11/12

    lcd_send_nibble(n & 0xf);

    }

    void lcd_init() {

    BYTE i;

    set_tris_lcd(LCD_WRITE);

    lcd.rs = 0;

    lcd.rw = 0;

    lcd.enable = 0;

    delay_ms(15);

    for(i=1;i

  • 5/25/2018 KBDD

    12/12

    address=0;

    address+=x-1;

    lcd_send_byte(0,0x80|address);

    }

    void lcd_putc( char c) {

    switch (c) {

    case '\f' : lcd_send_byte(0,1);

    delay_ms(2);

    break;

    case '\n' : lcd_gotoxy(1,2); break;

    case '\b' : lcd_send_byte(0,0x10); break;

    default : lcd_send_byte(1,c); break;

    }

    }

    char lcd_getc( BYTE x, BYTE y) {

    char value;

    lcd_gotoxy(x,y);

    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low

    lcd.rs=1;

    value = lcd_read_byte();

    lcd.rs=0;

    return(value);

    }