Troubleshooting

Committer:
BenRJG
Date:
Sun Nov 04 20:56:08 2018 +0000
Revision:
4:bb7a78619678
Parent:
1:1f9ea120f8a9
Child:
7:0213c3702c99
Reversed order of BusOut assignments (fixed)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BenRJG 0:f8fe58d43763 1 #include "LCD.hpp"
BenRJG 0:f8fe58d43763 2
BenRJG 0:f8fe58d43763 3 void LCD::INIT()
BenRJG 0:f8fe58d43763 4 {
BenRJG 0:f8fe58d43763 5 //All lines default low
BenRJG 0:f8fe58d43763 6 _LCD_RS = 0;
BenRJG 0:f8fe58d43763 7 _LCD_E = 0;
BenRJG 0:f8fe58d43763 8
BenRJG 0:f8fe58d43763 9 //LCD Initialise
BenRJG 0:f8fe58d43763 10 wait_ms(45); //Wait for LCD startup
BenRJG 4:bb7a78619678 11 wait_us(3000); //Wait whilst LCD busy
BenRJG 4:bb7a78619678 12 _LCD_RS = control;
BenRJG 4:bb7a78619678 13 LCD_DDRAM = 0; //Clear data line
BenRJG 4:bb7a78619678 14 LCD_DDRAM = DDRAM>>4; //Put data on line
BenRJG 4:bb7a78619678 15 LCD_strobe();
BenRJG 4:bb7a78619678 16
BenRJG 4:bb7a78619678 17
BenRJG 4:bb7a78619678 18 /*Step 1*/ //cmdLCD(DDRAM|0x08);
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 0:f8fe58d43763 33 void LCD::display(char* str, int line, int position)
BenRJG 0:f8fe58d43763 34 {
BenRJG 0:f8fe58d43763 35 unsigned int length = strlen(str);
BenRJG 0:f8fe58d43763 36 unsigned int line1 = length;
BenRJG 0:f8fe58d43763 37 unsigned int 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 0:f8fe58d43763 43 unsigned int 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 0:f8fe58d43763 83 void LCD::putt(char 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
BenRJG 0:f8fe58d43763 90 void LCD::cmdLCD(unsigned char 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
BenRJG 0:f8fe58d43763 105 void LCD::set_LCD_data(unsigned char 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 0:f8fe58d43763 119 unsigned int LCD::findSpace(char* str)
BenRJG 0:f8fe58d43763 120 {
BenRJG 0:f8fe58d43763 121 unsigned int space = 0;
BenRJG 0:f8fe58d43763 122 int 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 }