library

Dependents:   test test

Committer:
toiy01344
Date:
Fri Dec 08 10:15:02 2017 +0000
Revision:
0:bf9618815a4a
LCD4884

Who changed what in which revision?

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