Support Center » Knowledgebase » Touch Panel Library (mC PRO for dsPIC)
 Touch Panel Library (mC PRO for dsPIC)
Article

Touch Panel Library

The mikroC PRO for dsPIC30/33 and PIC24 provides a library for working with Touch Panel.

External dependencies of Touch Panel Library

The following variables must be defined in all projects using Touch Panel Library: Description : Example :
extern sfr sbit DriveA; DriveA line. sbit DriveA at LATC13_bit;
extern sfr sbit DriveB; DriveB line. sbit DriveB at LATC14_bit;
extern sfr sbit DriveA_Direction; Direction of the DriveA pin. sbit DriveA_Direction at TRISC13_bit;
extern sfr sbit DriveB_Direction; Direction of the DriveB pin. sbit DriveB_Direction at TRISC14_bit;

Library Routines

TP_Init

Prototype

void TP_Init(char display_width, char display_height, char readX_ChNo, char readY_ChNo);

Description

Initialize touch panel display. Default touch panel ADC threshold value is set to 3900.

Parameters
  • display_width: set display width.
  • display_height: set display height.
  • readX_ChNo: read X coordinate from desired ADC channel.
  • readY_ChNo: read Y coordinate from desired ADC channel.
Returns

Nothing.

Requires

Before calling this function initialize ADC module.

Example
ADC1_Init();               // Initalize ADC module
TP_Init(128, 64, 6, 7); // Initialize touch panel, dimensions 128x64
Notes

None.

TP_Set_ADC_Threshold

Prototype

void TP_Set_ADC_Threshold(unsigned int threshold);

Description

Set custom ADC threshold value, call this function after TP_Init.

Parameters
  • threshold: custom ADC threshold value.
Returns

Nothing.

Requires

TP_Init has to be called before using this routine.

Example
TP_Set_ADC_Threshold(3900);    // Set touch panel ADC threshold
Notes

None.

TP_Press_Detect

Prototype

char TP_Press_Detect();

Description

Detects if the touch panel has been pressed.

Parameters

None.

Returns
  • 1 - if touch panel is pressed.
  • 0 - otherwise.
Requires

Global variables :

  • DriveA: DriveA.
  • DriveB: DriveB.
  • DriveA_Direction: Direction of DriveA pin.
  • DriveB_Direction: Direction of DriveB pin.
must be defined before using this function.

Example
// Touch Panel module connections
sbit DriveA at LATC13_bit;
sbit DriveB at LATC14_bit;
sbit DriveA_Direction at TRISC13_bit;
sbit DriveB_Direction at TRISC14_bit;
// End Touch Panel module connections

if (TP_Press_Detect()) {
...
}
Notes

None.

TP_Get_Coordinates

Prototype

char TP_Get_Coordinates(unsigned int *x_coordinate, unsigned int *y_coordinate);

Description

Get touch panel coordinates and store them in x_coordinate and y_coordinate parameters.

Parameters
  • x_coordinate: x coordinate of the place of touch.
  • y_coordinate: y coordinate of the place of touch.
Returns
  • 0 - if reading is within display dimension range.
  • 1 - if reading is out of display dimension range.
Requires

Nothing.

Example
if (TP_Get_Coordinates(&x_coord, &y_coord) == 0) {
...
}
Notes

None.

TP_Calibrate_Bottom_Left

Prototype

void TP_Calibrate_Bottom_Left();

Description

Calibrate bottom left corner of the touch Panel.

Parameters

None.

Returns

Nothing.

Requires

Nothing.

Example
TP_Calibrate_Bottom_Left();    // Calibration of bottom left corner
Notes

None.

TP_Calibrate_Upper_Right

Prototype

void TP_Calibrate_Upper_Right();

Description

Calibrate upper right corner of the touch panel.

Parameters

None.

Returns

Nothing.

Requires

Nothing.

Example
TP_Calibrate_Upper_Right();    // Calibration of upper right corner
Notes

None.

TP_Get_Calibration_Consts

Prototype

