KBDD
KBDD
KBDD
C //// ////
//// 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. //// ////
//// 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. ////
///////////////////////////////////////////////////////////////////////////
// Make sure the port used has pull-up resistors (or the LCD) on // the column pins
#if defined(__PCH__) #if defined use_portb_kbd #byte kbd = 0xF81 #else #byte kbd = 0xF83 #endif #else #if defined use_portb_kbd #byte kbd = 6 #else #byte kbd = 8 #endif #endif // on to port D (at address 8) // on to port B (at address 6) // This puts the entire structure // This puts the entire structure
#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
#define ROW0 (1 << 4) #define ROW1 (1 << 7) #define ROW2 (1 << 1) #define ROW3 (1 << 5)
#else ////////////////////////////////////////////////// For the black keypad #define COL0 (1 << 5) #define COL1 (1 << 6) #define COL2 (1 << 7)
#define ROW0 (1 << 1) #define ROW1 (1 << 2) #define ROW2 (1 << 3) #define ROW3 (1 << 4)
#endif
{'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;
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);
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;
//// 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) //// //// //// ////
//// 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: // // // // // // // // // LCD pins D0-D3 are not used and PIC D3 is not used. D0 enable D1 rs D2 rw D4 D4 D5 D5 D6 D6 D7 D7
// This structure is overlayed // on to an I/O port to gain // access to the LCD pins. // The bits are allocated from
#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
#define lcd_line_two 0x40 // LCD RAM address for the second line
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up.
// The following are used for setting // the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
BYTE lcd_read_byte() { BYTE low,high; set_tris_lcd(LCD_READ); lcd.rw = 1; delay_cycles(1); lcd.enable = 1; delay_cycles(1); high = lcd.data; lcd.enable = 0; delay_cycles(1); lcd.enable = 1;
lcd.rs = 0; while ( bit_test(lcd_read_byte(),7) ) ; lcd.rs = address; delay_cycles(1); lcd.rw = 0; delay_cycles(1); lcd.enable = 0; lcd_send_nibble(n >> 4);
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<=3;++i) { lcd_send_nibble(3); delay_ms(5); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); }
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;
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); }