Interfacciamento LCD 1602A con AVR
Salve a tutti, sto cercarndo ormai da almeno 12 ore circa di far funzionare uno di questi display (che usano un chip standard hitachi), ho letto parecchio a riguardo (comprese le librerie arduino), ma anche se ho capito all'incirca meno quasi il sistema logico, non riesco a farlo fungere. forse sto trascurando qualcosa che non ho messo in considerazione.
il display lo uso con questa configurazione:
- Alimentazione
- RS -> output micro (PB0)
- E -> output micro (PB1)
- D4, D5, D6, D6 -> ai 4 output (PB2 ... PB5)
RW -> GND (non mi interessa leggere i dati già scritti nel display, quindi lo imposto con scrittura permanente)
in sostanza, voglio usare un solo gruppo di porte ( Gruppo B )
ho scritto uno spezzone di codice, potete darmi un parere? (è possibile che in qualche shift ci sia qualche errore) spero di non aver fatto errori madornali...
il display lo uso con questa configurazione:
- Alimentazione
- RS -> output micro (PB0)
- E -> output micro (PB1)
- D4, D5, D6, D6 -> ai 4 output (PB2 ... PB5)
RW -> GND (non mi interessa leggere i dati già scritti nel display, quindi lo imposto con scrittura permanente)
in sostanza, voglio usare un solo gruppo di porte ( Gruppo B )
ho scritto uno spezzone di codice, potete darmi un parere? (è possibile che in qualche shift ci sia qualche errore) spero di non aver fatto errori madornali...
- Codice: Seleziona tutto
/*
* ArduinoUnoLCD.c
*
* Created: 30/11/2014 02:34:18
* Author: Daniele
*/
#define F_CPU 16000000L
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define DDRLCD DDRB
#define PORTLCD PORTB
#define RS_pin 0
#define EN_pin 1
#define bit4 2
#define bit5 3
#define bit6 4
#define bit7 5
#define rs_DATA() PORTLCD |= (1<<RS_pin);
#define rs_CMD() PORTLCD &= ~(1<<RS_pin);
#define e_SCK() PORTLCD |= (1<<EN_pin); \
_delay_us(1); \
PORTLCD &= ~(1<<EN_pin);\
_delay_us(1);
#define buffer(a) PORTLCD = a;
void initLCD(){
DDRLCD |= _BV(RS_pin) | _BV(EN_pin) | _BV(bit4) | _BV(bit5) | _BV(bit6) | _BV(bit7);
PORTLCD = 0x00;
}
void writeChar(uint8_t ln, uint8_t pos, uint8_t c){
cli();
uint8_t offset = ln == 1? 0x80 : 0xC0;
uint8_t oldlcd = PORTLCD;
rs_CMD();
buffer(PORTLCD | ((offset + pos)<<4)>>4);
e_SCK()
buffer(PORTLCD | (offset + pos)>>4);
e_SCK();
rs_DATA();
buffer(PORTLCD | c);
e_SCK()
buffer(4<< (PORTLCD | c));
e_SCK();
PORTLCD = oldlcd;
sei();
}
int main(void)
{
initLCD();
writeChar(1,3,'A');
while(1)
{
}
}