Koden nedan startar inte upp displayen korrekt alls (har för tillfället inte ens försökt ändra till 2-radersläge), och är baserad EF's wiki för HD44780.
Jag har tidigare försökt initera enligt det länkade databladet, enligt Hitachis HD44780-datablad, enligt Samsungs KS0066U och enligt instruktionerna på
Powertips hemsida. Inget fungerar, den koden var implementerad med SourceBoost-kompilatorn.
Programmeraren är en MPLAB ICD2 USB, Utvecklingsmiljön är MPLAB 8.00, kompilatorn MPLAB C18 3.15a (studentutgåva), kretsen en PIC18F2515 med displayens dataledare D4-D7 ansluten till PortA[0-3] (stigande), enable på PortC[1], register select på PortA[5], read/write på PortC[0].
Hårdvarukopplingen har bevisligen fungerat tidigare, det är i felet mjukvaran ligger såvida ren glappkontakt inte uppstått.
Pic:en har en 10 Mhz kristall och kör med HS-PLL:enablat och fördröjningarna är baserat på 40 Mhz / 10 MIPS, verifierat genom att dra en pinne upp ner med 50 ms fördröjning och kontrollmätt på oscillioskop.
Ingen av de båda initieringsrutinerna verkar fungera. Displayen visar endast den övre radens teckenrutor som massiva block. Ingen text skrivs ut.
Någon med erfarenhet av displayeländet ifråga som har några visdomsord?
Med vänliga hälsningar,
Martin "xarragon" Persson
Kod: Markera allt
#include <p18f2515.h>
#include <delays.h>
// Pin mappings / register mappings
#define DISPLAY_D4 LATAbits.LATA0
#define DISPLAY_D5 LATAbits.LATA1
#define DISPLAY_D6 LATAbits.LATA2
#define DISPLAY_D7 LATAbits.LATA3
#define DISPLAY_E LATCbits.LATC1
#define DISPLAY_RS LATAbits.LATA5
#define DISPLAY_RW LATCbits.LATC0
void init_elektronikforumet (void);
void init_sitronix (void);
void send_command (unsigned char command);
void delay_us (unsigned char microseconds);
void delay_ms (unsigned char milliseconds);
void display_write_character (unsigned char character);
void main (void)
{
DDRA = 0x00;
DDRC = 0x00;
LATA = 0x00;
LATC = 0x00;
//init_elektronikforumet();
init_sitronix();
display_write_character('c');
while (1);
}
void init_elektronikforumet (void)
{
delay_ms(250);
DISPLAY_E = 0;
DISPLAY_RS = 0;
DISPLAY_RW = 0;
send_command(0x03);
delay_ms(6);
send_command(0x03);
delay_us(120);
send_command(0x03);
send_command(0x02);
delay_us(50);
send_command(0x02);
send_command(0x08);
delay_us(50);
send_command(0x00);
send_command(0x80);
send_command(0x00);
send_command(0x01);
delay_us(50);
send_command(0x00);
send_command(0x06);
delay_us(50);
}
void init_sitronix (void)
{
delay_ms(250);
DISPLAY_E = 0;
DISPLAY_RS = 0;
DISPLAY_RW = 0;
send_command(0x03);
delay_us(50);
send_command(0x02);
send_command(0x02);
delay_us(50);
send_command(0x02);
send_command(0x02);
delay_us(50);
send_command(0x00);
send_command(0x0c);
delay_us(50);
send_command(0x00);
send_command(0x01);
delay_us(50);
send_command(0x00);
send_command(0x06);
delay_us(50);
}
void send_command (unsigned char command)
{
unsigned char temp;
temp = LATA & 0xf0;
temp |= command & 0x0f;
LATA = temp;
delay_us(2);
DISPLAY_E = 1;
delay_us(6);
DISPLAY_E = 0;
delay_us(6);
}
void delay_us (unsigned char microseconds)
{
Delay10TCYx(microseconds);
}
void delay_ms (unsigned char milliseconds)
{
Delay10KTCYx(milliseconds);
}
void display_write_character (unsigned char character)
{
unsigned char temp;
DISPLAY_RS = 1;
DISPLAY_RW = 1;
delay_us(2);
temp = LATA;
temp &= (character >> 4) | 0xf0;
temp |= (character >> 4) & 0x0f;
LATA = temp;
DISPLAY_E = 1;
delay_us(6);
DISPLAY_E = 0;
delay_us(6);
temp = LATA;
temp &= character | 0xf0;
temp |= character & 0x0f;
LATA = temp;
DISPLAY_E = 1;
delay_us(6);
DISPLAY_E = 0;
delay_us(6);
delay_us(50);
}