ST7735S TFT Display with PIC16F887 example – CCS C

Interfacing PIC16F887 with ST7735 TFT display

This is an example for connecting the ST7735 1.8″ color TFT display with PIC16F887 microcontroller. The compiler used in this project is CCS PIC C compiler.
The ST7735 needs a driver which can be found in the topic below:ST7735 SPI TFT Display Driver for CCS PIC C compiler

After downloading the driver file just put it on the project folder.
The ST7735 uses SPI communication protocol and the PIC16F887 has one SPI module.
Generally the SPI protocol uses 3 lines: SCK (serial clock), SDI (serial data in) and SDO (serial data out) but for interfacing the ST7735 TFT we use only 2 lines: SCK and SDO.
The PIC16F887 has one SPI module with SCK mapped to RC3 pin (#18) and SDO mapped to RC5 (#24).

TFT pin-out are shown in the circuit diagram above.
In this project I used 20MHz crystal oscillator which is the PIC16F887 maximum speed for highest SPI data transfer rate (5Mbit/s). Lower crystal frequencies can be used or even the internal oscillator of the microcontroller.
5 x 1K ohm resistors are needed because basically the ST7735 works with 3.3V and the PIC16F887 works with 5V , it may be damaged if it connected directly to the microcontroller. The TFT is supplied with +5V because its board contains AMS1117 3.3V voltage regulator.

Interfacing PIC16F887 with ST7735 TFT display CCS C code:
The code has been tested with CCS PIC C compiler version 5.051.
ST7735 TFT driver is needed to compile the code.

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

/* PIC16F887 with ST7735 TFT display example C code

ST7735 TFT display driver for CCS PIC C compiler is required

Coordinates are (x, y) starting from upper left corner (0, 0)

*/

// TFT module connections

#define TFT_CS PIN_D0

#define TFT_DC PIN_D1

#define TFT_SPI_HARDWARE

// End TFT module connections

#include <16F887.h>

#fuses NOMCLR NOBROWNOUT NOLVP HS

#use delay(clock = 20MHz)

#include <ST7735_TFT.c>

int8k=0;

char*txt="1.8 Inch ST7735 TFT display test example";

voidtestlines(unsignedint16 color){

unsignedint8x,y;

fillScreen(ST7735_BLACK);

for(x=0;x<_width;x+=6){

drawLine(0,0,x,_height-1,color);

}

for(y=0;y<_height;y+=6){

drawLine(0,0,_width-1,y,color);

}

fillScreen(ST7735_BLACK);

for(x=0;x<_width;x+=6){

drawLine(_width-1,0,x,_height-1,color);

}

for(y=0;y<_height;y+=6){

drawLine(_width-1,0,0,y,color);

}

fillScreen(ST7735_BLACK);

for(x=0;x<_width;x+=6){

drawLine(0,_height-1,x,0,color);

}

for(y=0;y<_height;y+=6){

drawLine(0,_height-1,_width-1,y,color);

}

fillScreen(ST7735_BLACK);

for(x=0;x<_width;x+=6){

drawLine(_width-1,_height-1,x,0,color);

}

for(y=0;y<_height;y+=6){

drawLine(_width-1,_height-1,0,y,color);

}

}

voidtestfastlines(unsignedint16 color1,unsignedint16 color2){

int16x,y;

fillScreen(ST7735_BLACK);

for(y=0;y<_height;y+=5){

drawFastHLine(0,y,_width,color1);

}

for(x=0;x<_width;x+=5){

drawFastVLine(x,0,_height,color2);

}

}

voidtestdrawrects(unsignedint16 color){

int16x;

fillScreen(ST7735_BLACK);

for(x=0;x<_width;x+=6){

drawRect(_width/2-x/2,_height/2-x/2,x,x,color);

}

}

voidtestfillrects(unsignedint16 color1,unsignedint16 color2){

int16x;

fillScreen(ST7735_BLACK);

for(x=_width-1;x>6;x-=6){

fillRect(_width/2-x/2,_height/2-x/2,x,x,color1);

drawRect(_width/2-x/2,_height/2-x/2,x,x,color2);

}

}

voidtestfillcircles(unsignedint8 radius,unsignedint16 color){

int16x,y;

for(x=radius;x<_width;x+=radius*2){

for(y=radius;y<_height;y+=radius*2){

fillCircle(x,y,radius,color);

}

}

}

voidtestdrawcircles(unsignedint8 radius,unsignedint16 color){

int16x,y;

for(x=0;x<_width+radius;x+=radius*2){

for(y=0;y<_height+radius;y+=radius*2){

drawCircle(x,y,radius,color);

}

}

}

voidtestroundrects(){

int8i,t;

unsignedint16 color=100;

fillScreen(ST7735_BLACK);

for(t=0;t<=4;t+=1){

unsignedint8x=0,y=0,w=_width-2,h=_height-2;

for(i=0;i<=16;i++){

drawRoundRect(x,y,w,h,5,color);

x+=2;

y+=3;

w-=4;

h-=6;

color+=1100;

}

color+=100;

}

}

voidtesttriangles(){

unsignedint8t,w,x,y,z;

unsignedint16 color=0xF800;

fillScreen(ST7735_BLACK);

w=_width/2,x=_height-1,y=0,z=_width;

for(t=0;t<=15;t++){

drawTriangle(w,y,y,x,z,x,color);

x-=4;

y+=4;

z-=4;

color+=100;

}

}

voidmediabuttons(){

// play

fillScreen(ST7735_BLACK);

fillRoundRect(25,10,78,60,8,ST7735_WHITE);

fillTriangle(42,20,42,60,90,40,ST7735_RED);

delay_ms(500);

// pause

fillRoundRect(25,90,78,60,8,ST7735_WHITE);

fillRoundRect(39,98,20,45,5,ST7735_GREEN);

fillRoundRect(69,98,20,45,5,ST7735_GREEN);

delay_ms(500);

// play color

fillTriangle(42,20,42,60,90,40,ST7735_BLUE);

delay_ms(50);

// pause color

fillRoundRect(39,98,20,45,5,ST7735_RED);

fillRoundRect(69,98,20,45,5,ST7735_RED);

// play color

fillTriangle(42,20,42,60,90,40,ST7735_GREEN);

}

voidmain(){

TFT_BlackTab_Initialize();

fillScreen(ST7735_BLACK);

drawtext(0,5,txt,ST7735_WHITE,ST7735_BLACK,1);

setTextWrap(false);

strcpy(txt,"Hello World!");

drawtext(0,30,txt,ST7735_RED,ST7735_BLACK,1);

drawtext(0,47,txt,ST7735_YELLOW,ST7735_BLACK,2);

drawtext(0,80,txt,ST7735_MAGENTA,ST7735_BLACK,3);

drawtext(0,120,txt,ST7735_CYAN,ST7735_BLACK,4);

delay_ms(5000);

fillScreen(ST7735_BLACK);

drawFastHLine(0,53,_width,ST7735_WHITE);

drawFastHLine(0,106,_width,ST7735_WHITE);

while(k++<20){

sprintf(txt,"%02u",k);

drawtext(59,25,txt,ST7735_GREEN,ST7735_BLACK,1);

drawtext(54,75,txt,ST7735_BLUE,ST7735_BLACK,2);

drawtext(49,125,txt,ST7735_RED,ST7735_BLACK,3);

delay_ms(500);

}

testlines(ST7735_YELLOW);

delay_ms(1000);

testfastlines(ST7735_RED,ST7735_BLUE);

delay_ms(1000);

testdrawrects(ST7735_GREEN);

delay_ms(1000);

testfillrects(ST7735_YELLOW,ST7735_MAGENTA);

delay_ms(1000);

fillScreen(ST7735_BLACK);

testfillcircles(10,ST7735_BLUE);

testdrawcircles(10,ST7735_WHITE);

delay_ms(1000);

testroundrects();

delay_ms(1000);

testtriangles();

delay_ms(1000);

mediabuttons();

delay_ms(1000);

while(TRUE){

invertDisplay(true);

delay_ms(500);

invertDisplay(false);

delay_ms(500);

}

}

Finally the following video shows the ST7735 and PIC16F887 in a protoboard circuit: