Sari la conținut
ELFORUM - Forumul electronistilor

LCD-Display LCM1602ASL 16x2 Problema


Postări Recomandate

  • Răspunsuri 148
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

MatyC , cred ca asta era problema , de fapt nu neaparat asta , ci toata structura de initializare + scriere + restul , care se repetau la nesfarsit in loc sa se execute o singura data .

 

Am rescris programul si merge bine acuma :

 

#include <htc.h>#include "lcd.h"voidmain(void){	lcd_init();    lcd_goto(0);    lcd_puts("-Esti bou?");    lcd_goto(0x40);    lcd_puts("-Da !");   while (RA1=0){   lcd_clear();}}

Liviu - E de 4Mhz , evident , nu sunt chiar atat de incepator :d

 

Multumesc tuturor ,, inca odata m-ati luminat !

Link spre comentariu

MatyC, in codul tau daca RA1=0 atunci textul este scris si apoi sters la fiecare executie a buclei while. Corect cred ca ar fi asa:

#include <htc.h>#include "lcd.h"voidmain(void){    lcd_init();     //Aici faci initializarea afisajuluiwhile (1) {   if (RA1=1) {      lcd_goto(0);      lcd_puts("  Bine ai venit");      lcd_goto(0x40);      lcd_puts("   pe elforum !");      }      else {              lcd_clear();           }}}
Link spre comentariu

Eu am pus accent pe pozitia functiei lcd_init(). Trebuie apelata doar o singura data si asta inaintea buclei infinite while(). Restul ramane la optiunea lui pspsuceava ce introduce in bucla.Oricum la "if (RA1=1){}" este valida pana la apasarea butonului. RA1 este pe 1 din cauza rezistentei de pull-up. Nu shtiu ce schema utilizeaza dar eu asa vad treburile. Eu am modificat varianta prezentata la inceputul topicului si efectul butonului este doar faptul ca sterge afisajul (lcd_clear() cand apesi butonul deoarece RA1=0) in restul timpului afiseaza aceleasi mesaj in permanenta. Ideea mea este ca in genereal initializarea afisajului se face inainte de intrarea in bucla infinita.

Link spre comentariu

Daca ma uit mai bine constat ca ati gresit toti trei. Corect e cu ==, nu cu = :rade:

 

#include <htc.h>#include "lcd.h"voidmain(void){    lcd_init();     //Aici faci initializarea afisajului    while (1)    {       if (RA1==1) {          lcd_goto(0);          lcd_puts("  Bine ai venit");          lcd_goto(0x40);          lcd_puts("   pe elforum !");       }        else {              lcd_clear();        }    } //while(1)} //main()
Link spre comentariu

@MatyC corect, initializarea lcd-ului se face doar o data, la inceput; mai departe intradevar ar trebui definit comportamentul. Sunt cazuri mai speciale cand pe parcursul functionarii initializarea lcd-ului se poate face de mai multe ori; am facut candva o aplicatie cu lcd "hot-plug", unde trebuia sa detectez cuplarea lcd-ului, sa-l initializez, etc.@Liviu corect, == pt interogare, si = pt atribuire ; eu sunt departe de a programa in C :jytuiyu

Link spre comentariu

Multumesc foarte mult tuturor :) !Am invatat datorita voua sa fac si permanenta stergerea/scrierea , ca in exemplul lui Liviu :)Inca ceva pentru cei care stiti , programez in PICC ( High-Tech C ) , cum fac configuratia ? :) Ca nu merge ca in ASM cu __CONFIG si dupa toate insiruite am incercat si cu ( XT & etc ) si tot nu merge , am citit in datasheet dar nu stiu sa transform , daca imi puteti explica , ca as vrea sa inteleg nu sa copii direct pentru WDT off , PWR off , XT ...

Link spre comentariu

Felicitari pentru reusite!Referitor la partea de configurare, in directorul

../Program Files/HI-TECH Software/PICC/9.80/include

gasesti fisierele .h cu definitiile diverselor porturi/functii ale fiecarui tip/familie de procesor. La sfarsitul fisierului ai sectiunea pentru configurare. De ex. pentru 16f877 arata asa
#define CONFIG_ADDR	0x2007/*osc configurations*/#define RC		0x3FFF	// resistor/capacitor#define HS		0x3FFE	// high speed crystal/resonator#define XT		0x3FFD	// crystal/resonator#define LP		0x3FFC	// low power crystal/resonator/*watchdog*/#define WDTEN		0x3FFF	// enable watchdog timer#define WDTDIS		0x3FFB	// disable watchdog timer/*power up timer*/#define PWRTEN		0x3FF7	// enable power up timer#define PWRTDIS		0x3FFF	// disable power up timer/*brown out reset*/#define BOREN		0x3FFF	// enable brown out reset#define BORDIS		0x3FBF	// disable brown out reset/*Low Voltage Programmable*/#define LVPEN		0x3FFF	// low voltage programming enabled#define LVPDIS		0x3F7F	// low voltage programming disabled/*data code protected*/#define DP		0x3EFF	// protect data code// alternately#define DPROT		0x3EFF	// use DP#define DUNPROT		0x3FFF	// use UNPROTECT/* Flash memory write enable/protect */#define WRTEN		0x3FFF	/* flash memory write enabled */#define WRTDIS		0x3DFF	/* flash memory write protected/disabled *//*debug option*/#define DEBUGEN		0x37FF	// debugger enabled#define DEBUGDIS	0x3FFF	// debugger disabled/*code protection*/#define PROTECT		0x0FCF	/* protect program code */#define UNPROTECT	0x3FFF	/* do not protect the code */#if !defined(_16F870) && !defined(_16F871)#define	PROTECT_TOP	0x2FEF	/* protects top 256 bytes, 1F00h to 1FFFh	*/#define PROTECT50	0x1FDF	/* protects upper half of address space		*/				/* 1000h to 1FFFh (pic16f887/876)		*/				/* 0800h to 0FFFh (pic16f874/873)		*/#endif
Cuvantul de configurare se "construieste" cu directiva __CONFIG();, in paranteze fiind un and (&) intre mai multi parametri care fac 0 cate un bit din cei x (14 ?) biti. Pun mai jos un exemplu dintr-un proiect de-al meu; daca te uiti la #define-urile din fisier si la codul meu, o sa poti calcula singur valoarea pe care ti-o arata si mplab printr-o fereastra de configurare.
__CONFIG(WDTDIS                                       // WD disable           & HS                                       // 20 Mhz crystal oscillator           & DUNPROT                                  // Data read EE unprotected           & LVPEN                                    // Low Voltage Programming enable             & UNPROTECT                                // Flash Write Pritection Off           & BORDIS                                   // Brown out disable           & PWRTEN);                                 // Power up timer enable 
Link spre comentariu
  • 9 ani mai târziu...

Cine imi poate spune si mie dacă este sau nu normal ca displayul LCD 1602 sa se incălzească atât de tare.

Este vorba despre Convertorul de tensiune AIBAZ 7660 care se incălzeste excesiv (nu poti ține mâna pe el).

În rest, funcționează perfect.

Am incercat cu un mic radiator, dar tot de geaba.

Este normal (am văzut că suportă până la 70 gade.

Dacă nu, atunci ce pot face?

imagine_2021-04-25_110125.png

imagine_2021-04-25_111111.png

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări