jag tror du har missat att för varje gång du skickar ut ett värde på databussen (PORTB) så måste du skicka en klockpuls också (på pinne E) , för att displayen ska ta emot data.
Vilken utgång har du kopplat till klockan och vilken utgång är kopplad till displayens RS-ingång?
När du skickar data (dvs. text och tecken) ska RS vara 1 och när du skickar instruktioner ska RS vara 0 (t.ex vid initiering).
Jag tror att instruktionen
PORTB = 35; innehåller flera fel:
1) du skickar ut ett decimaltal mellan 32 och 39, men det är ju fyra bitar som ska skickas ut.
Det är enklare om du skriver hexadecimal kod, t.ex. 0x23, då ser du bitarna uppdelade fyra och fyra. Eller binärt. t.ex. 0b00010010
2) du skickar ut data utan att toggla klockan?
och eftersom det är fyra-bitars överföring kommer du alltid att skicka
2 gånger en halv byte, så du kan med fördel göra detta till en enda 8-bitars funktion ...
...
hur är det - är det bitarna 0 till 3 på PORTB som är databitar? Vad är då bitarna 4-7?
Som du gör nu så skickar du ut ett decimaltal mellan 32 och 39 till porten, har du verkligen koll på vilka bitar du skickar?
Så här skulle jag strukturera upp det ungefär
(OBS! ej färdig eller testad kod - bara ett ungefärligt förslag):
Kod: Markera allt
// förutsätter att RS_BIT och CLOCK_BIT är någon av bitarna 4-7 i PORTB
#define CLOCK_BIT (1<<4) // exempelvis
#define RS_BIT (1<<5) // exempelvis
#define DATA RS_BIT
#define INSTRUCTION 0
void display_init() {
delay_us(41); // inledande paus
send_instruction(0x30);
delay_us(1600);
send_instruction(0x30);
send_instruction(0x29);
send_instruction(0x14);
send_instruction(0x30);
// osv...
// (siffrorna har jag inte exakt tagit reda på.. de kanske ska vara annorlunda)
}
void send_instruction(unsigned char siffra) {
send_eight_bits(siffra, INSTRUCTION);
}
void send_data(unsigned char siffra) {
send_eight_bits(siffra, DATA);
}
void send_eight_bits(unsigned char siffra, char typ) {
// siffra = åttabitars tecken, typ = instruktion eller data
send_four_bits(siffra, typ);
send_fout_bits(siffra >> 4, typ);
}
void send_four_bits(unsigned char bitar, char typ) { // ta hänsyn endast till bit 0-3
PORTB = (siffra & 0x0F) | typ; // typ är RS biten: 1=data, 0 =instruktion
// här ettställer du sedan den bit som är klockan (E) CLOCK_BIT
// jag kan inte PIC så jag vet inte bästa sättet att göra det på
// sedan nollställer du den biten igen - nu har en hel klockpuls skickats ut
Delay_us (30); // minsta acceptabla paus mellan tecken.
}
En liten översikt:
Funktioner som anropas utifrån:
display_init()
- initierar displayen
send_instruction(unsigned char siffra)
- skickar enskild instruktion (8 bitars)
send_data(unsigned char siffra)
- skickar tecken till displayen
Interna funktioner:
send_eight_bits(unsigned char siffra, char typ)
- delar upp 8-bitar i två fyra-bitars data
send_four_bits(unsigned char bitar, char typ)
- skickar en fyra bitars kod med 30 µS delay