Digital_project 57340500039 57340500070

Dependencies:   mbed

Fork of Digital_project by Teerapong Apiraungpituk

Committer:
57340500039
Date:
Wed Dec 09 10:55:01 2015 +0000
Revision:
2:6b2526c99e5c
Parent:
1:a4c852d25ead
Digital project A06

Who changed what in which revision?

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