Previous
KeyPad Driver Code:
/***************************************** KEYPAD features *******************************************/
void OSKeyPadInit(void)
{
OSCreateTask(OSKeyPadDebounce, DebounceTime, NoKeyPadMessage, KEYSTATE_NoPush);
}
char OSKeyPadDebounce(void) //debounce state machine
{
if(OSGetState()== KEYSTATE_NoPush)
{ KEYPAD_KeyPress=OSKeyPad_Read();
if(KEYPAD_KeyPress!=16)
{
OSSendMess(0, KEYSTATE_StillPressed);
OSSetState(KEYSTATE_MaybePush);
}
else OSSetState( KEYSTATE_NoPush);
}
if(OSGetState()== KEYSTATE_MaybePush) {
if(KEYPAD_KeyPress==OSKeyPad_Read() && OSGetMess(0)== KEYSTATE_StillPressed)
OSSetState( KEYSTATE_Pushed);
else
{
// OSSendMess(0, KEYSTATE_error);
OSSetState( KEYSTATE_NoPush);
}
}
if(OSGetState()== KEYSTATE_Pushed)
{
if(KEYPAD_KeyPress==OSKeyPad_Read() && OSGetMess(0)== KEYSTATE_StillPressed)
OSSetState( KEYSTATE_Pushed);
else
OSSetState( KEYSTATE_DebouncePress);
}
if(OSGetState()== KEYSTATE_DebouncePress)
{
// OSSendMess(1,1);
/* if(KEYPAD_letter[KEYPAD_KeyPress]=='D')
{
OSKeyPadClearBuffer();
}*/
OSKeyPadWriteBuffer(KEYPAD_letter[KEYPAD_KeyPress]);
OSSetState( KEYSTATE_NoPush);
}
return 0;
}
char OSKeyPad_Read(void) //reads the keypad
{
char temp;
//get lower nibble
DDRC = 0x0f;
PORTC = 0xf0;
delay_us(5);
KEYPAD_Key = PINC;
//get upper nibble
DDRC = 0xf0;
PORTC = 0x0f;
delay_us(5);
KEYPAD_Key = KEYPAD_Key | PINC;
//find matching keycode in keytbl
if (KEYPAD_Key != 0xff)
{
for (KEYPAD_butnum=0; KEYPAD_butnum<KEYPAD_maxkeys; KEYPAD_butnum++)
{
if (KEYPAD_keytbl[KEYPAD_butnum]==KEYPAD_Key)
{
temp=KEYPAD_butnum;
break;
}
}
if (KEYPAD_butnum==KEYPAD_maxkeys) KEYPAD_butnum=0;
else KEYPAD_butnum++; //adjust by one to make range 1-16
}
else
{
temp = 16;
KEYPAD_butnum=0;
}
return temp;
} //end main
/*void OSKeyPadWriteBuffer(char Key)
{ //send the value if the enter key'A' is pressed or when the buffer is full
if((Key=='A' && KEYPAD_KeyFlag==1) || (KEYPAD_index ==KEYPAD_BUFFERSIZE))
{
KEYPAD_KeyFlag=0;
KEYPAD_Key_Ready=1; //string ready
KEYPAD_index = 0; //reset index count
}
else if(Key=='A' && KEYPAD_KeyFlag==0)
{
// printf("\r\n");
PORTB=~0b10101010;
// OSUARTTransmitBytes(empty, 20);
// printf("\r\n");
}
else
{
KEYPAD_Buffer[KEYPAD_index]=Key;
// OSUARTTransmitBytes(buffer, 5);
// OSUARTTransmitByte(Key);
// printf("\r\n");
KEYPAD_index++;
KEYPAD_KeyFlag=1;
}
} */
void OSKeyPadWriteBuffer(char Key)
{ //send the value if the enter key'A' is pressed or when the buffer is full
if(KEYPAD_index == (OSNumCharInput-1))
{
KEYPAD_KeyFlag=0;
KEYPAD_Key_Ready=1; //string ready
KEYPAD_index = 0; //reset index count
}
else
{
KEYPAD_Buffer[KEYPAD_index]=Key;
// OSUARTTransmitBytes(buffer, 5);
// OSUARTTransmitByte(Key);
// printf("\r\n");
KEYPAD_index++;
KEYPAD_KeyFlag=1;
}
}
/*
void OSKeyPadClearBuffer()
{
while(KEYPAD_index!=0)
{
KEYPAD_Buffer[KEYPAD_index--]=0;
}
KEYPAD_KeyFlag=0;
}
*/
void OSGetKeyReady(unsigned char x)
{
if(OSKeyLock==0) //if no one is using the keypad
{
OSNumCharInput=x;
OSKeyLock=OSCurrentTask; //set lock so no one can use it
OSKeyCommand=0;
}
else OSKeyCommand=1; //some other task is currently using the keypad right now, OSGetKeyCommand is off until the key unlocks
}
unsigned int OSGetKeyCommand(char *data)
{
if(OSKeyCommand==0)
{
int i;
if(KEYPAD_Key_Ready==1)
{
for(i=0;i<OSNumCharInput;i++)
{
data[i]=KEYPAD_Buffer[i];
KEYPAD_Buffer[i]=0;
}
data[i]=0; //terminate to make string
KEYPAD_Key_Ready=0;
OSKeyLock = 0; //unlocks the KeyPad for someone else
return 1;
}
}
else return 0;
}
Previous