|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Mihec Član
Pridružen-a: Pet 24 Mar 2006 20:10 Prispevkov: 412 Aktiv.: 1.87 Kraj: Mengeš
|
Objavljeno: Ned Maj 03, 2009 12:19 pm Naslov sporočila: Zagon LCDja na Texas Instruments uC |
|
|
Pozdravljeni!
Vprašanje bom zastavil kar tule, če pa razdelek ni primeren ga prosim prestavite kam drugam.
Ukvarjam se z mikrokontrolerjem MSP430F2132 poizvajalca Texas Instruments. Za začetek bi rad vzpostavil delovanje običajnega LCDja 2x16. Spisal sem driver za začetno inicilizacijo ter brisanje LCDja, pa ni stvar nikakor ne deluje kot bi morala.
LCD je priklopljen na zunanjo napetost 4,5V, mikrokontroler se poganja s programatorja na napetosti 3,6V. Komunikacija je 4 - bitna. Po priklopu vseh sponk in napajanja se na LCDju pokažejo temni kvadratki, kot je običajno. Ob zagonu programske kode LCD narahlo utripa, proti koncu močneje in zopet obstane v začetnem stanju. Prilagam kodo napisano v Cju.
Koda: |
//******************************************************************************
// LCD
//
// Priključitev: LCD MSP430F2132
//
//
// Vdd p1 GND (p13)
// Vss p2 Vss (p1)
// RS p4 P3.4 (p10)
// R/W p5 GND (p14)
// E p6 P3.6 (p2)
// DB4 p11 P3.0 (p11)
// DB5 p12 P3.1 (p4)
// DB6 p13 P3.2 (p8)
// DB7 p14 P3.3 (p12)
//
//
//
//******************************************************************************
#include "msp430x21x2.h"
// Globalne funkcije
void init_lcm(void); // Inicilizacija LCDja
void clr_lcm(void); // Brisanje LCDja
void delay(int); // Zakasnitev
void strobe(void); // Omogočanje/onemogočanje 'Enable' signala
// Glavna funkcija
void main()
{
int o;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// LCD port
P3DIR |= 0xFF;
P3OUT &= 0x00;
for(o = 0; o < 0xEF; o++)delay(100); // Začetna zakasnitev
init_lcm(); // Inicilizacija LCDja
clr_lcm(); // Clear the disp[32] buffer
}
// Funkcije
void init_lcm(void)
{
// Vzpostavitev 4 bitne komunikacije
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x02; // 4 bitna komunikacija
strobe();
delay(150);
// Od sedaj naprej je omogočena 4 bitna komunikacija
// 8 bitov se razdeli na dva dela. Najprej se pošlje zgornje(MSB-HN),
// nato spodnje(LSB-LN) bite
// Ukaz za dvovrstično delovanje LCDja (0x28)
//HN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x02;
strobe();
//LN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x08;
strobe();
delay(150);
// Nastavitev kurzorja (0x0F)
//HN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x00;
strobe();
//LN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x0F;
strobe();
delay(150);
// Brisanje LCDja (0x01)
//HN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x00;
strobe();
//LN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x01;
strobe();
delay(3000); // 1,5ms
delay(3000);
// Inkrementno premikanje/omogoči premikanje po celotnem LCDju (0x07)
//HN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x00;
strobe();
//LN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x07;
strobe();
delay(150);
}
void strobe(void)
{ // Vklaplanje 'E' porta
P3OUT = P3OUT | 0x40; // Omogoči visoko
delay(200);
P3OUT = P3OUT & 0xBF; // Omogoči nizko
delay(200);
}
void clr_lcm(void)
{
// Zbriši LCD
//HN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x00;
strobe();
//LN
P3OUT = 0x00; // Pošlji ukaz
P3OUT |= 0x01;
strobe();
}
void delay(int d)
{ // Zakasnitev
int i;
for(i = 0; i <5*d; i++); |
Možno da je kakšna manjša ali večja napaka v celotni zadevi, saj sem še bolj začetnik na tem področju. Kakršnakoli pomoč bi mi prav prišla.
Hvala! |
|
Nazaj na vrh |
|
|
piroman Član
Pridružen-a: Čet 23 Okt 2003 12:06 Prispevkov: 2707 Aktiv.: 12.15 Kraj: Ljubljana
|
Objavljeno: Ned Maj 03, 2009 12:58 pm Naslov sporočila: |
|
|
Takole na hitro, imaš dovolj dolge zakasnitve ob inicializaciji? Če ti MSP teče na DCO je to približno 800kHz, LCDji so na začetku precej picajzlasti glede teh delayev...
Tule je en košček neke moje stare kode za inicializacijo takega displaya. Ja, vem, štorasto je napisano, je ena izmed mojih prvih stvaritev v Cju...
Koda: |
void LCD_Port_Init(void)
{
Port1_Dir |= (LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4 ); //Definira podatkovne izhode
Port2_Dir |= (LCD_RS + LCD_E ); //Definira kontrolne izhode
}
//miganje z ENABLE nogico
void LCDE(void) //pomigam z E
{
Port2_Out |= LCD_E;
delay(100);
Port2_Out &= ~LCD_E;
delay(100);
}
void LCDinit(void)
{
LCD_Port_Init();
Port2_Out &= ~LCD_RS; // LCD_RS PIN=Lo (CMD)
Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4); // Spraznim Output
delay(1000);
Port1_Out = 0x03;
LCDE(); //1
delay(1000);
Port1_Out = 0x03;
LCDE(); //2
delay(100);
LCDE(); //3
P1OUT = 0x02;
LCDE(); //4
putCMD(0x10);
putCMD(0x08);
putCMD(0x01);
putCMD(0x06);
putCMD(0x0C); //cursor off, display on, 0E - cursor on + blink, 0F - cursor on
putCMD(CLS); //pobriše display in gre domov // Entry mode 01IS ; I =(0 cursor decrement, 1 cursor increment); S=(0 shift off, 1 shift on)
}
//pošljem Char na LCD
void putCHAR(char temp)
{
Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);
Port2_Out |= LCD_RS;
send_data(temp);
Port2_Out &= ~LCD_RS;
}
void send_data(unsigned char data)
{
unsigned char tmp; //Zacasna spremenljivka
tmp=(data>>4); //Hi Nibble
for (char i=0; i<2;i++)
{
Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4); //Spraznim Output
if ( BIT3 & tmp ) {Port1_Out |= LCD_Data7;} //Priklop
if ( BIT2 & tmp ) {Port1_Out |= LCD_Data6;}
if ( BIT1 & tmp ) {Port1_Out |= LCD_Data5;}
if ( BIT0 & tmp ) {Port1_Out |= LCD_Data4;}
LCDE();
tmp = data & 0x0F; //Maska samo LO-Nibble
}
}
//pošljem CMD na display
void putCMD(char temp)
{
Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);
Port2_Out &= ~LCD_RS;
send_data(temp);
Port2_Out |= LCD_RS;
}
|
_________________ One shouldn’t work on semiconductors, that is a filthy mess; who knows if they really exist!
Wolfgang Pauli, 1931 |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 69 dni
Powered by phpBB © 2001, 2005 phpBB Group
|