diff options
author | Stanley Huang <stanleyhuangyc@gmail.com> | 2013-03-25 00:57:28 +0800 |
---|---|---|
committer | Stanley Huang <stanleyhuangyc@gmail.com> | 2013-03-25 00:57:28 +0800 |
commit | 8e57c683d3d16f1dee320f10c411602ea38ba651 (patch) | |
tree | 75df3040d13c3f1850d93e29eb93a3836cae133c /samples/dashboard_4884/LCD4884.cpp | |
download | 2021-arduino-obd-8e57c683d3d16f1dee320f10c411602ea38ba651.tar.gz 2021-arduino-obd-8e57c683d3d16f1dee320f10c411602ea38ba651.tar.bz2 2021-arduino-obd-8e57c683d3d16f1dee320f10c411602ea38ba651.zip |
initial commit
Diffstat (limited to 'samples/dashboard_4884/LCD4884.cpp')
-rw-r--r-- | samples/dashboard_4884/LCD4884.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/samples/dashboard_4884/LCD4884.cpp b/samples/dashboard_4884/LCD4884.cpp new file mode 100644 index 0000000..522826d --- /dev/null +++ b/samples/dashboard_4884/LCD4884.cpp @@ -0,0 +1,294 @@ +/* +Modified by Lauren +version 0.3 + +Any suggestions are welcome. + +Editors : Lauren from DFRobot <Lauran.pan@gmail.com> + Stanley Huang <stanleyhuangyc@gmail.com> +Date : Feb. 11, 2012 + +* Added LCD_putchar for basic console display +* Have the back light under control. +* Update the library and sketch to compatible with IDE V1.0 and earlier + +*/ + +#include "LCD4884.h" +#include "font_6x8.h" +#include "font_big.h" + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#include "WConstants.h" +#endif + + +extern "C" +{ +#include <avr/pgmspace.h> +#include <avr/io.h> +} + +#define NUM_COL 14 +#define NUM_ROW 5 + +LCD4884::LCD4884():prev_char(0),char_mode(MENU_NORMAL) +{}; + +LCD4884 lcd = LCD4884(); + +void LCD4884::backlight(unsigned char dat) +{ + if(dat==1) + digitalWrite(LCD_BL,HIGH); + else + digitalWrite(LCD_BL,LOW); +} + +void LCD4884::LCD_init(void) +{ + for(unsigned char i = 2; i < 8; i++) { + pinMode(i,OUTPUT); + digitalWrite(i,LOW); + } + + digitalWrite(LCD_RST,LOW); + delayMicroseconds(1); + digitalWrite(LCD_RST,HIGH); + + digitalWrite(SPI_CS,LOW); + delayMicroseconds(1); + digitalWrite(SPI_CS,HIGH); + delayMicroseconds(1); + digitalWrite(LCD_BL,HIGH); + + LCD_write_byte(0x21, 0); + LCD_write_byte(0xc0, 0); + LCD_write_byte(0x06, 0); + LCD_write_byte(0x13, 0); + LCD_write_byte(0x20, 0); + LCD_clear(); + LCD_write_byte(0x0c, 0); + + digitalWrite(SPI_CS,LOW); +} + +void LCD4884::LCD_write_byte(unsigned char dat, unsigned char dat_type) +{ + digitalWrite(SPI_CS,LOW); + if (dat_type == 0) + digitalWrite(LCD_DC,LOW); + else + digitalWrite(LCD_DC,HIGH); + + for(unsigned char i=0; i<8; i++) { + if(dat & 0x80) { + digitalWrite(SPI_MOSI,HIGH); + } else { + digitalWrite(SPI_MOSI,LOW); + } + digitalWrite(SPI_SCK,LOW); + dat = dat << 1; + digitalWrite(SPI_SCK,HIGH); + } + digitalWrite(SPI_CS,HIGH); +} + +void LCD4884::LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map, + unsigned char Pix_x,unsigned char Pix_y) +{ + unsigned int i,n; + unsigned char row; + + if (Pix_y%8==0) + row=Pix_y/8; + else + row=Pix_y/8+1; + + for (n=0;n<row;n++) { + LCD_set_XY(X,Y); + for(i=0; i<Pix_x; i++) { + LCD_write_byte(map[i+n*Pix_x], 1); + } + Y++; + } +} + +void LCD4884::LCD_write_string(unsigned char X,unsigned char Y,char *s, char mode) + { + LCD_set_XY(X,Y); + while (*s) { + LCD_write_char(*s, mode); + s++; + } + } + +void LCD4884::LCD_write_string(char *s, char mode) + { + while (*s) { + LCD_write_char(*s, mode); + s++; + } + } + +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) +{ + LCD_set_XY(X,Y); + for (unsigned char i=0;i<num;) { + for (unsigned char n=0; n<ch_with*2; n++) { + if (n==ch_with) { + if (i==0) + LCD_set_XY(X,Y+1); + else + LCD_set_XY((X+(ch_with+row)*i),Y+1); + } + LCD_write_byte(c[(i*ch_with*2)+n],1); + } + i++; + LCD_set_XY((X+(ch_with+row)*i),Y); + } +} + + +void LCD4884::LCD_write_string_big ( unsigned char X,unsigned char Y, char *string, char mode ) +{ + while ( *string ){ + LCD_write_char_big( X, Y, *string , mode ); + if(*string++ == '.') + X += 5; + else + X += 12; + } +} + +/* write char in big font */ +void LCD4884::LCD_write_char_big (unsigned char X,unsigned char Y, unsigned char ch, char mode) +{ + unsigned char i, j; + unsigned char *pFont; + unsigned char ch_dat; + + pFont = (unsigned char *) big_number; + + switch (ch) { + case '.': + ch = 10; + break; + case '+': + ch = 11; + break; + case '-': + ch = 12; + break; + case ' ': + for(i=0;i<3;i++) { + LCD_set_XY ( X, Y+i); + for(j=0; j<16; j++) { + LCD_write_byte( (mode == MENU_NORMAL)? 0 : 0xff, 1); + } + } + return; + break; + default: + ch = ch & 0x0f; + } + + for(i=0;i<3;i++) { + LCD_set_XY ( X, Y+i); + for(j=0; j<16; j++){ + ch_dat = pgm_read_byte(pFont+ch*48 + i*16 +j); + LCD_write_byte( (mode == MENU_NORMAL)? ch_dat : (ch_dat^0xff), 1); + } + } + + +} + +void LCD4884::LCD_write_char(unsigned char c, char mode) +{ + unsigned char line; + unsigned char *pFont; + byte ch; + + pFont = (unsigned char *)font6_8; + c -= 32; + + for (line=0; line<6; line++) { + ch = pgm_read_byte(pFont+c*6+line); + LCD_write_byte( (mode==MENU_NORMAL)? ch: (ch^ 0xff) , 1); + } + x = (x + 1) % NUM_COL; +} + + +void LCD4884::LCD_set_XY(unsigned char X, unsigned char Y) + { + LCD_write_byte(0x40 | Y, 0); // column + LCD_write_byte(0x80 | X, 0); // row + x = X; + } + + +void LCD4884::LCD_clear(void) + { + unsigned int i; + + LCD_write_byte(0x0c, 0); + LCD_write_byte(0x80, 0); + + for (i=0; i<504; i++) + LCD_write_byte(0, 1); + + x = 0; + } + +void LCD4884::LCD_write_title(char* title) +{ + LCD_set_XY(0, 0); + for (char n = 0; n < NUM_COL; n++) + LCD_write_char(' ', MENU_HIGHLIGHT); + LCD_write_string((NUM_COL - strlen(title)) * 3, 0, title, MENU_HIGHLIGHT); + LCD_set_XY(0, 1); +} + +void LCD4884::LCD_putchar(char c) +{ + if (prev_char == 27) { + switch (c) { + case '0': + LCD_clear(); + break; + case '1': + LCD_set_XY(0, 0); + break; + case '2': + char_mode = MENU_NORMAL; + break; + case '3': + char_mode = MENU_HIGHLIGHT; + break; + case '4': + backlight(ON); + break; + case '5': + backlight(OFF); + break; + } + } else { + switch (c) { + case '\r': + for (char n = x; n < NUM_COL; n++) { + LCD_write_char(' ', char_mode); + } + break; + case '\n': + break; + default: + LCD_write_char(c, char_mode); + } + } + prev_char = c; +}
\ No newline at end of file |