12864 GLCD

Dependencies:   mbed GLCD

Committer:
Bilgin
Date:
Wed May 29 18:36:43 2019 +0000
Revision:
0:c46d8f8adbd7
Microp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bilgin 0:c46d8f8adbd7 1 #include "myLCD.h"
Bilgin 0:c46d8f8adbd7 2 /**
Bilgin 0:c46d8f8adbd7 3 myLCD::myLCD(PinName _DI, PinName _RW, PinName _EN, PinName _CS1, PinName _CS2, BusInOut *BUSLCD){
Bilgin 0:c46d8f8adbd7 4 DI = new DigitalOut(_DI);
Bilgin 0:c46d8f8adbd7 5 RW = new DigitalOut(_RW);
Bilgin 0:c46d8f8adbd7 6 EN = new DigitalOut(_EN);
Bilgin 0:c46d8f8adbd7 7 CS1 = new DigitalOut(_CS1);
Bilgin 0:c46d8f8adbd7 8 CS2 = new DigitalOut(_CS2);
Bilgin 0:c46d8f8adbd7 9 LCD_PORT = BUS_LCD;
Bilgin 0:c46d8f8adbd7 10 }*/
Bilgin 0:c46d8f8adbd7 11 myLCD::myLCD(PinName _DI, PinName _RW, PinName _EN, PinName _CS1, PinName _CS2, BusInOut *BUSLCD):DI(_DI),RW(_RW),EN(_EN),CS1(_CS1),CS2(_CS2){
Bilgin 0:c46d8f8adbd7 12 LCD_PORT = BUSLCD;
Bilgin 0:c46d8f8adbd7 13 }
Bilgin 0:c46d8f8adbd7 14
Bilgin 0:c46d8f8adbd7 15 void myLCD::pulse_en(){
Bilgin 0:c46d8f8adbd7 16 EN = 1;
Bilgin 0:c46d8f8adbd7 17 wait_us(8);
Bilgin 0:c46d8f8adbd7 18 EN = 0;
Bilgin 0:c46d8f8adbd7 19 wait_us(8);
Bilgin 0:c46d8f8adbd7 20 }
Bilgin 0:c46d8f8adbd7 21
Bilgin 0:c46d8f8adbd7 22 void myLCD::lcd_on(){
Bilgin 0:c46d8f8adbd7 23 DI = 0;
Bilgin 0:c46d8f8adbd7 24 RW = 0;
Bilgin 0:c46d8f8adbd7 25 EN = 0;
Bilgin 0:c46d8f8adbd7 26 CS1 = 0;
Bilgin 0:c46d8f8adbd7 27 CS2 = 0;
Bilgin 0:c46d8f8adbd7 28 LCD_PORT->output();
Bilgin 0:c46d8f8adbd7 29 wait_us(2);
Bilgin 0:c46d8f8adbd7 30 LCD_PORT->write(0x3F);
Bilgin 0:c46d8f8adbd7 31 wait_us(2);
Bilgin 0:c46d8f8adbd7 32 pulse_en();
Bilgin 0:c46d8f8adbd7 33 }
Bilgin 0:c46d8f8adbd7 34
Bilgin 0:c46d8f8adbd7 35 void myLCD::write_byte(unsigned short byte){
Bilgin 0:c46d8f8adbd7 36 DI = 1; //high -> data
Bilgin 0:c46d8f8adbd7 37 RW = 0; //low -> write
Bilgin 0:c46d8f8adbd7 38 LCD_PORT->write(byte);
Bilgin 0:c46d8f8adbd7 39 wait_us(2);
Bilgin 0:c46d8f8adbd7 40 pulse_en();
Bilgin 0:c46d8f8adbd7 41 }
Bilgin 0:c46d8f8adbd7 42
Bilgin 0:c46d8f8adbd7 43 //returns the value into @param &byte
Bilgin 0:c46d8f8adbd7 44 short myLCD::read_byte(unsigned short col, unsigned short page){
Bilgin 0:c46d8f8adbd7 45 unsigned short temp;
Bilgin 0:c46d8f8adbd7 46 set_xy(col, page); // this function reads data from current location
Bilgin 0:c46d8f8adbd7 47 LCD_PORT->input(); //set as input
Bilgin 0:c46d8f8adbd7 48 DI = 1; //high -> data
Bilgin 0:c46d8f8adbd7 49 RW = 1; //high -> read
Bilgin 0:c46d8f8adbd7 50 CS1 = (col>63);
Bilgin 0:c46d8f8adbd7 51 CS2 = !CS1;
Bilgin 0:c46d8f8adbd7 52 wait_us(1);
Bilgin 0:c46d8f8adbd7 53 EN = 1; //latches data into output register
Bilgin 0:c46d8f8adbd7 54 wait_us(1);
Bilgin 0:c46d8f8adbd7 55
Bilgin 0:c46d8f8adbd7 56 EN = 0; //dummy read
Bilgin 0:c46d8f8adbd7 57 wait_us(5); //waits while lcd fetches data
Bilgin 0:c46d8f8adbd7 58 EN = 1; //latch data from output register into data register
Bilgin 0:c46d8f8adbd7 59 wait_us(1);
Bilgin 0:c46d8f8adbd7 60
Bilgin 0:c46d8f8adbd7 61 temp = LCD_PORT->read(); //data is saved onto byte from the caller
Bilgin 0:c46d8f8adbd7 62 EN = 0; //remove data from the bus
Bilgin 0:c46d8f8adbd7 63 wait_us(1);
Bilgin 0:c46d8f8adbd7 64 LCD_PORT->output(); //set bus as output again
Bilgin 0:c46d8f8adbd7 65 wait_us(2);
Bilgin 0:c46d8f8adbd7 66 return temp;
Bilgin 0:c46d8f8adbd7 67 }
Bilgin 0:c46d8f8adbd7 68
Bilgin 0:c46d8f8adbd7 69 //@param col should be 0<=col<128
Bilgin 0:c46d8f8adbd7 70 void myLCD::set_col(unsigned short col){
Bilgin 0:c46d8f8adbd7 71 unsigned short col_data;
Bilgin 0:c46d8f8adbd7 72 DI = 0; //low -> instruction
Bilgin 0:c46d8f8adbd7 73 RW = 0; //low -> write
Bilgin 0:c46d8f8adbd7 74
Bilgin 0:c46d8f8adbd7 75 //0-63
Bilgin 0:c46d8f8adbd7 76 if(col < 64){
Bilgin 0:c46d8f8adbd7 77 CS1 = 0; //select chip1
Bilgin 0:c46d8f8adbd7 78 CS2 = 1; //deselect chip2
Bilgin 0:c46d8f8adbd7 79 col_data = col;
Bilgin 0:c46d8f8adbd7 80 }
Bilgin 0:c46d8f8adbd7 81 else //64-127
Bilgin 0:c46d8f8adbd7 82 {
Bilgin 0:c46d8f8adbd7 83 CS1 = 1; //deselect chip1
Bilgin 0:c46d8f8adbd7 84 CS2 = 0; //select chip2
Bilgin 0:c46d8f8adbd7 85 col_data = col - 64;
Bilgin 0:c46d8f8adbd7 86 }
Bilgin 0:c46d8f8adbd7 87 //command formatting 01CCCCC -> C: column
Bilgin 0:c46d8f8adbd7 88 col_data = (col_data | 0x40) & 0x7F;
Bilgin 0:c46d8f8adbd7 89 LCD_PORT->write(col_data);
Bilgin 0:c46d8f8adbd7 90 wait_us(2);
Bilgin 0:c46d8f8adbd7 91 pulse_en();
Bilgin 0:c46d8f8adbd7 92 }
Bilgin 0:c46d8f8adbd7 93
Bilgin 0:c46d8f8adbd7 94 void myLCD::set_row(unsigned short row){
Bilgin 0:c46d8f8adbd7 95 unsigned short row_data;
Bilgin 0:c46d8f8adbd7 96 DI = 0; //low -> instruction
Bilgin 0:c46d8f8adbd7 97 RW = 0; //low -> write
Bilgin 0:c46d8f8adbd7 98 //command formatting 10111PPP -> P: page
Bilgin 0:c46d8f8adbd7 99 row_data = (row | 0xB8) & 0xBF; //or with 10111000, and with 10111111. last 3 bits is the page
Bilgin 0:c46d8f8adbd7 100 LCD_PORT->write(row_data);
Bilgin 0:c46d8f8adbd7 101 wait_us(2);
Bilgin 0:c46d8f8adbd7 102 pulse_en();
Bilgin 0:c46d8f8adbd7 103 }
Bilgin 0:c46d8f8adbd7 104
Bilgin 0:c46d8f8adbd7 105 void myLCD::set_xy(unsigned short col, unsigned short page){
Bilgin 0:c46d8f8adbd7 106 set_col(col);
Bilgin 0:c46d8f8adbd7 107 set_row(page);
Bilgin 0:c46d8f8adbd7 108 }
Bilgin 0:c46d8f8adbd7 109
Bilgin 0:c46d8f8adbd7 110 void myLCD::clear(){
Bilgin 0:c46d8f8adbd7 111 for(short n = 0; n < 8; n++){
Bilgin 0:c46d8f8adbd7 112 set_xy(0,n);
Bilgin 0:c46d8f8adbd7 113 set_xy(64,n); //at this point, cs2 is selected
Bilgin 0:c46d8f8adbd7 114 CS1 = 1; //select cs1 as well
Bilgin 0:c46d8f8adbd7 115 for(short i = 0; i < 64; i++)
Bilgin 0:c46d8f8adbd7 116 write_byte(0);
Bilgin 0:c46d8f8adbd7 117 }
Bilgin 0:c46d8f8adbd7 118 }
Bilgin 0:c46d8f8adbd7 119
Bilgin 0:c46d8f8adbd7 120 //@param color = true, draws white. clears otherwise
Bilgin 0:c46d8f8adbd7 121 void myLCD::draw_point(unsigned short x, unsigned short y, bool color){
Bilgin 0:c46d8f8adbd7 122 short data;
Bilgin 0:c46d8f8adbd7 123 short byte = read_byte(x, (y/8)); //byte has the point's 8bit data
Bilgin 0:c46d8f8adbd7 124
Bilgin 0:c46d8f8adbd7 125 if(color){ //paint the point
Bilgin 0:c46d8f8adbd7 126 data = ~(1 << (y % 8)) & byte;
Bilgin 0:c46d8f8adbd7 127 }
Bilgin 0:c46d8f8adbd7 128 else{ //clear the point
Bilgin 0:c46d8f8adbd7 129 data = (1 << (y % 8)) | byte;
Bilgin 0:c46d8f8adbd7 130 }
Bilgin 0:c46d8f8adbd7 131 set_xy(x, y/8);
Bilgin 0:c46d8f8adbd7 132 write_byte(data);
Bilgin 0:c46d8f8adbd7 133 }