Jag sitter och försöker få en grafisk display att fungera med min avr, men jag lyckas inte så bra.
Jag använder mig av denna display, en ATmega8 och följande kod:
Kod: Markera allt
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
void writeLCD(char RS, char RW, unsigned char DATA) {
if(RS == 1)
PORTC |= 0x02; // Set pin 1 (RS) on port C high.
else
PORTC &= 0xFD; // Set pin 1 (RS) on port C to low.
if(RW == 1)
PORTC |= 0x04; // Set pin 2 (RW) on port C to high.
else
PORTC &= 0xFB; // Set pin 2 (RW) on port C to low.
PORTD = DATA; // Write DATA to port D.
// Create one pulse on pin 3 (E).
PORTC &= 0xF7; // Set pin 3 (E) on port C to low.
_delay_loop_1(100); // Delay for 750µs. EDIT: Delay * 100
PORTC |= 0x08; // Set pin 3 (E) on port C to high.
_delay_loop_1(100); // Delay for 750µs. EDIT: Delay * 100
PORTC &= 0xF7; // Set pin 3 (E) on port C to low.
}
void toggleLCDBacklight() {
PORTC ^= 0x01; // Toggle LSB on port C. LCD Backlight on/off.
}
void setLCDAddress(unsigned char X, unsigned char Y, char CS1, char CS2) {
// Select which driver(s) to use.
if (CS1 == 1)
PORTC |= 0x10; // Set pin 4 (CS1) on port C to high. Use CS1.
else
PORTC &= 0xEF; // Set pin 4 (CS1) on port C to low. Don't use CS1.
if (CS2 == 1)
PORTC |= 0x20; // Set pin 5 (CS2) on port C to high. Use CS2.
else
PORTC &= 0xDF; // Set pin 5 (CS2) on port C to low. Don't use CS2.
// Convert raw addresses to X and Y address commands.
X |= 0xB8; // Set pin 3, 4, 5, 7 high.
X &= 0x40; // Set pin 6 low.
Y |= 0x40; // Set pin 6 high.
Y &= 0x80; // Set pin 7 low.
writeLCD(0, 0, X); // Send X address command to LCD.
writeLCD(0, 0, Y); // Send Y address command to LCD.
}
int main(void) {
// Configure ports
DDRC = 0x3F; // Set pin 0 - 5 as outputs on port C.
DDRD = 0xFF; // Set pin 0 - 7 as outputs on port D.
PORTC = 0x01; // Set LSB (backlight) high and clear all other outputs on port C.
PORTD = 0x00; // Clear all outputs on port D.
// Init LCD
writeLCD(0, 0, 0x3F);
setLCDAddress(1, 1, 1, 0);
writeLCD(1, 0, 0xFF);
writeLCD(1, 0, 0xFF);
writeLCD(1, 0, 0xF0);
writeLCD(1, 0, 0xF0);
setLCDAddress(8, 8, 0, 1);
writeLCD(1, 0, 0xFF);
writeLCD(1, 0, 0xFF);
writeLCD(1, 0, 0xF0);
writeLCD(1, 0, 0xF0);
}
Jag känner mig ganska säker på att det inte är någonting som är felkopplat eftersom jag använt mig av detta schema med enda förendringen att jag kopplat in pinnarna till en avr istället för till paralellporten.
Någon som har en ide om vad som kan vara fel? Eller kanske sitter du på ett litet testprogram till denna display?