I am trying a circuit with 4x4 keypad with 16F886.
For testing the keypad, the code is such that when the key is pressed, its value is displayed. if no key is pressed, the value displayed is 255. unfortunately the value displayed is either 255 or 10.
The circuit is as follows
The code is as follows
Code: Select all
#include <built_in.h>
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D4 at RC4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC3_bit;
sbit LCD_D7_Direction at TRISC7_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC4_bit;
const char *msgDelayTime = "DelayTime: ms ";
const char *msgAuto = "Auto Inc : ms ";
const char *msgSelect = " <SELECT FUNCTION> ";
unsigned int delayTime;
unsigned int ReadData;
unsigned short autoData;
char Text[21];
char keypadPort at PORTB;
// --- Copying strings from ROM to RAM
void strConstCpy(char *dest, const char *source)
{
while(*source)
*dest++ = *source++ ;
*dest = 0 ;
}
void WriteDelaytime ()
{
char txt[7];
WordToStr (delaytime,txt);
LCD_Out (2,11, txt);
}
void WrAutoData()
{
char txt[4];
Lcd_cmd (160);
ByteToStr (autoData,txt);
LCD_Out_cp (txt);
}
// Look for key input and return value as per key pressed
unsigned short Key_in ()
{
unsigned short keyval ;
keyval = Keypad_Key_Press();
switch (keyval) {
case 0: keyval = 255; break; // No key pressed
case 1: keyval = 1; break; // 1
case 2: keyval = 2; break; // 2
case 3: keyval = 3; break; // 3
case 4: keyval = 10; break; // A
case 5: keyval = 4; break; // 4
case 6: keyval = 5; break; // 5
case 7: keyval = 6; break; // 6
case 8: keyval = 11; break; // B
case 9: keyval = 7; break; // 7
case 10: keyval = 8; break; // 8
case 11: keyval = 9; break; // 9
case 12: keyval = 12; break; // C
case 13: keyval = 13; break; // *
case 14: keyval = 0; break; // 0
case 15: keyval = 14; break; // #
case 16: keyval = 15; break; // D
}
return keyval;
}
void dataScreen ()
{
LCD_Cmd (_LCD_CLEAR);
LCD_Cmd(_LCD_CURSOR_OFF);
WriteDelaytime () ;
strConstCpy(text, msgDelayTime) ;
LCD_Out(2,1, Text);
strConstCpy(text, msgAuto) ;
LCD_CMD(148) ;
LCD_Out_cp(Text);
strConstCpy(text, msgSelect) ;
LCD_CMD(212) ;
LCD_Out_cp(Text);
}
void main()
{
osccon = 0x71;
INTCON = 0x40;
porta = 0x00;
portb = 0x00;
trisa = 0xFF;
anselh = 0x00;
wpub = 0x00;
trisc = 0x00;
option_reg = 0xC0;
t1con = 0x30;
porta.f4 = 0x01;
LCD_init(); // initialize (4-bit interface connection)
Keypad_Init ();
portc.f1 = 1;
DelayTime = 9000;
autoData = 100;
dataScreen ();
wrAutodata ();
WriteDelayTime();
delay_ms (5000);
while (1)
{
autoData = Key_in ();
WrAutoData ();
delay_ms (500);
}
}
Please help