first of all some facts about the hardware.
We use the MultimediaBoard with a PIC32 and changed the integrated display to a 4.3" LCD.
(http://www.ebay.com/itm/4-3-TFT-LCD-Mod ... 2eafe66d86).
The graphic controller of the new display is the "SSD1963" which normally Visual TFT also supports.
We soldered the cables from the SSD1963 to your MMB as attached.
Because of the PWM Signal for the Background we have connected the PWM Pin of the display directly to 3.3 V.
But the problem is still that nothing is going neither the LED Backlight nor the LCD Display.
The connection diagram of the new display is except for the PWM Pin like the old one before.
The code for initialisation is follow:
Code: Select all
#include "test_objects.h"
#include "test_resources.h"
#include "built_in.h"
// TFT module connections
unsigned int TFT_DataPort at LATE;
sbit TFT_RST at LATC1_bit;
sbit TFT_RS at LATB15_bit;
sbit TFT_CS at LATF12_bit;
sbit TFT_RD at LATD5_bit;
sbit TFT_WR at LATD4_bit;
sbit TFT_BLED at LATA9_bit;
unsigned int TFT_DataPort_Direction at TRISE;
sbit TFT_RST_Direction at TRISC1_bit;
sbit TFT_RS_Direction at TRISB15_bit;
sbit TFT_CS_Direction at TRISF12_bit;
sbit TFT_RD_Direction at TRISD5_bit;
sbit TFT_WR_Direction at TRISD4_bit;
sbit TFT_BLED_Direction at TRISA9_bit;
// End TFT module connections
// Touch Panel module connections
sbit DriveX_Left at LATB13_bit;
sbit DriveX_Right at LATB11_bit;
sbit DriveY_Up at LATB12_bit;
sbit DriveY_Down at LATB10_bit;
sbit DriveX_Left_Direction at TRISB13_bit;
sbit DriveX_Right_Direction at TRISB11_bit;
sbit DriveY_Up_Direction at TRISB12_bit;
sbit DriveY_Down_Direction at TRISB10_bit;
// End Touch Panel module connections
// Global variables
unsigned int Xcoord, Ycoord;
const ADC_THRESHOLD = 1000;
char PenDown;
void *PressedObject;
int PressedObjectType;
unsigned int caption_length, caption_height;
unsigned int display_width, display_height;
int _object_count;
unsigned short object_pressed;
TButton *local_button;
TButton *exec_button;
short button_order;
TLabel *local_label;
TLabel *exec_label;
short label_order;
TCircleButton *local_circle_button;
TCircleButton *exec_circle_button;
short circle_button_order;
void Set_Index(unsigned short index) {
TFT_RS = 0;
Delay_us(1);
TFT_WR = 0;
Delay_us(1);
TFT_DataPort = index;
TFT_WR = 1;
}
void Write_Command( unsigned short cmd ) {
TFT_RS = 1;
Delay_us(1);
TFT_WR = 0;
Delay_us(1);
TFT_DataPort = cmd;
TFT_WR = 1;
}
void Write_Data(unsigned int _data) {
TFT_RS = 1;
TFT_WR = 0;
TFT_DataPort = _data;
TFT_WR = 1;
}
void Init_ADC() {
AD1PCFG = 0xFFFF;
PCFG12_bit = 0;
PCFG13_bit = 0;
// PMP setup
ADC1_Init();
}
static void InitializeTouchPanel() {
TFT_DataPort_Direction = 0;
Init_ADC();
TFT_Set_Active(Set_Index, Write_Command, Write_Data);
TFT_Init_SSD1963(480, 272);
TP_TFT_Init(480, 272, 13, 12); // Initialize touch panel
TP_TFT_Set_ADC_Threshold(ADC_THRESHOLD); // Set touch panel ADC threshold
PenDown = 0;
PressedObject = 0;
PressedObjectType = -1;
}
void Calibrate() {
TFT_Set_Pen(CL_WHITE, 3);
TFT_Set_Font(TFT_defaultFont, CL_WHITE, FO_HORIZONTAL);
TP_TFT_Calibrate_Min(); // Calibration of bottom left corner
Delay_ms(500);
TFT_Set_Pen(CL_BLACK, 3);
TFT_Set_Font(TFT_defaultFont, CL_BLACK, FO_HORIZONTAL);
TFT_Set_Pen(CL_WHITE, 3);
TFT_Set_Font(TFT_defaultFont, CL_WHITE, FO_HORIZONTAL);
TP_TFT_Calibrate_Max(); // Calibration of bottom left corner
Delay_ms(500);
}
/////////////////////////
TScreen* CurrentScreen;
TScreen Screen1;
TLabel Label1;
char Label1_Caption[5] = "Text";
TButton Button1;
char Button1_Caption[5] = "Text";
TCircleButton CircleButton1;
char CircleButton1_Caption[5] = "Text";
TButton * const code Screen1_Buttons[1]=
{
&Button1
};
TLabel * const code Screen1_Labels[1]=
{
&Label1
};
TCircleButton * const code Screen1_CircleButtons[1]=
{
&CircleButton1
};
static void InitializeObjects() {
Screen1.Color = 0x07E0;
Screen1.Width = 480;
Screen1.Height = 272;
Screen1.ButtonsCount = 1;
Screen1.Buttons = Screen1_Buttons;
Screen1.LabelsCount = 1;
Screen1.Labels = Screen1_Labels;
Screen1.CircleButtonsCount = 1;
Screen1.CircleButtons = Screen1_CircleButtons;
Screen1.ObjectsCount = 3;
Label1.OwnerScreen = &Screen1;
Label1.Order = 0;
Label1.Left = 308;
Label1.Top = 174;
Label1.Width = 28;
Label1.Height = 12;
Label1.Visible = 1;
Label1.Active = 1;
Label1.Caption = Label1_Caption;
Label1.FontName = Tahoma11x13_Regular;
Label1.Font_Color = 0x0000;
Label1.OnUpPtr = 0;
Label1.OnDownPtr = 0;
Label1.OnClickPtr = 0;
Label1.OnPressPtr = 0;
Button1.OwnerScreen = &Screen1;
Button1.Order = 1;
Button1.Left = 262;
Button1.Top = 96;
Button1.Width = 50;
Button1.Height = 25;
Button1.Pen_Width = 1;
Button1.Pen_Color = 0x0000;
Button1.Visible = 1;
Button1.Active = 1;
Button1.Transparent = 1;
Button1.Caption = Button1_Caption;
Button1.FontName = Tahoma11x13_Regular;
Button1.PressColEnabled = 1;
Button1.Font_Color = 0x0000;
Button1.Gradient = 1;
Button1.Gradient_Orientation = 0;
Button1.Gradient_Start_Color = 0xFFFF;
Button1.Gradient_End_Color = 0xC618;
Button1.Color = 0xC618;
Button1.Press_Color = 0xC618;
Button1.OnUpPtr = 0;
Button1.OnDownPtr = 0;
Button1.OnClickPtr = 0;
Button1.OnPressPtr = 0;
CircleButton1.OwnerScreen = &Screen1;
CircleButton1.Order = 2;
CircleButton1.Left = 166;
CircleButton1.Top = 112;
CircleButton1.Radius = 25;
CircleButton1.Pen_Width = 1;
CircleButton1.Pen_Color = 0x0000;
CircleButton1.Visible = 1;
CircleButton1.Active = 1;
CircleButton1.Transparent = 1;
CircleButton1.Caption = CircleButton1_Caption;
CircleButton1.FontName = Tahoma11x13_Regular;
CircleButton1.PressColEnabled = 1;
CircleButton1.Font_Color = 0x0000;
CircleButton1.Gradient = 1;
CircleButton1.Gradient_Orientation = 0;
CircleButton1.Gradient_Start_Color = 0xFFFF;
CircleButton1.Gradient_End_Color = 0xC618;
CircleButton1.Color = 0xC618;
CircleButton1.Press_Color = 0x8410;
CircleButton1.OnUpPtr = 0;
CircleButton1.OnDownPtr = 0;
CircleButton1.OnClickPtr = 0;
CircleButton1.OnPressPtr = 0;
}
static char IsInsideObject (unsigned int X, unsigned int Y, unsigned int Left, unsigned int Top, unsigned int Width, unsigned int Height) { // static
if ( (Left<= X) && (Left+ Width - 1 >= X) &&
(Top <= Y) && (Top + Height - 1 >= Y) )
return 1;
else
return 0;
}
#define GetButton(index) CurrentScreen->Buttons[index]
#define GetLabel(index) CurrentScreen->Labels[index]
#define GetCircleButton(index) CurrentScreen->CircleButtons[index]
void DrawButton(TButton *Abutton) {
if (Abutton->Visible == 1) {
if (object_pressed == 1) {
object_pressed = 0;
TFT_Set_Brush(Abutton->Transparent, Abutton->Press_Color, Abutton->Gradient, Abutton->Gradient_Orientation, Abutton->Gradient_End_Color, Abutton->Gradient_Start_Color);
}
else {
TFT_Set_Brush(Abutton->Transparent, Abutton->Color, Abutton->Gradient, Abutton->Gradient_Orientation, Abutton->Gradient_Start_Color, Abutton->Gradient_End_Color);
}
TFT_Set_Pen(Abutton->Pen_Color, Abutton->Pen_Width);
TFT_Rectangle(Abutton->Left, Abutton->Top, Abutton->Left + Abutton->Width - 1, Abutton->Top + Abutton->Height - 1);
TFT_Set_Font(Abutton->FontName, Abutton->Font_Color, FO_HORIZONTAL);
TFT_Write_Text_Return_Pos(Abutton->Caption, Abutton->Left, Abutton->Top);
TFT_Write_Text(Abutton->Caption, (Abutton->Left + ((Abutton->Width - caption_length) / 2)), (Abutton->Top + ((Abutton->Height - caption_height) / 2)));
}
}
void DrawLabel(TLabel *ALabel) {
int x_pos, y_pos;
x_pos = 0;
y_pos = 0;
if (ALabel->Visible == 1) {
TFT_Set_Font(ALabel->FontName, ALabel->Font_Color, FO_HORIZONTAL);
TFT_Write_Text_Return_Pos(ALabel->Caption, ALabel->Left, ALabel->Top);
x_pos = ALabel->Left + ((int)(ALabel->Width - caption_length) / 2);
y_pos = ALabel->Top + ((int)(ALabel->Height - caption_height) / 2);
if (x_pos > ALabel->Left) {
TFT_Write_Text(ALabel->Caption, x_pos, y_pos);
}
else {
TFT_Write_Text(ALabel->Caption, ALabel->Left, ALabel->Top);
}
}
}
void DrawCircleButton(TCircleButton *ACircle_button) {
if (ACircle_button->Visible == 1) {
if (object_pressed == 1) {
object_pressed = 0;
TFT_Set_Brush(ACircle_button->Transparent, ACircle_button->Press_Color, ACircle_button->Gradient, ACircle_button->Gradient_Orientation,
ACircle_button->Gradient_End_Color, ACircle_button->Gradient_Start_Color);
}
else {
TFT_Set_Brush(ACircle_button->Transparent, ACircle_button->Color, ACircle_button->Gradient, ACircle_button->Gradient_Orientation,
ACircle_button->Gradient_Start_Color, ACircle_button->Gradient_End_Color);
}
TFT_Set_Pen(ACircle_button->Pen_Color, ACircle_button->Pen_Width);
TFT_Circle(ACircle_button->Left + ACircle_button->Radius,
ACircle_button->Top + ACircle_button->Radius,
ACircle_button->Radius);
TFT_Set_Font(ACircle_button->FontName, ACircle_button->Font_Color, FO_HORIZONTAL);
TFT_Write_Text_Return_Pos(ACircle_button->Caption, ACircle_button->Left, ACircle_button->Top);
TFT_Write_Text(ACircle_button->Caption, (ACircle_button->Left + (((ACircle_button->Radius*2) - caption_length) / 2)),
(ACircle_button->Top + (((ACircle_button->Radius*2) - caption_height) / 2)));
}
}
void DrawScreen(TScreen *aScreen) {
unsigned short order;
unsigned short button_idx;
TButton *local_button;
unsigned short label_idx;
TLabel *local_label;
unsigned short circle_button_idx;
TCircleButton *local_circle_button;
char save_bled, save_bled_direction;
object_pressed = 0;
order = 0;
button_idx = 0;
label_idx = 0;
circle_button_idx = 0;
CurrentScreen = aScreen;
if ((display_width != CurrentScreen->Width) || (display_height != CurrentScreen->Height)) {
save_bled = TFT_BLED;
save_bled_direction = TFT_BLED_Direction;
TFT_BLED_Direction = 0;
TFT_BLED = 0;
TFT_Set_Active(Set_Index, Write_Command, Write_Data);
TFT_Init_SSD1963(CurrentScreen->Width, CurrentScreen->Height);
TP_TFT_Init(CurrentScreen->Width, CurrentScreen->Height, 13, 12); // Initialize touch panel
TP_TFT_Set_ADC_Threshold(ADC_THRESHOLD); // Set touch panel ADC threshold
TFT_Fill_Screen(CurrentScreen->Color);
display_width = CurrentScreen->Width;
display_height = CurrentScreen->Height;
TFT_BLED = save_bled;
TFT_BLED_Direction = save_bled_direction;
}
else
TFT_Fill_Screen(CurrentScreen->Color);
while (order < CurrentScreen->ObjectsCount) {
if (button_idx < CurrentScreen->ButtonsCount) {
local_button = GetButton(button_idx);
if (order == local_button->Order) {
button_idx++;
order++;
DrawButton(local_button);
}
}
if (label_idx < CurrentScreen->LabelsCount) {
local_label = GetLabel(label_idx);
if (order == local_label->Order) {
label_idx++;
order++;
DrawLabel(local_label);
}
}
if (circle_button_idx < CurrentScreen->CircleButtonsCount) {
local_circle_button = GetCircleButton(circle_button_idx);
if (order == local_circle_button->Order) {
circle_button_idx++;
order++;
DrawCircleButton(local_circle_button);
}
}
}
}
void Get_Object(unsigned int X, unsigned int Y) {
button_order = -1;
label_order = -1;
circle_button_order = -1;
// Buttons
for ( _object_count = 0 ; _object_count < CurrentScreen->ButtonsCount ; _object_count++ ) {
local_button = GetButton(_object_count);
if (local_button->Active == 1) {
if (IsInsideObject(X, Y, local_button->Left, local_button->Top,
local_button->Width, local_button->Height) == 1) {
button_order = local_button->Order;
exec_button = local_button;
}
}
}
// Labels
for ( _object_count = 0 ; _object_count < CurrentScreen->LabelsCount ; _object_count++ ) {
local_label = GetLabel(_object_count);
if (local_label->Active == 1) {
if (IsInsideObject(X, Y, local_label->Left, local_label->Top,
local_label->Width, local_label->Height) == 1) {
label_order = local_label->Order;
exec_label = local_label;
}
}
}
// Circle Buttons
for ( _object_count = 0 ; _object_count < CurrentScreen->CircleButtonsCount ; _object_count++ ) {
local_circle_button = GetCircleButton(_object_count);
if (local_circle_button->Active == 1) {
if (IsInsideObject(X, Y, local_circle_button->Left, local_circle_button->Top,
(local_circle_button->Radius * 2), (local_circle_button->Radius * 2)) == 1) {
circle_button_order = local_circle_button->Order;
exec_circle_button = local_circle_button;
}
}
}
_object_count = -1;
if (button_order > _object_count)
_object_count = button_order;
if (label_order > _object_count )
_object_count = label_order;
if (circle_button_order > _object_count )
_object_count = circle_button_order;
}
static void Process_TP_Press(unsigned int X, unsigned int Y) {
exec_button = 0;
exec_label = 0;
exec_circle_button = 0;
Get_Object(X, Y);
if (_object_count != -1) {
if (_object_count == button_order) {
if (exec_button->Active == 1) {
if (exec_button->OnPressPtr != 0) {
exec_button->OnPressPtr();
return;
}
}
}
if (_object_count == label_order) {
if (exec_label->Active == 1) {
if (exec_label->OnPressPtr != 0) {
exec_label->OnPressPtr();
return;
}
}
}
if (_object_count == circle_button_order) {
if (exec_circle_button->Active == 1) {
if (exec_circle_button->OnPressPtr != 0) {
exec_circle_button->OnPressPtr();
return;
}
}
}
}
}
static void Process_TP_Up(unsigned int X, unsigned int Y) {
switch (PressedObjectType) {
// Button
case 0: {
if (PressedObject != 0) {
exec_button = (TButton*)PressedObject;
if ((exec_button->PressColEnabled == 1) && (exec_button->OwnerScreen == CurrentScreen)) {
DrawButton(exec_button);
}
break;
}
break;
}
// Circle Button
case 5: {
if (PressedObject != 0) {
exec_circle_button = (TCircleButton*)PressedObject;
if ((exec_circle_button->PressColEnabled == 1) && (exec_circle_button->OwnerScreen == CurrentScreen)) {
DrawCircleButton(exec_circle_button);
}
break;
}
break;
}
}
exec_label = 0;
Get_Object(X, Y);
if (_object_count != -1) {
// Buttons
if (_object_count == button_order) {
if (exec_button->Active == 1) {
if (exec_button->OnUpPtr != 0)
exec_button->OnUpPtr();
if (PressedObject == (void *)exec_button)
if (exec_button->OnClickPtr != 0)
exec_button->OnClickPtr();
PressedObject = 0;
PressedObjectType = -1;
return;
}
}
// Labels
if (_object_count == label_order) {
if (exec_label->Active == 1) {
if (exec_label->OnUpPtr != 0)
exec_label->OnUpPtr();
if (PressedObject == (void *)exec_label)
if (exec_label->OnClickPtr != 0)
exec_label->OnClickPtr();
PressedObject = 0;
PressedObjectType = -1;
return;
}
}
// Circle Buttons
if (_object_count == circle_button_order) {
if (exec_circle_button->Active == 1) {
if (exec_circle_button->OnUpPtr != 0)
exec_circle_button->OnUpPtr();
if (PressedObject == (void *)exec_circle_button)
if (exec_circle_button->OnClickPtr != 0)
exec_circle_button->OnClickPtr();
PressedObject = 0;
PressedObjectType = -1;
return;
}
}
}
PressedObject = 0;
PressedObjectType = -1;
}
static void Process_TP_Down(unsigned int X, unsigned int Y) {
object_pressed = 0;
exec_button = 0;
exec_label = 0;
exec_circle_button = 0;
Get_Object(X, Y);
if (_object_count != -1) {
if (_object_count == button_order) {
if (exec_button->Active == 1) {
if (exec_button->PressColEnabled == 1) {
object_pressed = 1;
DrawButton(exec_button);
}
PressedObject = (void *)exec_button;
PressedObjectType = 0;
if (exec_button->OnDownPtr != 0) {
exec_button->OnDownPtr();
return;
}
}
}
if (_object_count == label_order) {
if (exec_label->Active == 1) {
PressedObject = (void *)exec_label;
PressedObjectType = 2;
if (exec_label->OnDownPtr != 0) {
exec_label->OnDownPtr();
return;
}
}
}
if (_object_count == circle_button_order) {
if (exec_circle_button->Active == 1) {
if (exec_circle_button->PressColEnabled == 1) {
object_pressed = 1;
DrawCircleButton(exec_circle_button);
}
PressedObject = (void *)exec_circle_button;
PressedObjectType = 5;
if (exec_circle_button->OnDownPtr != 0) {
exec_circle_button->OnDownPtr();
return;
}
}
}
}
}
void Check_TP() {
if (TP_TFT_Press_Detect()) {
// After a PRESS is detected read X-Y and convert it to Display dimensions space
if (TP_TFT_Get_Coordinates(&Xcoord, &Ycoord) == 0) {
Process_TP_Press(Xcoord, Ycoord);
if (PenDown == 0) {
PenDown = 1;
Process_TP_Down(Xcoord, Ycoord);
}
}
}
else if (PenDown == 1) {
PenDown = 0;
Process_TP_Up(Xcoord, Ycoord);
}
}
void Init_MCU() {
PMMODE = 0;
PMAEN = 0;
PMCON = 0; // WRSP: Write Strobe Polarity bit
PMMODEbits.MODE = 2; // Master 2
PMMODEbits.WAITB = 0;
PMMODEbits.WAITM = 1;
PMMODEbits.WAITE = 0;
PMMODEbits.MODE16 = 1; // 16 bit mode
PMCONbits.CSF = 0;
PMCONbits.PTRDEN = 1;
PMCONbits.PTWREN = 1;
PMCONbits.PMPEN = 1;
TP_TFT_Rotate_180(0);
TFT_Set_Active(Set_Index,Write_Command,Write_Data);
}
void Start_TP() {
Init_MCU();
InitializeTouchPanel();
Delay_ms(1000);
TFT_Fill_Screen(0);
Calibrate();
TFT_Fill_Screen(0);
InitializeObjects();
display_width = Screen1.Width;
display_height = Screen1.Height;
DrawScreen(&Screen1);
}
Best regards from Germany,
Stephan