Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL mbed ConfigFile
Fork of 4DGLtest by
keyboard.cpp
- Committer:
- WillemBraat
- Date:
- 2014-07-16
- Revision:
- 10:5706b75d40fa
- Parent:
- 9:311b6676272d
File content as of revision 10:5706b75d40fa:
/* Keyboard chip TCA8418 control */
#include "mbed.h"
#include "keyboard.h"
const int CDU_KB_ADRS = 0x68; //Base addrees TCA8418 keypad scanner
const int I2C_ACK = 0x00;
//const int I2C_ NACK = 0x01;
extern int key_hit_ID;
//extern mbos CDU_OS;
//CDU Keyboard communications KEYBOARD_INT
InterruptIn CDU_KB_INT( p5 ); //Set CDU keyboard interrupt line.
I2C CDU_I2C(p28, p27); //I2C bus for keyboard/temp chip.
//CDU Keyboard LEDS
DigitalOut EXEC( p12 );
DigitalOut FAIL( p17 );
DigitalOut DSPY( p18 );
DigitalOut MSG( p19 );
DigitalOut OFST( p20 );
//CDU background lighting
AnalogIn BGL_POT( p16 ); //background light control potmeter
PwmOut BGL_LED( p21 ); //PWM output background lighting
void CDU_KB_COMM_INIT()
{ //initialize communication with TCA84818
char cmd[2];
cmd[0] = REG_CFG; //pointer byte to CFG register
cmd[1] = 0x01; //data for CFG register KE_IEN set to 1
if ( CDU_I2C.write(CDU_KB_ADRS,cmd, 2) == I2C_ACK ) //initiate write cycle and check for ACK
{
//intialize all registers from TCA8418 here
cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
cmd[1] = 0x01; //Reset KE-INT flag
CDU_I2C.write(CDU_KB_ADRS,cmd, 2 ); //Write to Interrupt Status Register from TCA4818
//Set TCA8418 to Keypad mode
cmd[0]=REG_KP_GPIO1; //KP_GIO1
cmd[1]=0xFF; //Set to Keypad mode
CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
cmd[0]=REG_KP_GPIO2; //KP_GIO2
cmd[1]=0xFF; //Set to Keypad mode
CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
cmd[0]=REG_KP_GPIO3; //KP_GIO3
cmd[1]=0xFF; //Set to Keypad mode
CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
}
else
{
//No response from TCA8418 keyboard chip
FAIL = 1; //Switch on FAIL indicator
}
}
void CDU_KB_GET_KEY()
{
EXEC = 1;//flash EXEC leds when key pressed....
wait( 0.1 );
EXEC = 0;
char cmd[2];
//Read interrupt status flag
cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value
//Read Key Lock and Event Counter
cmd[0] = REG_KEY_LCK_EC; //pointer byte KEY_LCK_EC
CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value
//Keypress --> read data from keybuffer
cmd[0] = REG_KEY_EVENT_A; //pointer to Key Event Register KEY_EVENT_A
CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
CDU_I2C.read(CDU_KB_ADRS, cmd, 2); //read key value (=2 words)
//Reset interrupt flag
cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
cmd[1] = 0x01; //Reset KE-INT flag
CDU_I2C.write(CDU_KB_ADRS,cmd, 2 );
//CDU_OS.SetEvent(KEY_EVENT,SEND_KEYMESSAGE_TASK_ID ); //Set event key to wakeup task
}
void CDU_KB_INT_START()
{
CDU_KB_INT.mode( PullUp ); //Keyboard chip pulls this line to 0 on a keypress
CDU_KB_INT.fall(&CDU_KB_GET_KEY); //Bind function to interrupt handler
}
void CDU_SET_BGL_INTENSITY( int nVal=255 )
{
//This routine must be called 5-10x per second. Manual test to see what is pleasant to see
//AnalogIn BGL_POT( p15 ); //background light control potmeter. Returns a value between 0.0 and 1.0
//PwmOut BGL_LED( p21 ); //PWM output
//calculate required brightness in percentage from 0%-100%
//nVal 255 --> calculate brightness from potmeter value (default value if no parameter is passed)
//nVal = 0 --> switch off backlight
//nVal = 100 --> switch on backlight max
switch (nVal)
{
case 0:
{
//switch off backlighting
BGL_LED.pulsewidth( 0.0 );
break;
}
case 100:
{
//switch on backlighting
BGL_LED.pulsewidth( 100.0 );
break;
}
case 255:
{
//calculate percentage from potmeter value
if ( BGL_POT < 0.01 )
{
BGL_LED = 0.0; //prevents flickering when low intensity
}
else
{
BGL_LED = BGL_POT;
}
}
}
}