void TP_Get_Calibration_Consts(unsigned *x_min, unsigned *x_max, unsigned *y_min, unsigned *y_max);

Description

Gets calibration constants after calibration is done and stores them in x_min, x_max, y_min and y_max parameters.

Parameters
  • x_min: x coordinate of the bottom left corner of the working area.
  • x_max: x coordinate of the upper right corner of the working area.
  • y_min: y coordinate of the bottom left corner of the working area.
  • y_max: y coordinate of the upper right corner of the working area.
Returns

Nothing.

Requires

Nothing.

Example
// Get calibration options
TP_Get_Calibration_Consts(&x_min, &y_min, &x_max, &y_max);
Notes

None.

TP_Set_Calibration_Consts

Prototype

void TP_Set_Calibration_Consts(int x_min, int x_max, int y_min, int y_max);

Description

Sets calibration constants.

Parameters
  • x_min: x coordinate of the bottom left corner of the working area.
  • x_max: x coordinate of the upper right corner of the working area.
  • y_min: y coordinate of the bottom left corner of the working area.
  • y_max: y coordinate of the upper right corner of the working area.
Returns

Nothing.

Requires

Nothing.

Example
TP_Set_Calibration_Consts(148, 3590, 519, 3370);    // Set calibration constants
Notes

None.

Library Example

The following drawing demo tests routines of the Touch Panel library :

// Glcd module connections
sbit GLCD_D7 at RD3_bit;
sbit GLCD_D6 at RD2_bit;
sbit GLCD_D5 at RD1_bit;
sbit GLCD_D4 at RD0_bit;
sbit GLCD_D3 at RB3_bit;
sbit GLCD_D2 at RB2_bit;
sbit GLCD_D1 at RB1_bit;
sbit GLCD_D0 at RB0_bit;
sbit GLCD_D7_Direction at TRISD3_bit;
sbit GLCD_D6_Direction at TRISD2_bit;
sbit GLCD_D5_Direction at TRISD1_bit;
sbit GLCD_D4_Direction at TRISD0_bit;
sbit GLCD_D3_Direction at TRISB3_bit;
sbit GLCD_D2_Direction at TRISB2_bit;
sbit GLCD_D1_Direction at TRISB1_bit;
sbit GLCD_D0_Direction at TRISB0_bit;

sbit GLCD_CS1 at LATB4_bit;
sbit GLCD_CS2 at LATB5_bit;
sbit GLCD_RS at LATF0_bit;
sbit GLCD_RW at LATF1_bit;
sbit GLCD_EN at LATF4_bit;
sbit GLCD_RST at LATF5_bit;
sbit GLCD_CS1_Direction at TRISB4_bit;
sbit GLCD_CS2_Direction at TRISB5_bit;
sbit GLCD_RS_Direction at TRISF0_bit;
sbit GLCD_RW_Direction at TRISF1_bit;
sbit GLCD_EN_Direction at TRISF4_bit;
sbit GLCD_RST_Direction at TRISF5_bit;
// End Glcd module connections

// Touch Panel module connections
sbit DriveA at LATC13_bit;
sbit DriveB at LATC14_bit;
sbit DriveA_Direction at TRISC13_bit;
sbit DriveB_Direction at TRISC14_bit;
// End Touch Panel module connections

bit write_erase;
char pen_size;
char write_msg[] = "WRITE"; // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
unsigned int x_coord, y_coord;

void Initialize() {
ADPCFG = 0xFF3F; // set AN6 and AN7 channel pins as analog

DriveA_Direction = 0; // Set DriveA pin as output
DriveB_Direction = 0; // Set DriveB pin as output

Glcd_Init(); // Initialize GLCD
Glcd_Fill(0); // Clear GLCD

ADC1_Init(); // Initalize ADC module
TP_Init(128, 64, 6, 7); // Initialize touch panel
TP_Set_ADC_Threshold(3900); // Set touch panel ADC threshold
}

void Calibrate() {

Glcd_Dot(0,63,1); // Draw bottom left dot
Glcd_Write_Text("TOUCH BOTTOM LEFT",12,3,1);
TP_Calibrate_Bottom_Left(); // Calibration of bottom left corner
Delay_ms(1000);

Glcd_Dot(0,63,0); // Clear bottom left dot
Glcd_Dot(127,0,1); // Draw upper right dot
Glcd_Write_Text(" ",12,3,1);
Glcd_Write_Text("TOUCH UPPER RIGHT",12,4,1);
TP_Calibrate_Upper_Right(); // Calibration of upper right corner

Delay_ms(1000);
}

void main() {

Initialize();

Glcd_Write_Text("CALIBRATION",12,3,1);
Delay_ms(1000);
Glcd_Fill(0); // Clear GLCD
Calibrate();

Glcd_Fill(0);
Glcd_Write_Text("WRITE ON SCREEN", 20, 5, 1) ;
Delay_ms(1000);

Glcd_Fill(0); // Clear GLCD
Glcd_V_Line(0,7,0,1);
Glcd_Write_Text(clear_msg,1,0,0);
Glcd_V_Line(0,7,97,1);
Glcd_Write_Text(erase_msg,98,0,0);

// Pen Menu:
Glcd_Rectangle(41,0,52,9,1);
Glcd_Box(45,3,48,6,1);
Glcd_Rectangle(63,0,70,7,1);
Glcd_Box(66,3,67,4,1);
Glcd_Rectangle(80,0,86,6,1);
Glcd_Dot(83,3,1);

write_erase = 1;
pen_size = 1;
while (1) {

if (TP_Press_Detect()) {
// After a PRESS is detected read X-Y and convert it to 128x64 space
if (TP_Get_Coordinates(&x_coord, &y_coord) == 0) {

if ((x_coord < 31) && (y_coord < 8)) {

Glcd_Fill(0);

// Pen Menu:
Glcd_Rectangle(41,0,52,9,1);
Glcd_Box(45,3,48,6,1);
Glcd_Rectangle(63,0,70,7,1);
Glcd_Box(66,3,67,4,1);
Glcd_Rectangle(80,0,86,6,1);
Glcd_Dot(83,3,1);

Glcd_V_Line(0,7,0,1);
Glcd_Write_Text(clear_msg,1,0,0);
Glcd_V_Line(0,7,97,1);
if (write_erase)
Glcd_Write_Text(erase_msg,98,0,0);
else
Glcd_Write_Text(write_msg,98,0,0);
}

// If write/erase is pressed
if ((x_coord > 96) && (y_coord < 8)) {
if (write_erase) {
write_erase = 0;
Glcd_Write_Text(write_msg,98,0,0);
Delay_ms(500);
}
else {
write_erase = 1;
Glcd_Write_Text(erase_msg,98,0,0);
Delay_ms(500);
}
}

// If pen size is selected
if ((x_coord >= 41) && (x_coord <= 52) && (y_coord <= 9))
pen_size = 3;

if ((x_coord >= 63) && (x_coord <= 70) && (y_coord <= 7))
pen_size = 2;

if ((x_coord >= 80) && (x_coord <= 86) && (y_coord <= 6))
pen_size = 1;

if (y_coord < 11)
continue;

switch (pen_size) {
case 1 : {
if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127) && (y_coord <= 63) )
Glcd_Dot(x_coord, y_coord, write_erase);
break;
}
case 2 : {
if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127-1) && (y_coord <= 63-1) )
Glcd_Box(x_coord, y_coord, x_coord + 1, y_coord + 1, write_erase);
break;
}
case 3 : {
if ( (x_coord >= 1) && (y_coord >= 1) && (x_coord <= 127-2) && (y_coord <= 63-2) )
Glcd_Box(x_coord-1, y_coord-1, x_coord + 2, y_coord + 2, write_erase);
break;
}
}
}
}
}
}
Article Details
Article ID: 647
Created On: 24 Mar 2010 2:53 PM

 Back
 How to register?
Support ticket system uses Login Share option linked to our Forum users database. If you are still not a registered Forum user, you should register here
 Log in  
Username:
Password:
Remember Me:
 
 Search
 Article Options