Updated library to work with the FRDM KL25Z board. Original code downloaded from DFRobot. Warning. For the 5 way switch to work correctly the LCD4884 shiled needs to be modified. The PCB line between resistor 202 and 102 just bellow the RED power LED needs to be cut and a connection from the 202 resistor to the 3V3 pin needs to be made.

Dependents:   10A_ClassProject_MegnaticGame

Fork of LCD4884 by Dan Ghiciulescu

Committer:
1918june
Date:
Tue Dec 08 16:11:19 2015 +0000
Revision:
4:c6ce6c885358
Parent:
2:64fedf08e2ae
vdvad

Who changed what in which revision?

UserRevisionLine numberNew contents of line
COX 0:28f3c9274ea7 1 /*
COX 0:28f3c9274ea7 2 Modified by COX
COX 0:28f3c9274ea7 3 version 0.1
COX 0:28f3c9274ea7 4
COX 0:28f3c9274ea7 5 Editor : COX
COX 0:28f3c9274ea7 6 Date : 06.03.2013
COX 0:28f3c9274ea7 7
COX 0:28f3c9274ea7 8 *
COX 0:28f3c9274ea7 9 * Update DFRobot source to work on FRDM KL25Z
COX 0:28f3c9274ea7 10 *
COX 0:28f3c9274ea7 11 */
COX 0:28f3c9274ea7 12
COX 0:28f3c9274ea7 13 #include "LCD4884.h"
COX 0:28f3c9274ea7 14 #include "font_6x8.h"
COX 0:28f3c9274ea7 15 #include "font_big.h"
COX 0:28f3c9274ea7 16
COX 0:28f3c9274ea7 17 DigitalOut SpiClk(SPI_SCK); //2- Serial Clock(Master Output)
COX 0:28f3c9274ea7 18 DigitalOut SpiMosi(SPI_MOSI); //3- Master Output,Slave Input
COX 0:28f3c9274ea7 19 DigitalOut LcdDC(LCD_DC); //4- Data/Command(command active low)
COX 0:28f3c9274ea7 20 DigitalOut SpiCS(SPI_CS); //5- Chip Select,Slave Transmit Enable(active low,Master Output)
COX 0:28f3c9274ea7 21 DigitalOut LcdRst(LCD_RST); //6- One Reset button
COX 0:28f3c9274ea7 22 PwmOut LcdBl(LCD_BL); //7- LCD backlight
COX 0:28f3c9274ea7 23
COX 0:28f3c9274ea7 24 LCD4884::LCD4884()
COX 0:28f3c9274ea7 25 {};
COX 0:28f3c9274ea7 26
COX 0:28f3c9274ea7 27 /******************************************************************/
COX 0:28f3c9274ea7 28 void LCD4884::backlight(float dat)
COX 0:28f3c9274ea7 29 {
COX 0:28f3c9274ea7 30 LcdBl = dat;
COX 0:28f3c9274ea7 31 }
COX 0:28f3c9274ea7 32
COX 0:28f3c9274ea7 33 /******************************************************************/
COX 0:28f3c9274ea7 34 void LCD4884::LCD_init(void)
COX 0:28f3c9274ea7 35 {
COX 0:28f3c9274ea7 36 /* pin intializer */
COX 0:28f3c9274ea7 37 SpiClk = LOW;
COX 0:28f3c9274ea7 38 SpiMosi = LOW;
COX 0:28f3c9274ea7 39 SpiCS = LOW;
COX 0:28f3c9274ea7 40 LcdDC = LOW;
COX 0:28f3c9274ea7 41 LcdBl = LOW;
COX 0:28f3c9274ea7 42
COX 0:28f3c9274ea7 43 LcdRst = LOW;
COX 0:28f3c9274ea7 44 wait(ONE_US);
COX 0:28f3c9274ea7 45 LcdRst = HIGH;
COX 0:28f3c9274ea7 46
COX 0:28f3c9274ea7 47 SpiCS = LOW; //Chip Select, Slave Transmit Enable(active low, Master Output)
COX 0:28f3c9274ea7 48 wait(ONE_US);
COX 0:28f3c9274ea7 49 SpiCS = HIGH;
COX 0:28f3c9274ea7 50 wait(ONE_US);
COX 0:28f3c9274ea7 51 LcdBl = LCD_INITIAL_BRIGHTNESS;
COX 0:28f3c9274ea7 52
COX 0:28f3c9274ea7 53 //data_type=0, all are command bytes
COX 0:28f3c9274ea7 54 LCD_write_byte(0x21, 0); //Function Set:0 0 1 0 0 PD V H=0010 0001;PD=0,V=0,H=1;
COX 0:28f3c9274ea7 55 LCD_write_byte(0xc0, 0); //Set Vop:1 Vop6 Vop5 Vop4 Vop3 Vop2 Vop1 Vop0=1100 0000
COX 0:28f3c9274ea7 56 LCD_write_byte(0x06, 0); //Set Temperature Coefficient:0 0 0 0 0 1 Tc1 Tc0=0000 0110;Tc1=1,Tc0=0(Vlcd temperature coefficient 2)
COX 0:28f3c9274ea7 57 LCD_write_byte(0x13, 0); //Set Bias System (BSx):0 0 0 1 0 BS2 BS1 BS0=0001 0011;BS2=0, BS1=1, BS0=1==>N=4,MUX RATE=1:48
COX 0:28f3c9274ea7 58
COX 0:28f3c9274ea7 59 LCD_write_byte(0x20, 0);//Function Set:0 0 1 0 0 PD V H=0010 0000;PD=0,V=0,H=0;
COX 0:28f3c9274ea7 60 LCD_clear();
COX 0:28f3c9274ea7 61 LCD_write_byte(0x0c, 0);//Display Control: 0 0 0 0 1 D 0 E=0000 1100 ;D=1,E=0:normal mode
COX 0:28f3c9274ea7 62
COX 0:28f3c9274ea7 63 SpiCS = LOW;
COX 0:28f3c9274ea7 64 }
COX 0:28f3c9274ea7 65
COX 0:28f3c9274ea7 66 /******************************************************************/
COX 0:28f3c9274ea7 67 void LCD4884::LCD_write_byte(unsigned char dat, unsigned char dat_type)
COX 0:28f3c9274ea7 68 {
COX 0:28f3c9274ea7 69 unsigned int i;
COX 0:28f3c9274ea7 70 SpiCS = LOW; //Chip Enable:Active LOW
COX 0:28f3c9274ea7 71
COX 0:28f3c9274ea7 72 if (dat_type == 0)
COX 0:28f3c9274ea7 73 LcdDC = LOW; // D/C=0:the current data byte is interpreted as command byte
COX 0:28f3c9274ea7 74 else
COX 0:28f3c9274ea7 75 LcdDC = HIGH; // D/C=1:write data to display RAM
COX 0:28f3c9274ea7 76
COX 0:28f3c9274ea7 77 for(i=0;i<8;i++)
COX 0:28f3c9274ea7 78 {
COX 0:28f3c9274ea7 79 if(dat&0x80) //1000 0000
COX 0:28f3c9274ea7 80 {
COX 0:28f3c9274ea7 81 SpiMosi = HIGH;
COX 0:28f3c9274ea7 82 }
COX 0:28f3c9274ea7 83 else
COX 0:28f3c9274ea7 84 {
COX 0:28f3c9274ea7 85 SpiMosi = LOW;
COX 0:28f3c9274ea7 86 }
COX 0:28f3c9274ea7 87 SpiClk = LOW;
COX 0:28f3c9274ea7 88 dat = dat << 1;
COX 0:28f3c9274ea7 89 SpiClk = HIGH;
COX 0:28f3c9274ea7 90 }
COX 0:28f3c9274ea7 91 SpiCS = HIGH;
COX 0:28f3c9274ea7 92 }
COX 0:28f3c9274ea7 93
COX 0:28f3c9274ea7 94 /******************************************************************/
COX 0:28f3c9274ea7 95 void LCD4884::LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
COX 0:28f3c9274ea7 96 unsigned char Pix_x,unsigned char Pix_y)
COX 0:28f3c9274ea7 97 {
COX 0:28f3c9274ea7 98 unsigned int i,n;
COX 0:28f3c9274ea7 99 unsigned char row;
COX 0:28f3c9274ea7 100
COX 0:28f3c9274ea7 101 if (Pix_y%8==0)
COX 0:28f3c9274ea7 102 row=Pix_y/8; //row from 1 to 6;Pix_y from R0 to R47
COX 0:28f3c9274ea7 103 else
COX 0:28f3c9274ea7 104 row=Pix_y/8+1; //Quotient+1
COX 0:28f3c9274ea7 105
COX 0:28f3c9274ea7 106 for (n=0;n<row;n++)
COX 0:28f3c9274ea7 107 {
COX 0:28f3c9274ea7 108 LCD_set_XY(X,Y);
COX 0:28f3c9274ea7 109 for(i=0; i<Pix_x; i++)
COX 0:28f3c9274ea7 110 {
COX 0:28f3c9274ea7 111 LCD_write_byte(map[i+n*Pix_x], 1); // D/C=1:write data to display RAM
COX 0:28f3c9274ea7 112 }
COX 0:28f3c9274ea7 113 Y++;
COX 0:28f3c9274ea7 114 }
COX 0:28f3c9274ea7 115 }
COX 0:28f3c9274ea7 116
COX 0:28f3c9274ea7 117 /**************************************************************************************/
COX 0:28f3c9274ea7 118 void LCD4884::LCD_write_string(unsigned char X,unsigned char Y,char *s, char mode)
COX 0:28f3c9274ea7 119 {
1918june 2:64fedf08e2ae 120
COX 0:28f3c9274ea7 121 LCD_set_XY(X,Y);
COX 0:28f3c9274ea7 122 while (*s)
COX 0:28f3c9274ea7 123 {
COX 0:28f3c9274ea7 124 LCD_write_char(*s, mode);
COX 0:28f3c9274ea7 125 s++;
COX 0:28f3c9274ea7 126 }
COX 0:28f3c9274ea7 127 }
COX 0:28f3c9274ea7 128
COX 0:28f3c9274ea7 129 /**************************************************************************************/
COX 0:28f3c9274ea7 130 void LCD4884::LCD_prop_write_string(unsigned char X,unsigned char Y,char *s, char mode)
COX 0:28f3c9274ea7 131 {
COX 0:28f3c9274ea7 132 LCD_set_XY(X,Y);
COX 0:28f3c9274ea7 133 while (*s)
COX 0:28f3c9274ea7 134 {
COX 0:28f3c9274ea7 135 LCD_prop_write_char(*s, mode);
COX 0:28f3c9274ea7 136 s++;
COX 0:28f3c9274ea7 137 }
COX 0:28f3c9274ea7 138 }
COX 0:28f3c9274ea7 139
COX 0:28f3c9274ea7 140 /*************************************************************************************/
COX 0:28f3c9274ea7 141 void LCD4884::LCD_write_chinese(unsigned char X, unsigned char Y,unsigned char *c,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row)
COX 0:28f3c9274ea7 142 {
COX 0:28f3c9274ea7 143 unsigned char i,n;
COX 0:28f3c9274ea7 144 LCD_set_XY(X,Y);
COX 0:28f3c9274ea7 145 for (i=0;i<num;)
COX 0:28f3c9274ea7 146 {
COX 0:28f3c9274ea7 147 for (n=0; n<ch_with*2; n++)
COX 0:28f3c9274ea7 148 {
COX 0:28f3c9274ea7 149 if (n==ch_with)
COX 0:28f3c9274ea7 150 {
COX 0:28f3c9274ea7 151 if (i==0)
COX 0:28f3c9274ea7 152 LCD_set_XY(X,Y+1);
COX 0:28f3c9274ea7 153 else
COX 0:28f3c9274ea7 154 LCD_set_XY((X+(ch_with+row)*i),Y+1);
COX 0:28f3c9274ea7 155 }
COX 0:28f3c9274ea7 156 LCD_write_byte(c[(i*ch_with*2)+n],1);
COX 0:28f3c9274ea7 157 }
COX 0:28f3c9274ea7 158 i++;
COX 0:28f3c9274ea7 159 LCD_set_XY((X+(ch_with+row)*i),Y);
COX 0:28f3c9274ea7 160 }
COX 0:28f3c9274ea7 161 }
COX 0:28f3c9274ea7 162
COX 0:28f3c9274ea7 163
COX 0:28f3c9274ea7 164 /******************************************************************/
COX 0:28f3c9274ea7 165 void LCD4884::LCD_write_string_big ( unsigned char X,unsigned char Y, char *string, char mode )
COX 0:28f3c9274ea7 166 {
COX 0:28f3c9274ea7 167 while ( *string )
COX 0:28f3c9274ea7 168 {
COX 0:28f3c9274ea7 169 LCD_write_char_big( X, Y, *string , mode );
COX 0:28f3c9274ea7 170
COX 0:28f3c9274ea7 171 if(*string++ == '.')
COX 0:28f3c9274ea7 172 X += 5;
COX 0:28f3c9274ea7 173 else
COX 0:28f3c9274ea7 174 X += 12;
COX 0:28f3c9274ea7 175 }
COX 0:28f3c9274ea7 176 }
COX 0:28f3c9274ea7 177
COX 0:28f3c9274ea7 178 /******************************************************************/
COX 0:28f3c9274ea7 179 /* write char in big font */
COX 0:28f3c9274ea7 180 void LCD4884::LCD_write_char_big (unsigned char X,unsigned char Y, unsigned char ch, char mode)
COX 0:28f3c9274ea7 181 {
COX 0:28f3c9274ea7 182 unsigned char i, j;
COX 0:28f3c9274ea7 183 unsigned char *pFont;
COX 0:28f3c9274ea7 184 unsigned char ch_dat;
COX 0:28f3c9274ea7 185
COX 0:28f3c9274ea7 186 pFont = (unsigned char *) big_number;
COX 0:28f3c9274ea7 187
COX 0:28f3c9274ea7 188 if(ch == '.')
COX 0:28f3c9274ea7 189 ch = 10;
COX 0:28f3c9274ea7 190 else if (ch == '+')
COX 0:28f3c9274ea7 191 ch = 11;
COX 0:28f3c9274ea7 192 else if (ch == '-')
COX 0:28f3c9274ea7 193 ch = 12;
COX 0:28f3c9274ea7 194 else
COX 0:28f3c9274ea7 195 ch = ch & 0x0f;
COX 0:28f3c9274ea7 196
COX 0:28f3c9274ea7 197 for(i=0;i<3;i++)
COX 0:28f3c9274ea7 198 {
COX 0:28f3c9274ea7 199 LCD_set_XY ( X, Y+i);
COX 0:28f3c9274ea7 200
COX 0:28f3c9274ea7 201 for(j=0; j<16; j++)
COX 0:28f3c9274ea7 202 {
COX 0:28f3c9274ea7 203 ch_dat = *(pFont+ch*48 + i*16 +j);
COX 0:28f3c9274ea7 204 LCD_write_byte( (mode == MENU_NORMAL)? ch_dat : (ch_dat^0xff), 1);
COX 0:28f3c9274ea7 205 }
COX 0:28f3c9274ea7 206 }
COX 0:28f3c9274ea7 207 }
COX 0:28f3c9274ea7 208
COX 0:28f3c9274ea7 209 /******************************************************************/
COX 0:28f3c9274ea7 210 void LCD4884::LCD_write_char(unsigned char c, char mode)
COX 0:28f3c9274ea7 211 {
COX 0:28f3c9274ea7 212 unsigned char line;
COX 0:28f3c9274ea7 213 unsigned char *pFont;
COX 0:28f3c9274ea7 214 unsigned char ch;
COX 0:28f3c9274ea7 215
COX 0:28f3c9274ea7 216 pFont = (unsigned char *)font6_8; //pointer *pFont points at font6_8[][6]
COX 0:28f3c9274ea7 217 c -= 32; // the ASCII of "SP" is 32
COX 0:28f3c9274ea7 218
COX 0:28f3c9274ea7 219 for (line=0; line<6; line++)
COX 0:28f3c9274ea7 220 {
COX 0:28f3c9274ea7 221 ch = *(pFont+c*6+line); //read c from the font6_8[][6] (the detail information is in the "font6x8.h")
COX 0:28f3c9274ea7 222 LCD_write_byte( (mode==MENU_NORMAL)? ch: (ch^ 0xff) , 1); //MENU_NORMAL=0,True:return ch;False:return ch
COX 0:28f3c9274ea7 223 }
COX 0:28f3c9274ea7 224 }
COX 0:28f3c9274ea7 225
COX 0:28f3c9274ea7 226 /*******************************************************************/
COX 0:28f3c9274ea7 227 unsigned char LCD4884::LCD_prop_write_char(unsigned char c, char mode)
COX 0:28f3c9274ea7 228 {
COX 0:28f3c9274ea7 229 int line, line_s=0, line_e=2;
COX 0:28f3c9274ea7 230 unsigned char *pFont;
COX 0:28f3c9274ea7 231 unsigned char ch;
COX 0:28f3c9274ea7 232
COX 0:28f3c9274ea7 233 pFont = (unsigned char *)font6_8;
COX 0:28f3c9274ea7 234 if (c -= 32)
COX 0:28f3c9274ea7 235 {
COX 0:28f3c9274ea7 236 for (line_s=0; line_s<6; line_s++)
COX 0:28f3c9274ea7 237 {
COX 0:28f3c9274ea7 238 if(*(pFont+c*6+line_s))
COX 0:28f3c9274ea7 239 break;
COX 0:28f3c9274ea7 240 }
COX 0:28f3c9274ea7 241 for (line_e=5; line_e<0; line_e--)
COX 0:28f3c9274ea7 242 {
COX 0:28f3c9274ea7 243 if(*(pFont+c*6+line_e))
COX 0:28f3c9274ea7 244 break;
COX 0:28f3c9274ea7 245 }
COX 0:28f3c9274ea7 246 }
COX 0:28f3c9274ea7 247 for (line=line_s; line<line_e+1; line++)
COX 0:28f3c9274ea7 248 {
COX 0:28f3c9274ea7 249 ch = *(pFont+c*6+line);
COX 0:28f3c9274ea7 250 LCD_write_byte( (mode==MENU_NORMAL)? ch: (ch^ 0xff) , 1);
COX 0:28f3c9274ea7 251 }
COX 0:28f3c9274ea7 252 LCD_write_byte( (mode==MENU_NORMAL)? 0:0xff, 1);
COX 0:28f3c9274ea7 253 return ((unsigned char)(line_e+2 - line_s));
COX 0:28f3c9274ea7 254 }
COX 0:28f3c9274ea7 255
COX 0:28f3c9274ea7 256 /******************************************************************/
COX 0:28f3c9274ea7 257 void LCD4884::LCD_set_XY(unsigned char X, unsigned char Y)
COX 0:28f3c9274ea7 258 {
COX 0:28f3c9274ea7 259 LCD_write_byte(0x40 | Y, 0); // column
COX 0:28f3c9274ea7 260 LCD_write_byte(0x80 | X, 0); // row
COX 0:28f3c9274ea7 261 }
COX 0:28f3c9274ea7 262
COX 0:28f3c9274ea7 263 /******************************************************************/
COX 0:28f3c9274ea7 264 void LCD4884::LCD_clear(void)
COX 0:28f3c9274ea7 265 {
COX 0:28f3c9274ea7 266 unsigned int i;
COX 0:28f3c9274ea7 267
COX 0:28f3c9274ea7 268 LCD_write_byte(0x0c, 0);
COX 0:28f3c9274ea7 269 LCD_write_byte(0x80, 0);
COX 0:28f3c9274ea7 270
COX 0:28f3c9274ea7 271 for (i=0; i<504; i++) //6*84
COX 0:28f3c9274ea7 272 {
COX 0:28f3c9274ea7 273 LCD_write_byte(0, 1);
COX 0:28f3c9274ea7 274 }
COX 0:28f3c9274ea7 275 }
COX 0:28f3c9274ea7 276