Ben Gordon / Mbed OS ELEC351_GroupA-branch1
Committer:
Jonathan738
Date:
Sun Nov 04 20:32:59 2018 +0000
Revision:
6:f3d1ab8a9e99
Parent:
0:f8fe58d43763
Child:
7:0213c3702c99
Added Function for basic TERMINAL control and updated datatypes for LCD functions to universal names set by DataTypes.hpp

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