Ben Gordon
/
ELEC351_GroupA-branch1
Troubleshooting
Diff: LCD.cpp
- Revision:
- 0:f8fe58d43763
- Child:
- 1:1f9ea120f8a9
- Child:
- 6:f3d1ab8a9e99
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD.cpp Sat Nov 03 21:55:11 2018 +0000 @@ -0,0 +1,134 @@ +#include "LCD.hpp" + +void LCD::INIT() +{ + //All lines default low + _LCD_RS = 0; + _LCD_E = 0; + + //LCD Initialise + wait_ms(45); //Wait for LCD startup + /*Step 1*/ cmdLCD(DDRAM|0x08); + /*Step 2*/ cmdLCD(DDRAM|lines2); //Function Set 0x20|0x08 = 0x28 + /*Step 3*/ cmdLCD(DDRAM|lines2); //Function Set 0x20|0x08 = 0x28 + /*Step 4*/ cmdLCD(DISPLAY|on); //Display Control 0x08|0x0x04 = 0x0c + /*Step 5*/ cmdLCD(CLEAR); //Clear Display 0x01 + /*Step 6*/ cmdLCD(ENTRYMODE|I); //Set entry mode 0x04|0x02 = 0x06 + + cmdLCD(0x20); +} + +void LCD::clear() +{ + cmdLCD(CLEAR); +} + +void LCD::display(char* str, int line, int position) +{ + unsigned int length = strlen(str); + unsigned int line1 = length; + unsigned int line2 = 0; + + //if((line != NULL)&&(position != NULL)) + //{ + cmdLCD(line|position); + //} + unsigned int p; + if(line == LINE1) + { + if(position + length > 16) + { + line1 = findSpace(str); + line2 = length - line1; + } + + for(p=0; p<line1; p++) + { + putt(str[p]); + } + + cmdLCD(LINE2); + } + + if(line == LINE2){line2 = length;} + + if((line2 <= 16)&&(line != 2)) + { + for(p=0; p<line2; p++) + { + putt(str[line1 + p]); + } + } + else + { + for(p=0; p<(13); p++) + { + putt(str[line1 + p]); + } + + for(p=0; p<3; p++) + { + putt('.'); + } + } +} + +void LCD::putt(char c) +{ + wait_us(50); + _LCD_RS = text; + set_LCD_data(c); +} + +void LCD::cmdLCD(unsigned char cmd) +{ + wait_us(50); //Wait whilst LCD busy + _LCD_RS = control; + set_LCD_data(cmd); //set data on bus +} + +void LCD::LCD_strobe(void) +{ + wait_us(10); + _LCD_E = 1; + wait_us(10); + _LCD_E = 0; +} + +void LCD::set_LCD_data(unsigned char d) +{ + // Send upper 4 bits then lower for bits + // e.g. 11110000 => 1111 -> 0000 + + LCD_DDRAM = 0; //Clear data line + LCD_DDRAM = d>>4; //Put data on line + LCD_strobe(); + //wait_us(1000); + LCD_DDRAM = 0; //Clear + LCD_DDRAM = d; //Put remaining data on line + LCD_strobe(); +} + +unsigned int LCD::findSpace(char* str) +{ + unsigned int space = 0; + int n = 16; + while(!space & (n != -1)) + { + n--; + switch(str[n]) + { + case ' ': + case '.': + case ',': + case ':': + case ';': + case '-': + case '/': + space = 1; + break; + } + } + if(n == -1){ return 16; } + else{ return n+1; } +} \ No newline at end of file