Re: Kan inte få LCD display att fungera
Postat: 26 augusti 2010, 00:12:55
> När jag ser det som tydligast har jag cirka 0.5 V på VO.
Ganska normalt. Är detta utan backlight tänd ?
Ganska normalt. Är detta utan backlight tänd ?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Ja utan backlight som inte var inkopplad då jag uppfattade den som optional belysning som inte är nödvändig. Då jag kopplade på backlight så syntes tecknen mer normalt. Så backlight verkar vara nödvändig för att få den att fungera. Jag tycker dock att displayen ser något blek ut jämfört med produktbilden i länken jag gav i början av trådensodjan skrev:> När jag ser det som tydligast har jag cirka 0.5 V på VO.
Ganska normalt. Är detta utan backlight tänd ?
Ja i nedanstående program får jag ljussvaga tecken. Om jag bara ändrar c[3] i LCDinit() från 0x38 till 0x30 så har jag ljusstarka tecken. Denna ändring innebär att LCDn konfigureras för en rad istället för två rader.sodjan skrev:Nej, det är inte normalt.
Är det den *enda* skillnaden i konfiguration ?
Kod: Markera allt
#include <htc.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
#include "usart.h"
#define _XTAL_FREQ 4000000L
#define TRUE 1
#define FALSE 0
#define RS RC2 //H/L Register select signal
#define RW RB6 //H/L Read Write signal LCD
#define E RB4 //H/L Enable signal LCD
#define MR RC7 //Master reset 74HC595 (active low)
#define SH_CP RC6 //Shift register clock input 74HC595
#define ST_CP RC3 //Storage register clock input
#define OE RC4 //Output enable (active low) 74HC595
#define DS RC5 //Serial data input 74HC595
__CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & UNPROTECT);
void init(void)
{
// port directions: 1=input, 0=output
TRISA = 0b11111111;
TRISB = 0b10000000;
TRISC = 0b00000001;
PORTB = 0b11110000;
PORTC = 0b11111111;
OPTION = 0b10000000;
ANSEL= 0b00111111;
ANSELH= 0b11110000;
ADCON0 =0b10000001; //result right adj ADC on (CH=0)
ADCON1 = 0b00010000; //fosc/8 X101XXXX
init_comms();
}
void Reset74HC595()
{
OE = 0;
MR = 0; //Reset 74HC595
__delay_us(10);
MR = 1;
}
void Load_shiftreg(char data) //Mata ut data till DB0-DB7 på LCD mha 74HC595
{
int i;
for (i=0;i<8;i++)
{
if (data & 0b10000000)
DS = 1;
else
DS = 0;
data<<=1;
SH_CP = 0;
__delay_us(10);
SH_CP = 1;
ST_CP = 0;
__delay_us(10);
ST_CP = 1;
}
ST_CP = 0;
__delay_us(10);
ST_CP = 1;
}
void LCDinit()
{
char c[7] = {0x30, 0x30, 0x30, 0x38, 0x0C, 0x01, 0x06}; //Bytes from http://www.elektronikforumet.com/wiki/index.php?title=HD44780
int key;
int i;
E = 0;
RS=0;
RW=0;
__delay_ms(150);
for (i=0;i<7;i++) //När loopen kommer till 3 (dvs 0x38) blir tecknen svagare
{
Load_shiftreg(c[i]);
__delay_ms(150);
E=1;
__delay_us(2);
E=0;
__delay_ms(5);
}
}
void LCD_print()
{
RS=1;
E = 0;
RW = 0;
__delay_ms(15);
E = 1;
__delay_us(2);
E = 0;
__delay_us(43);
}
void LCD_printtext(char *str,int no_char)
{
int i;
for (i=0;i<no_char;i++)
{
Load_shiftreg(*str++);
LCD_print();
}
}
void LCD_function()
{
char c=0b00111000;
Load_shiftreg(c);
E = 0;
RS=0;
RW=0;
__delay_ms(15);
E=1;
__delay_us(2);
E=0;
__delay_us(10);
}
void LCD_returnhome()
{
RS= 0;
Load_shiftreg(0b00000010);
E=1;
__delay_us(2);
E=0;
__delay_ms(2);
}
void LCD_setpos(char address)
{
RS=0;
Load_shiftreg(address);
E=1;
__delay_us(2);
E=0;
__delay_ms(2);
}
void main(void)
{
int key;
init(); //Initiera PIC
Reset74HC595(); //Reset 74HC595 IC som matar LCD med databytes
__delay_ms(190); //Fördröjning efter poweron
LCDinit(); //Initiera LCD
LCD_printtext("Hej Hej Varlden.",16);
LCD_setpos(0b11000000); //Sätt position till första kolumn andra rad
LCD_printtext("Hello The World?",15);
do {} while ( (key=getche())!='\r'); //Vänta tills retur trycks på PC tangentbord
}