Class library for a touchscreen-based keypad for the LCD display present on the DISCO_F429ZI board.
Dependents: WIRE-BANDING_FT810 WIRE-BANDING_copy
Diff: KEYPAD_DISCO_F429ZI.cpp
- Revision:
- 0:8cc22acc00d2
- Child:
- 2:51f454b7c9ab
diff -r 000000000000 -r 8cc22acc00d2 KEYPAD_DISCO_F429ZI.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/KEYPAD_DISCO_F429ZI.cpp Sun May 08 18:36:57 2016 +0000 @@ -0,0 +1,277 @@ +#include "KEYPAD_DISCO_F429ZI.h" +#include "mbed.h" +#include "TS_DISCO_F429ZI.h" +#include "LCD_DISCO_F429ZI.h" + + +KEYPAD_DISCO_F429ZI::KEYPAD_DISCO_F429ZI() { + LastKey=0; + ReadKeyState = 0; + MsgBColor = LCD_COLOR_YELLOW; + MsgFColor = LCD_COLOR_RED; + OutBColor = LCD_COLOR_WHITE; + OutFColor = LCD_COLOR_BLACK; + BackColor = LCD_COLOR_BLACK; + KeyBColor = LCD_COLOR_WHITE; + KeyFColor = LCD_COLOR_BLACK; + KeyPressColor = LCD_COLOR_GRAY; + KeysTopY=110; + + Keys[0][0] = '1'; + Keys[0][1] = '2'; + Keys[0][2] = '3'; + Keys[0][3] = 'A'; + Keys[1][0] = '4'; + Keys[1][1] = '5'; + Keys[1][2] = '6'; + Keys[1][3] = 'B'; + Keys[2][0] = '7'; + Keys[2][1] = '8'; + Keys[2][2] = '9'; + Keys[2][3] = 'C'; + Keys[3][0] = '*'; + Keys[3][1] = '0'; + Keys[3][2] = '#'; + Keys[3][3] = 'D'; +} + + +void KEYPAD_DISCO_F429ZI::Show(int MessageBoxEnable, int OutBoxEnable) { + uint16_t x, y; + uint8_t row, col; + + if(MessageBoxEnable > 0) + MessageBoxEnabledFlag = 1; + else + MessageBoxEnabledFlag = 0; + + if(OutBoxEnable > 0) + OutBoxEnabledFlag = 1; + else + OutBoxEnabledFlag = 0; + + lcd.Clear(BackColor); + + /* Display Message textbox */ + if(MessageBoxEnabledFlag) { + lcd.SetFont(&Font16); + lcd.SetBackColor(MsgBColor); + lcd.SetTextColor(MsgFColor); + lcd.DisplayStringAt(4, LINE(0)+4,(uint8_t *) " ", LEFT_MODE); + lcd.DisplayStringAt(4, LINE(1)+4,(uint8_t *) " ", LEFT_MODE); + lcd.SetTextColor(MsgBColor); + lcd.FillRect(0,0,240,4); //top filler + lcd.FillRect(0,LINE(0),4,36); //left filler + lcd.FillRect(235,LINE(0),5,36); //right filler + } + + /* Display Output textbox */ + if(OutBoxEnabledFlag) { + lcd.SetFont(&Font24); + lcd.SetBackColor(OutBColor); + lcd.SetTextColor(OutFColor); + lcd.DisplayStringAt(1,LINE(2),(uint8_t *) " ", LEFT_MODE); + lcd.SetTextColor(OutBColor); + lcd.FillRect(1,LINE(2)-4,238,5); //top filler + lcd.DrawVLine(0,LINE(2)-4,28); //left filler + lcd.DrawVLine(239,LINE(2)-4,28); //right filler + } + + /* Draw buttons */ + lcd.SetTextColor(KeyBColor); + for(y=KeysTopY; y<=KeysTopY+180; y=y+60) + for(x=30; x<=210; x=x+60) + lcd.FillCircle(x,y,25); + + /* Draw button text */ + lcd.SetFont(&Font24); + lcd.SetTextColor(KeyFColor); + lcd.SetBackColor(KeyBColor); + row=0; + for(y=KeysTopY; y<=KeysTopY+180; y=y+60) + { + col=0; + for(x=30; x<=210; x=x+60) + { + lcd.DisplayChar(x-8, y-8, Keys[row][col]); + col++; + } + row++; + } + + ts.Init(240, 320); +} + +char KEYPAD_DISCO_F429ZI::ReadKey() { + uint16_t x, y; + TS_StateTypeDef TS_State; + + ts.GetState(&TS_State); + + switch(ReadKeyState) { + case 0: { //wait for key press + if (TS_State.TouchDetected) { //if the screen was touched + x = TS_State.X; //read the x value + y = TS_State.Y; //read the y value + if((x > 3) && (x <= 60) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) { //row0, col0 + row=0;col=0; + LastkeyX = 30; + LastkeyY = KeysTopY; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 60) && (x <= 120) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) { //row0, col1 + row=0;col=1; + LastkeyX = 90; + LastkeyY = KeysTopY; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 120) && (x <= 180) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) { //row0, col2 + row=0;col=2; + LastkeyX = 150; + LastkeyY = KeysTopY; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 180) && (x <= 237) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) { //row0, col3 + row=0;col=3; + LastkeyX = 210; + LastkeyY = KeysTopY; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + + if((x > 3) && (x <= 60) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) { //row1, col0 + row=1;col=0; + LastkeyX = 30; + LastkeyY = KeysTopY+60; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 60) && (x <= 120) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) { //row1, col1 + row=1;col=1; + LastkeyX = 90; + LastkeyY = KeysTopY+60; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 120) && (x <= 180) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) { //row1, col2 + row=1;col=2; + LastkeyX = 150; + LastkeyY = KeysTopY+60; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 180) && (x <= 237) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) { //row1, col3 + row=1;col=3; + LastkeyX = 210; + LastkeyY = KeysTopY+60; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + + if((x > 3) && (x <= 60) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) { //row2, col0 + row=2;col=0; + LastkeyX = 30; + LastkeyY = KeysTopY+120; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 60) && (x <= 120) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) { //row2, col1 + row=2;col=1; + LastkeyX = 90; + LastkeyY = KeysTopY+120; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 120) && (x <= 180) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) { //row2, col2 + row=2;col=2; + LastkeyX = 150; + LastkeyY = KeysTopY+120; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 180) && (x <= 237) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) { //row2, col3 + row=2;col=3; + LastkeyX = 210; + LastkeyY = KeysTopY+120; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + + if((x > 3) && (x <= 60) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) { //row3, col0 + row=3;col=0; + LastkeyX = 30; + LastkeyY = KeysTopY+180; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 60) && (x <= 120) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) { //row3, col1 + row=3;col=1; + LastkeyX = 90; + LastkeyY = KeysTopY+180; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 120) && (x <= 180) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) { //row3, col2 + row=3;col=2; + LastkeyX = 150; + LastkeyY = KeysTopY+180; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + else if((x > 180) && (x <= 237) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) { //row3, col3 + row=3;col=3; + LastkeyX = 210; + LastkeyY = KeysTopY+180; + LastKey = Keys[row][col]; + ReadKeyState = 10; + } + + + // else + // { + // //do nothing when not incorrect touch position + // } + } + } break; + + + case 10: { //draw button darker + lcd.SetFont(&Font24); + lcd.SetTextColor(KeyPressColor); + lcd.FillCircle(LastkeyX,LastkeyY,25); + lcd.SetTextColor(KeyFColor); + lcd.SetBackColor(KeyPressColor); + lcd.DisplayChar(LastkeyX-8, LastkeyY-8, Keys[row][col]); + + ReadKeyState = 20; + } break; + + + case 20: { //wait for key to be released + if(TS_State.TouchDetected == 0) + ReadKeyState = 30; + } break; + + + case 30: //draw key normal again + { + lcd.SetFont(&Font24); + lcd.SetTextColor(KeyBColor); + lcd.FillCircle(LastkeyX,LastkeyY,25); + lcd.SetTextColor(KeyFColor); + lcd.SetBackColor(KeyBColor); + lcd.DisplayChar(LastkeyX-8, LastkeyY-8, Keys[row][col]); + + LastKey = 0; + ReadKeyState = 0; + } break; + } + + wait(0.01); //to allow for contact bounce + + return LastKey; +} + \ No newline at end of file