Fórum témák
- • Videomagnó problémák
- • Audiofil, High End Audio
- • Laptop javítás, tuning
- • Alternativ HE találkozó(k)
- • Varrógép elektronika
- • Központi fűtés (vezérlés)
- • IMI villanymotor
- • Klíma beszerelése, fűtés-hűtés házilag
- • Arduino
- • SMD, mi a típusa?
- • Műhelyünk felszerelése, szerszámai
- • Borhűtő vezérlő panel
- • Súlymérés
- • Erősítő mindig és mindig
- • Mosógép vezérlők és általános problémáik
- • Analóg oszcilloszkóp javítása
- • Elfogadnám, ha ingyen elvihető
- • Boombox javítás
- • Elektromos távirányítós kapunyitó
- • Kombikazán működési hiba
- • Számítógép hiba, de mi a probléma?
- • Szünetmentes táp javítása, élesztése
- • Hűtőgép probléma
- • Videoton EA-7386-s erösítő
- • Digitális mérleg
- • Kapcsolási rajzot keresek
- • TV hiba, mi a megoldás?
- • Felajánlás, azaz ingyen elvihető
- • Triak és tirisztor helyettesítése
- • Rádióamatőrök topikja
- • Hangszórójavítás (otthon)
- • LED-es világítás
- • Whirlpool mosógép
- • Vásárlás, hol kapható?
- • Autóelektronika
- • Hangváltók (készítése)
- • Kondenzátor
- • Függvénygenerátor építése
- • Vicces - mókás történetek
- • Dobozolási technikák, műszerdobozok
- • Forrasztópákák - melyik miért jó
- • CPLD, FPGA - Miértek, hogyanok
- • Eredményjelző
- • Klíma szervizelés, javítás
- • V-FET és SIT erősítő kapcsolások
- • Érdekességek
- • Autós erősítős kérdések, problémák
- • Padlófűtés vezérlés
- • Li-Ion saját akkucsomag készítése
- • Tranzisztor teszter
- • Elektromos kerékpár, robogó házilag
- • TDA7294 végerősítő
- • 3D nyomtatás
- • Alaplap kérdések
- • TDA7293 végerősítő
» Több friss téma
|
Fórum » LCD kijelző vezérlése, életre keltése
(#) |
Axel hozzászólása |
Ápr 19, 2011 |
|
/ |
|
|
Hello!
Találkoztatok már olyannal, hogy egy LCD kijelző alsó és felső sorának csak az első felébe lehet írni? (a másik 8 digit mindkét sorban sötét.) Mi lehet a gondja? Olyat már hallottam ,hogy bizonyos sorokba nem ír, de hogy mindkettőnek csak a felébe olyat még nem.
Köszi!
kicsit visszább volt már ilyen gondja másnak, és vszinű az LCD felépítése olyan, hogy ha 1 sorosnak engedélyezed, akkor mindkét sor első fele működik, és ha 2 sorosnak engedélyezed, akkor jó lesz. De ez csak tipp.
Vagy: nyomkodd meg óvatosan a kijelzőt a panel felé. :yes:
(#) |
Axel hozzászólása |
Ápr 19, 2011 |
|
/ |
|
|
Hát nem tudom, ez nem akarja az igazságot
Egy olyan függvény vezérli ami Atmega128-ra lett írva és avval jól működött. Most ugyan Atmega8-at használok de a függvényben csak a PORTA-t kellett POTRC-re állítani szóval nem ott lesz a bibi szerintem. A kijelző típusa:
PLC1602D1W-SYL. Adatlapot sehol sem találtam hozzája... Megpróbálom majd egy másik 2x16-os LCD-vel is, hátha.
Sziasztok!
Vásároltam egy 2x20-as lcd kijelzőt. Az IC benne KS0066U.
Ez kompatibilis a hd44780-val?
CCSC-ben fordítottam le a forrásfájlt
A PIC-em : PIC16F1938
DB4: PIN_C0
DB5: PIN_C1
DB6: PIN_C2
DB7: PIN_C3
RS: PIN_B4
RW: PIN_B5
E: PIN_B6
VO: GND
VSS: GND
VDD: +5V
DB0-DB3: Levegőben lóg
Most csak az első sorban kockákat rak ki.
Többször is ellenőriztem a csatlakozást.
Mellékelem az LCD meghajtó kódot:
// Flex_LCD420.c
// These pins are for my Microchip PicDem2-Plus board,
// which I used to test this driver.
// An external 20x4 LCD is connected to these pins.
// Change these pins to match your own board's connections.
#define LCD_DB4 PIN_C0
#define LCD_DB5 PIN_C1
#define LCD_DB6 PIN_C2
#define LCD_DB7 PIN_C3
#define LCD_RS PIN_B4
#define LCD_RW PIN_B5
#define LCD_E PIN_B6
/*
// To prove that the driver can be used with random
// pins, I also tested it with these pins:
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_C5
#define LCD_DB7 PIN_B5
#define LCD_RS PIN_E2
#define LCD_RW PIN_B2
#define LCD_E PIN_D6
*/
// If you want only a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line. Doing so will save one PIC
// pin, but at the cost of losing the ability to read from
// the LCD. It also makes the write time a little longer
// because a static delay must be used, instead of polling
// the LCD's busy bit. Normally a 6-pin interface is only
// used if you are running out of PIC pins, and you need
// to use as few as possible for the LCD.
#define USE_RW_PIN 1
// These are the line addresses for most 4x20 LCDs.
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54
// These are the line addresses for LCD's which use
// the Hitachi HD66712U controller chip.
/*
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x20
#define LCD_LINE_3_ADDRESS 0x40
#define LCD_LINE_4_ADDRESS 0x60
*/
//========================================
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines(or more)
int8 lcd_line;
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Set mode: 4-bit, 2+ lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.
#ifdef USE_RW_PIN
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_us(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
delay_us(1);
return(retval);
}
#endif
//---------------------------------------
// Read a byte from the LCD and return it.
#ifdef USE_RW_PIN
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high<<4) | low);
}
#endif
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_RW_PIN
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_RW_PIN
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------
void lcd_init(void)
{
int8 i;
lcd_line = 1;
output_low(LCD_RS);
#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif
output_low(LCD_E);
// Some LCDs require 15 ms minimum delay after
// power-up. Others require 30 ms. I'm going
// to set it to 35 ms, so it should work with
// all of them.
delay_ms(35);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 50 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_RW_PIN
delay_ms(5);
#endif
}
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
switch(y)
{
case 1:
address = LCD_LINE_1_ADDRESS;
break;
case 2:
address = LCD_LINE_2_ADDRESS;
break;
case 3:
address = LCD_LINE_3_ADDRESS;
break;
case 4:
address = LCD_LINE_4_ADDRESS;
break;
default:
address = LCD_LINE_1_ADDRESS;
break;
}
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//-----------------------------
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
lcd_line = 1;
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1, ++lcd_line);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
//------------------------------
#ifdef USE_RW_PIN
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(LCD_RS);
return(value);
}
#endif
#define CUSTOM1 0
#define CUSTOM2 1
#define CUSTOM3 2
#define CUSTOM4 3
#define CUSTOM5 4
void custom_chars(void);
const int8 lcd_custom_chars[] =
{
// Char Number 0 -- é betű
0b00001000, //...o....
0b00000100, //....o...
0b00001110, //...ooo..
0b00010001, //..o...o.
0b00011111, //..ooooo.
0b00010000, //..o.....
0b00001110, //...ooo..
0b00000000, //........
// Char Number 1 -- ő betű
0b00000101, // .....o.o
0b00001010, // ....o.o.
0b00000000, // ........
0b00001110, // ....ooo.
0b00010001, // ...o...o
0b00010001, // ...o...o
0b00001110, // ....ooo.
0b00000000, // ........
// Char Number 2 -- á betű
0b00000010, // ......o.
0b00000100, // .....o..
0b00001110, // ....ooo.
0b00000001, // .......o
0b00001111, // ....oooo
0b00010001, // ...o...o
0b00001111, // ....oooo
0b00000000, // ........
// Char Number 3 -- ó betű
0b00001000, // ....o...
0b00000100, // .....o..
0b00000000, // ........
0b00001110, // ....ooo.
0b00010001, // ...o...o
0b00010001, // ...o...o
0b00001110, // ....ooo.
0b00000000, // ........
// Char Number 4 -- ~ jel
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00011100, // ...ooo..
0b00010101, // ...o.o.o
0b00000111, // .....ooo
0b00000000, // ........
0b00000000, // ........
// Char Number 5 -- Blank
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
// Char Number 6 -- Blank
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
// Char Number 7 -- Blank
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000 // ........
};
void custom_chars(void)
{
int8 i;
// Set address counter pointing to CGRAM address 0.
lcd_send_byte(0, 0x40);
// Load custom lcd character data into CGRAM.
// It can only hold a maximum of 8 custom characters.
for(i = 0; i < sizeof(lcd_custom_chars); i++)
{
lcd_send_byte(1, lcd_custom_chars[i]);
}
// Set address counter pointing back to the DDRAM.
lcd_send_byte(0, 0x80);
}
Szimulációban tökéletesen megy. De összerakva semmi
VO a kontraszt beállítására van. Tegyél oda egy 10k-s trimmer potit, a csuszkája csatlakozzon a VO-ra, az egyik vége a tápra, a másik a GND-re!
Először egy 2k2 volt rajta de akkor is kicsi volt a kontraszt.
Most hogy direktbe földön van így már látható a "karakter", de nem hinném hogy ez a baj hisz a 2-dik sor meg tök üres.
Hali!
Használt már valaki SED1330-as IC-t (grafikus) LCD vezérléshez?
Sziasztok ezeket a BG12864 grafikus LCD kijelzőket
hogyan lehet kitörölni, mert ugye CLEAR DISPLAY parancs nincs
Sziasztok!
Nagy segítség kellene LCD élesztéshez. Már többször próbáltam, de nem akar összejönni. Mindenkinek olyan egyszerű, de nekem ez lenne az első eset és már az agyamra megy.
Vettem egy 1x16-os kijelzőt .omexben. Típusát így nem tudom, de szerintem a mellékelt leírás jó hozzá.
Van egy Pic18F452.
A bekötésben sem vagyok 100%.
Az LCD megkapja a tápot. Az adatbitek a C-portra mennek (0-ás bit a 0-ra, 1-es az 1-esre, stb- az LSB miatt). A 3 vezérlő kivezetés meg az A-portra.
Beállítottam a kontrasztot is.
Jelenleg az LCD utolsó (vagy első?) 8 karaterénél fekete teli kockákat látok bármit csinálok.
Mellékelem a progit is.
Próbáltam az időzítéseket állítani, de nem akar összejönni.
A D-port egyik bitjét csak azért pöckölöm, hogy lássam, hogy fut a progi.
Please help!
Még annyi, hogy bootloader-rel van a progi letöltve. Elvileg letöltés után reset-elni kell az MCLR-t.
Illetve minden kivezetésre rá van kötve egy (asszem) 1K-s ellenálás.
Sziasztok,
lenne egy olyan kérdésem felétek.
Kiindulási pont: ATMEGA88-al vezéreltem egy WH1601 -es lcd-t. Minden úgy megy ahogy menni kell. Ekkor áttértem egy GE-C1601 -es LCD kijelzőre, és hopp jön a rejtély.
A kijelzőn a karakterek nem látszanak. Ha próba képpen beállítom hogy villogjon a kurzor és csak egy számot iratok ki a 0. pozícióba akkor az 1. pozíción villog a kurzor, de a számot előtte nem látom.
Az alap dolgokat hagyjuk figyelmen kívül hogy kontraszt vagy táp vagy vezérlőlábak rosszul vannak bekötve. Ha kurzor villogást látok akkor jó a kijelző vezérlése, de valami kis bibi van. Kérdésem tehát hogy szerintetek mi lehet? Játszottam már a kijelző vezérlésének a késleltetésével is, de ugyanaz a jelenség maradt. Nos tudtok segíteni ? ?
Szia
először is az adatlapban nem tul sok van a vezérléséről az LCDnek, de egy általam ismert hasonló kijelzőnek a 8 bites vezérlésére itt van az inicializálás rész :
-Várj 40ms -nál többet a bekapcsolástól számítva.
-funkció beállítás ( 0b0011NF00 ; itt az N :a sorok száma[1=2soros , 0=1 soros ; F : karakterek mérete, esetedben 8pont magas tehát F=0 ] )
- várj 40us nál többet
-funkció beállitás (ugyanaz mint előbb)
- várj 40 us-nál többet
-Display beállítás (0b00001DCB ; itt D:kijelző ki/be ; C:curzor alsó vonal ki/be ; B: kurzor villogás ki/be
-várj 37us-nál többet
-kijelző törlés (0b00000001 )
-várj 1.53ms nál többet
-Entry set (0b000001IS , itt engedélyezheted a curzor mozgatást és a shiftelést.)
- elvileg vége , de egy kis várakozás ide se árt.
nahmost a programod szerintem nem tűnt elsőre rosznak, de az én tippem asz lenne hogy a kijelződ nem 1x16os kiosztású hanem 2x8 as , így a beállításnál 2sorosnak kéne belőni, illetve a kontrasztod lehet maximális ezért látsz a "működö 1 sorban" csupa teli kockákat. Próbáld ki hogy potit raksz a contraszt lábra, Vcc és GND között tudod szabályzoni a kontrasztot, és ha tippem jó akkor előbb utóbb eltünnek a teli karakterek és csak az A betűd fog látszódni.
Még annyi hogy a programban szerintem az RW lábat hagyhatod állandóan nullán, ezt úgyis csak akkor kell "1" be rakni ha netán olvasnál a kijelzőről. (ez csak kicsit megrövidíti a kódot)
Mijagondja Nagyuram vele?
JAni
Sziasztok, ha valaki tudna segiteni, hogyan lehet a 2x16os lcd kijelzőn egy sorban irni, nagyon megköszönném.
Üdv!
Ha jól értem, neked szép nagy nyúlt karakterek kellenének egy sorban, viszont erre csak félmegoldások léteznek:
1) Be lehet lehet állítani a kijelzőt 10x5-ös karakterméretre, ilyenkor a q, p, g, j, y betűk szárai fognak lelógni a második sorba.
2) Fel lehet vinni 8 db saját karaktert a kijelzőbe. Ezzel csak négy "nagy" karaktert tudsz kiírni egyszerre, és elég bonyolulttá teszi az LCD programozását.
köszi a válaszodat, de leht hogy nem voltam elég világos, van egy áramkör, ami egysoroshoz készült, nekem pedig kétsoros van, a bekapcsolásnál a szöveg felét a felső, a másik felét meg az alsóba irja, hogyan tudnám elérni, hogy egy sorba irja, akár a felsőbe, vagy az alsóba, köszi
Bele kell nyúlni a programba, mivel az egysoros modul valószínűleg logikailag 2 soros volt.
Tehát a következőt kellene tenni a programmal: meg kell keresni azokat az LCD utasításokat, ahol a címzések vannak, és a 0x40 címről át kell helyezni a kiírást a 0x08-as címre.
Szia!
Gondolom abban az áramkörben van mikrovezérlő, vagyis az vezérli az LCD-t. Ha tudod módosítani az MCU programját, akkor át kell állítani egysorosra (parancsként kell elküldeni a b'001L0F00'-t, ahol az L bit értéke 1, ha 8 biten, 0 ha 4 biten kommunikál az MCU-val; az F bit értéke 1 ha 5x11 pixelesek a fontok, 0 ha 5x8-asok).
Ha nem tudsz MCU-t kezelni, akkor venni kell egy egysoros LCD-t.
köszönöm, sokat segitettél, meg fogom próbálni, üdv
köszöm a segitségedet, megpróbálom, ha nem boldogulok vele, akkor veszek egy egysorosat
Szívesen! Akkor bele tudsz nyúlni a mikrovezérlő programjába?
ilyet még nem csináltam, eléggé kezdő vagyok az elektronikában
Képet tudnál mutatni az áramkörről? Te raktad össze?
én raktam össze, jól műküdik a frekmérő, csak a kijelzéssel van gond
Melyiket raktad össze? Milyen mikrovezérlő van benne? PIC....?
nem tudom, hogy átment -e a kapcsrajz
Én nem látok sehol kapcsirajzot.
|
|