Ben Gordon / Mbed OS ELEC351_GroupA-branch1
Committer:
BenRJG
Date:
Sun Nov 04 21:09:02 2018 +0000
Revision:
7:0213c3702c99
Parent:
6:f3d1ab8a9e99
Parent:
4:bb7a78619678
Child:
8:e34e23edfc84
Merged branches

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