Digital_project 57340500039 57340500070
Dependencies: mbed
Fork of Digital_project by
LCD4884.cpp@2:6b2526c99e5c, 2015-12-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |