4x20 Lcd Sorunu

Başlatan Elektronikprojem, 04 Kasım 2017, 13:51:48

Elektronikprojem

Herkese iyi günler diliyorum.
4x20 lcd kullanarak bir program yazdım. Sorunum, program ilk açılıyor açılınca başla etiketinden başlıyor. Burada lcd nin ilk satırındaki yazılar ilginç bir şekilde silik ve sürekli yenilenir gibi gidip geliyor.
Bi alt menüye geçiyorum lcd nin ilk satırında hiçbir sıkıntı yok tekrar başla etiketine dönüyorum  sorun devam ediyor.
Kodları inceledim ama bir hataya rastlayamadım. Kodları aşağıda veriyorum.karşılaştığım sorunun fotoğrafını da ekte veriyorum . 2 fotograf var bunlardan biri sorunun bulunduğu fotoğraf. İkincisi ise bir alt menüye geçtiğimde çıkan menünün fotoğrafıdır.
@ __config _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_ON & _BODEN_ON & _BOREN_ON           
DEFINE OSC 4
OPTION_REG=%00000000
TRISA=%11111111 : PORTA=0
TRISB=0 : PORTB=0                                                                                               
TRISC=%10000000 : PORTC=0                                                       
TRISD=0 : PORTD=0
TRISE=%00000111 : PORTE=0
;-------------------------------------------------------------------------------
DEFINE ADC_BITS 10 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Örnekleme zamanı mikro saniye cinsinden.
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.   
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
SYMBOL GIE =INTCON.7 'genel interruptları açıyor
SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit
temp var BYTE                                         
;-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTD     
DEFINE LCD_DBIT 4       
DEFINE LCD_EREG PORTD     
DEFINE LCD_EBIT 3               
DEFINE LCD_RSREG PORTD   
DEFINE LCD_RSBIT 2       
DEFINE LCD_BITS 4       
DEFINE LCD_LINES 4
DEFINE LCD_COMMANDUS 1000
DEFINE LCD_DATAUS 225
PAUSE 500
;-------------------------------------------------------------------------------
SYMBOL YUKARI=PORTE.0
SYMBOL OK=PORTE.1
SYMBOL ASAGI=PORTE.2
;-------------------------------------------------------------------------------
VOLTHAM     VAR WORD
AMPERHAM    VAR WORD
TOP_VOLT    VAR WORD
TOP_AMP     VAR WORD
VOLT        VAR WORD 
AMPER       VAR word
WATT        VAR WORD
COSFI       var word
COSFI=1
KWH         VAR WORD
WH          VAR WORD   
BEDELTL     VAR WORD
BEDELKR     VAR WORD
ORTALAMA    VAR WORD
ORTALAMAM   VAR WORD
SAYI VAR WORD
SAYI=0

TL          var byte
READ        0,TL
KURUS       VAR BYTE
READ        1,KURUS
SURE        VAR BYTE
READ        10,SURE
ENERJI      VAR BYTE
READ        11,ENERJI
MV          VAR  BYTE
ma          var byte
MW          VAR  WORD
I           var word
I=0
gelen       var byte
SAAT        VAR BYTE
DAKIKA      VAR BYTE
SANIYE      VAR BYTE
SAAT=0
DAKIKA=0
SANIYE=0
DATALOGGER  VAR BYTE

BAYRAK      VAR BIT
BAYRAK=1
;-------------------------------------------------------------------------------
PORTB=0
PORTA=0
VOLT=0
amper=0
;-------------------------------------------------------------------------------
INTCON=%11000000
ON INTERRUPT GOTO INT
RCIE=1
;-------------------------------------------------------------------------------
BASLA:
      GOSUB OLCUM     
     
lcdout $FE,$80,"GERILIM=",dec3 volt," V       "
;lcdout $fe,$80,"V=",#VOLTHAM," T:",#top_volt
lcdout $fe,$c0,"AKIM=",dec2 AMPER/100,",",dec2 amper//100," A         " 
;lcdout $fe,$80,"Amperham= ",dec4 ortalama
LCDOUT $FE,$94,"GUC FAKTORU=0,82 COS"
lcdout $FE,$D4,"ANLIK GUC=",DEC4 WATT," W                "
PAUSE 100
 
IF ASAGI=0 THEN
GOTO B2
ENDIF

IF OK=0 THEN
WHILE OK=0 :WEND
GOTO AYAR
ENDIF

IF AMPER>100 THEN
BAYRAK=0
BAYRAK=0
ELSE
BAYRAK=1
ENDIF

if BAYRAK=0 THEN
PAUSE 500
SANIYE=SANIYE+1
IF SANIYE=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN
DAKIKA=0
SAAT=SAAT+1
ENDIF
ENDIF
ENDIF

GOTO BASLA
;-------------------------------------------------------------------------------]
B2:
GOSUB OLCUM

LCDOUT $FE,$80,"BAG SURESI=",#SAAT,",",dec2 DAKIKA," s  "
lcdout $fe,$c0,"TOP ENERJI=",DEC2 KWH/1000,",",DEC3 WH//1000," KWH"
LCDOUT $FE,$94,"kWh FIYATI=",dec2 TL,",",dec2 KURUS," TL "
lcdout $FE,$D4,"TUK BEDELI=",DEC3 BEDELTL/1000,",",DEC2 BEDELKR/1000," TL"
PAUSE 100

IF YUKARI=0 THEN GOTO BASLA

IF OK=0 THEN
WHILE OK=0 :WEND
GOTO AYAR
ENDIF

IF AMPER>100 THEN
BAYRAK=0
ELSE
BAYRAK=1
ENDIF

if BAYRAK=0 THEN
PAUSE 500
SANIYE=SANIYE+1
IF SANIYE=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN
DAKIKA=0
SAAT=SAAT+1
ENDIF
ENDIF
ENDIF

GOTO B2
;-------------------------------------------------------------------------------
OLCUM:
TOP_VOLT=0
       FOR I=0 to 19   
         ADCIN 0,VOLTHAM
         TOP_VOLT=TOP_VOLT+(VOLTHAM+1)
         PAUSEus 5
       NEXT
       VOLTHAM=TOP_VOLT/20
       VOLT=VOLTHAM*/750  '0-300V arası okuma içindir.

  MV=VOLT//10         
volt=volt/10     
       
      TOP_AMP=0
      ORTALAMA=0
      ;ORTALAMAM=0
       for I=0 to 200 ;20 ÇEVRİM SONUÇ
         ADCIN 1,AMPERHAM
      if ortalama<amperham then
      ortalama=amperham
      endif
      ;IF ORTALAMAM>AMPERHAM AND ORTALAMAM <>0 THEN
      ;ORTALAMAM=AMPERHAM
      ;ENDIF
         pauseus 3
       NEXT
       ;ORTALAMA=ORTALAMA-ORTALAMAM
   AMPER=(ABS(512-ortalama))*/1000
MA=AMPER//100           
             
             
SAYI=AMPER/100
WATT=(VOLT*SAYI)+(VOLT*MA/100)
;WATT=(WATT*82)/100
 
KWH=WATT*SAAT
WH=(WATT*DAKIKA)/100


BEDELTL=(KWH*TL)+(WH*KURUS)
BEDELKR=(WH*TL)+(WH*KURUS)




      RETURN
;-------------------------------------------------------------------------------


;-------------------------------------------------------------------------------
AYAR:
LCDOUT $FE,$80,"->BIRIM FIYAT AYARLA"
lcdout $FE,$c0,"HAFIZAYI SIL        "
LCDOUT $FE,$94,"                    " 
lcdout $FE,$D4,"                    "
PAUSE 100
     
IF OK=0 THEN GOTO FIYATAYAR

IF ASAGI=0 THEN GOTO HAFIZASIL
     
GOTO AYAR
;-------------------------------------------------------------------------------     
     FIYATAYAR:
LCDOUT $FE,$80,      "->BIRIM FIYAT AYARLA"
  lcdout $fe,$c0,#TL," TL                 "
LCDOUT $FE,$94,      "                    " 
lcdout $FE,$D4,      "                    "
    PAUSE 100
 
  IF YUKARI=0 THEN
  WHILE YUKARI=0
  WEND
  TL=TL+1
  IF TL>9 THEN TL=0
  ENDIF
 
  IF OK=0 THEN
  WHILE OK=0 :WEND
  WRITE 0,TL
  PAUSE 10
  GOTO KURUSAYAR
  ENDIF
  GOTO FIYATAYAR
 
KURUSAYAR:
LCDOUT $FE,$80,         "->BIRIM FIYAT AYARLA"
lcdout $fe,$c0,#KURUS,  " KURUS              "
LCDOUT $FE,$94,         "                    " 
lcdout $FE,$D4,         "                    "
  PAUSE 100
 
  IF YUKARI=0 THEN
  KURUS=KURUS+1
  WHILE YUKARI=0
  WEND
  IF KURUS>99 THEN KURUS=0
  ENDIF
 
IF OK=0 THEN
WHILE OK=0 :WEND
WRITE 1,KURUS
PAUSE 10
GOTO BASLA
ENDIF

GOTO KURUSAYAR
;-------------------------------------------------------------------------------
HAFIZASIL:
LCDOUT $FE,$80,      "->HAFIZAYI SIL      "
lcdout $fe,$c0,      "OK=HAFIZAYI SIL     "
LCDOUT $FE,$94,      "                    "
lcdout $FE,$D4,      "                    "
    PAUSE 250
   IF OK=0 THEN
   SURE=0
   ENERJI=0
   WRITE 10,SURE
   PAUSE 10
   WRITE 11,ENERJI
   PAUSE 10
   GOTO BASLA
   ENDIF
   GOTO HAFIZASIL
;-------------------------------------------------------------------------------
DISABLE
INT:
GIE=0
HSERIN ,5,ATLA,[WAIT("s"),dec gelen]
ATLA:
TEMP=RCREG
GIE=1
Resume
enable

Benzer şekilde sorun ile karşılaşan var mı?

F®T

$80 bu lcd adreslerini üst üste yazdırıyorsunuz.diğer menüdeki gibi değiştirin.Uygun adres verin.

lcdout $FE,$80,"GERILIM=",dec3 volt," V       "
;lcdout $fe,$80,"V=",#VOLTHAM," T:",#top_volt
lcdout $fe,$c0,"AKIM=",dec2 AMPER/100,",",dec2 amper//100," A         " 
;lcdout $fe,$80,"Amperham= ",dec4 ortalama
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Adresler bence doğru. Kapatılmış satırlarda verilen komutları dikkate almamak gerekiyor.
Görebildiğim tek kusur bir LCD açılış işlemi yapılmamış. Bu durudma LCD registerleri rastgele yerlere yerleşir ve sorun çıkartır.

LCD tanımlama satırlarının hemen altındaki  PAUSE 500 komutunu oradan kaldırın.
Basla satırından evvel ;
LCDOUT  $FE,1
Pause 500
komutlarını verip tekrar derleyerek deneyin bakalım sonuç değişecekmi.
Ayrıca Ekrana yazdırma komutlarından olan,
lcdout $fe,$c0,"AKIM=",dec2 AMPER/100,",",dec2 amper//100," A         "   komut satırında en sonda yer alan A harfinden sonraki boşluk sayısını bir azaltın. Bu hali ile 21 karekter oluşturuyor bu ise diğer satıra taşma yaratıp oraki ilk karekteri sildirme yapar.
Yine benzer şekilde;
lcdout $FE,$D4,"ANLIK GUC=",DEC4 WATT," W                "
komut satırında karekter adedi 33 adet oluyor. En fazla 20 karekter olması gerekir. Bu nedenle bu satır;

lcdout $FE,$D4,"ANLIK GUC=",DEC4 WATT," W    " şeklinde olmalıdır.

Ete

Elektronikprojem

Hocam bosluklari deneme yaparken birakmistim. 20 karakter3 ayarlayinca da yapiyordu lcdout $fe,1 pause 500 yaptim sorun duzeldi. Gozden kacirmisim o kismi
Tesekkur ederim

ete

LCD satırlarında fazladan boşluk bırakmak diğer satırlara taşma yaratacağı için ayrı bir sorun olarak karşına çıkar.
Aşağıda 4x20 LCD nin her bir satırının adres haritasını görüyorsun. BU haritaya bakarak şunları söyleyebiliriz.
1. satırdan taşan karekterler 3. satırın başından karekter siler.
2. Satırdan taşan karekterler 4. satırdan karekter siler. Bu nedenle taşmalara da dikket edilmesi gerekir.
$80   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   $90   1   2   3
$C0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   $D0   1   2   3
$94   5   6   7   8   9   A   B   C   D   E   F   $A0   1   2   3   4   5   6   7
$D4   5   6   7   8   9   A   B   C   D   E   F   $E0   1   2   3   4   5   6   7

Ete


Powered by EzPortal