Ben Gordon / Mbed OS ELEC351_GroupA-branch1
Committer:
BenRJG
Date:
Sun Nov 04 21:42:38 2018 +0000
Revision:
8:e34e23edfc84
Parent:
7:0213c3702c99
Child:
9:f8c8f0b11893
Optimised LCD memory

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BenRJG 0:f8fe58d43763 1 #include "LCD.hpp"
Jonathan738 6:f3d1ab8a9e99 2 #include "DataTypes.hpp"
BenRJG 0:f8fe58d43763 3
BenRJG 0:f8fe58d43763 4 void LCD::INIT()
BenRJG 0:f8fe58d43763 5 {
BenRJG 0:f8fe58d43763 6 //All lines default low
BenRJG 0:f8fe58d43763 7 _LCD_RS = 0;
BenRJG 0:f8fe58d43763 8 _LCD_E = 0;
BenRJG 0:f8fe58d43763 9
BenRJG 0:f8fe58d43763 10 //LCD Initialise
BenRJG 0:f8fe58d43763 11 wait_ms(45); //Wait for LCD startup
BenRJG 8:e34e23edfc84 12 /*Step 1*/
BenRJG 8:e34e23edfc84 13 wait_us(3000); //Wait whilst LCD busy
BenRJG 8:e34e23edfc84 14 _LCD_RS = control;
BenRJG 8:e34e23edfc84 15 LCD_DDRAM = 0; //Clear data line
BenRJG 8:e34e23edfc84 16 LCD_DDRAM = DDRAM>>4; //Put data on line
BenRJG 8:e34e23edfc84 17 LCD_strobe();
BenRJG 4:bb7a78619678 18
BenRJG 0:f8fe58d43763 19 /*Step 2*/ cmdLCD(DDRAM|lines2); //Function Set 0x20|0x08 = 0x28
BenRJG 0:f8fe58d43763 20 /*Step 3*/ cmdLCD(DDRAM|lines2); //Function Set 0x20|0x08 = 0x28
BenRJG 0:f8fe58d43763 21 /*Step 4*/ cmdLCD(DISPLAY|on); //Display Control 0x08|0x0x04 = 0x0c
BenRJG 0:f8fe58d43763 22 /*Step 5*/ cmdLCD(CLEAR); //Clear Display 0x01
BenRJG 0:f8fe58d43763 23 /*Step 6*/ cmdLCD(ENTRYMODE|I); //Set entry mode 0x04|0x02 = 0x06
BenRJG 0:f8fe58d43763 24
BenRJG 1:1f9ea120f8a9 25 cmdLCD(0x20); //return home location
BenRJG 0:f8fe58d43763 26 }
BenRJG 0:f8fe58d43763 27
BenRJG 0:f8fe58d43763 28 void LCD::clear()
BenRJG 0:f8fe58d43763 29 {
BenRJG 0:f8fe58d43763 30 cmdLCD(CLEAR);
BenRJG 0:f8fe58d43763 31 }
BenRJG 0:f8fe58d43763 32
BenRJG 8:e34e23edfc84 33 void LCD::display(U_BYTE* str, U_BYTE line, UINT_16 position)
BenRJG 0:f8fe58d43763 34 {
Jonathan738 6:f3d1ab8a9e99 35 UINT_32 length = strlen(str);
BenRJG 8:e34e23edfc84 36 UINT_16 line1 = length; //0 - 16, 00000 - 10000
Jonathan738 6:f3d1ab8a9e99 37 UINT_32 line2 = 0;
BenRJG 0:f8fe58d43763 38
BenRJG 0:f8fe58d43763 39 //if((line != NULL)&&(position != NULL))
BenRJG 0:f8fe58d43763 40 //{
BenRJG 0:f8fe58d43763 41 cmdLCD(line|position);
BenRJG 0:f8fe58d43763 42 //}
BenRJG 8:e34e23edfc84 43 U_BYTE p;
BenRJG 0:f8fe58d43763 44 if(line == LINE1)
BenRJG 0:f8fe58d43763 45 {
BenRJG 0:f8fe58d43763 46 if(position + length > 16)
BenRJG 0:f8fe58d43763 47 {
BenRJG 0:f8fe58d43763 48 line1 = findSpace(str);
BenRJG 0:f8fe58d43763 49 line2 = length - line1;
BenRJG 0:f8fe58d43763 50 }
BenRJG 0:f8fe58d43763 51
BenRJG 0:f8fe58d43763 52 for(p=0; p<line1; p++)
BenRJG 0:f8fe58d43763 53 {
BenRJG 0:f8fe58d43763 54 putt(str[p]);
BenRJG 0:f8fe58d43763 55 }
BenRJG 0:f8fe58d43763 56
BenRJG 0:f8fe58d43763 57 cmdLCD(LINE2);
BenRJG 0:f8fe58d43763 58 }
BenRJG 0:f8fe58d43763 59
BenRJG 0:f8fe58d43763 60 if(line == LINE2){line2 = length;}
BenRJG 0:f8fe58d43763 61
BenRJG 0:f8fe58d43763 62 if((line2 <= 16)&&(line != 2))
BenRJG 0:f8fe58d43763 63 {
BenRJG 0:f8fe58d43763 64 for(p=0; p<line2; p++)
BenRJG 0:f8fe58d43763 65 {
BenRJG 0:f8fe58d43763 66 putt(str[line1 + p]);
BenRJG 0:f8fe58d43763 67 }
BenRJG 0:f8fe58d43763 68 }
BenRJG 0:f8fe58d43763 69 else
BenRJG 0:f8fe58d43763 70 {
BenRJG 0:f8fe58d43763 71 for(p=0; p<(13); p++)
BenRJG 0:f8fe58d43763 72 {
BenRJG 0:f8fe58d43763 73 putt(str[line1 + p]);
BenRJG 0:f8fe58d43763 74 }
BenRJG 0:f8fe58d43763 75
BenRJG 0:f8fe58d43763 76 for(p=0; p<3; p++)
BenRJG 0:f8fe58d43763 77 {
BenRJG 0:f8fe58d43763 78 putt('.');
BenRJG 0:f8fe58d43763 79 }
BenRJG 0:f8fe58d43763 80 }
BenRJG 0:f8fe58d43763 81 }
BenRJG 0:f8fe58d43763 82
BenRJG 8:e34e23edfc84 83 void LCD::putt(U_BYTE c)
BenRJG 0:f8fe58d43763 84 {
BenRJG 4:bb7a78619678 85 wait_us(3000);
BenRJG 0:f8fe58d43763 86 _LCD_RS = text;
BenRJG 0:f8fe58d43763 87 set_LCD_data(c);
BenRJG 0:f8fe58d43763 88 }
BenRJG 0:f8fe58d43763 89
Jonathan738 6:f3d1ab8a9e99 90 void LCD::cmdLCD(U_BYTE cmd)
BenRJG 0:f8fe58d43763 91 {
BenRJG 4:bb7a78619678 92 wait_us(3000); //Wait whilst LCD busy
BenRJG 0:f8fe58d43763 93 _LCD_RS = control;
BenRJG 0:f8fe58d43763 94 set_LCD_data(cmd); //set data on bus
BenRJG 0:f8fe58d43763 95 }
BenRJG 0:f8fe58d43763 96
BenRJG 0:f8fe58d43763 97 void LCD::LCD_strobe(void)
BenRJG 0:f8fe58d43763 98 {
BenRJG 0:f8fe58d43763 99 wait_us(10);
BenRJG 0:f8fe58d43763 100 _LCD_E = 1;
BenRJG 0:f8fe58d43763 101 wait_us(10);
BenRJG 0:f8fe58d43763 102 _LCD_E = 0;
BenRJG 0:f8fe58d43763 103 }
BenRJG 0:f8fe58d43763 104
Jonathan738 6:f3d1ab8a9e99 105 void LCD::set_LCD_data(U_BYTE d)
BenRJG 0:f8fe58d43763 106 {
BenRJG 0:f8fe58d43763 107 // Send upper 4 bits then lower for bits
BenRJG 0:f8fe58d43763 108 // e.g. 11110000 => 1111 -> 0000
BenRJG 0:f8fe58d43763 109
BenRJG 0:f8fe58d43763 110 LCD_DDRAM = 0; //Clear data line
BenRJG 0:f8fe58d43763 111 LCD_DDRAM = d>>4; //Put data on line
BenRJG 0:f8fe58d43763 112 LCD_strobe();
BenRJG 4:bb7a78619678 113 wait_us(1000);
BenRJG 0:f8fe58d43763 114 LCD_DDRAM = 0; //Clear
BenRJG 0:f8fe58d43763 115 LCD_DDRAM = d; //Put remaining data on line
BenRJG 0:f8fe58d43763 116 LCD_strobe();
BenRJG 0:f8fe58d43763 117 }
BenRJG 0:f8fe58d43763 118
BenRJG 8:e34e23edfc84 119 UINT_32 LCD::findSpace(U_BYTE* str)
BenRJG 0:f8fe58d43763 120 {
Jonathan738 6:f3d1ab8a9e99 121 UINT_32 space = 0;
Jonathan738 6:f3d1ab8a9e99 122 INT_32 n = 16;
BenRJG 0:f8fe58d43763 123 while(!space & (n != -1))
BenRJG 0:f8fe58d43763 124 {
BenRJG 0:f8fe58d43763 125 n--;
BenRJG 0:f8fe58d43763 126 switch(str[n])
BenRJG 0:f8fe58d43763 127 {
BenRJG 0:f8fe58d43763 128 case ' ':
BenRJG 0:f8fe58d43763 129 case '.':
BenRJG 0:f8fe58d43763 130 case ',':
BenRJG 0:f8fe58d43763 131 case ':':
BenRJG 0:f8fe58d43763 132 case ';':
BenRJG 0:f8fe58d43763 133 case '-':
BenRJG 0:f8fe58d43763 134 case '/':
BenRJG 0:f8fe58d43763 135 space = 1;
BenRJG 0:f8fe58d43763 136 break;
BenRJG 0:f8fe58d43763 137 }
BenRJG 0:f8fe58d43763 138 }
BenRJG 0:f8fe58d43763 139 if(n == -1){ return 16; }
BenRJG 0:f8fe58d43763 140 else{ return n+1; }
BenRJG 0:f8fe58d43763 141 }