LOOKUP komutu kullanarak LCD ekrana farklı uyarılar basmak???

Başlatan kaganayanoglu, 31 Ocak 2019, 10:14:58

kaganayanoglu

Merhaba 

Sıkça kullandığım 4x16 LCD ekrana LOOKUP ile endekslenmiş terimlerden istediğimi basmak istiyorum. Ama LCDOUT ile nasıl bastıracağımı bilmiyorum.

LCDOUT $FE,1     
LCDOUT $FE, $80, "    MERHABA     "
LCDOUT $FE, $C0, "     DUNYA      "                  
LCDOUT $FE, $90, "TEST2:   ???????????                      'Buraya nasıl bir tanımlama yapmalıyım. 
LCDOUT $FE, $D0, "TEST1:", TEMP : T=1 : GOSUB TABLE  'Böyle yazınca sadece 1 harf görüntüleniyor.
PAUSE 100 
GOTO ANA


TABLE :
      
      LOOKUP T,["ABC","AHMET","C","212"],TEMP    'BU TABLODAKİ "ABC","AHMET","C","212" İBARELERİNİ EKRANDA NASIL GÖSTEREBİLİRİM?
      
RETURN


BU TABLODAKİ "ABC","AHMET","C","212" ibarelerini ekranda nasıl gösterebilirim?

Teşekkürler

ete

Bahsi geçen LOOKUP tablosu çalışma prensibini bilirsen nasıl yapacağın konusunda kafanda fikir oluşur aslında. Tablo iki köşeli parantez içinde virgül ile ayrılmış karekterlerden oluşmakta. Virgül ile ayrılmış karekterler adet bazında tabloda yer alırlar. Bu nedenle ekrana yazdırılacak karekterin hangi sıradan başladığı ve nerede bittiğini bilmek gerekiyor. Bunu düşünerek 3 ayrı lookup tablosu ile istediğini kolaylıkla yapabilirsin.
Tablo_Bir : Yazdırılacak ilk karekterin hangi sırada yer aldığını söylüyor.
Tablo_Iki : Yadırılacak karekter adedini söylüyor
Tablo_Üç  : Yazdırılacak karekterleri içeriyor.
Verdiğin karekter tablosuna bakarak ben diğer iki tabloyu oluşturup bunları alt program şeklinde düzenledim.
BASLA:
      SIRA=0:GOSUB TABLO_BIR:GOSUB TABLO_IKI
      LCDOUT $FE,$80
      FOR T=ILK TO SON
        GOSUB TABLO_UC
        LCDOUT TEMP
      NEXT
      
      SIRA=1:GOSUB TABLO_BIR:GOSUB TABLO_IKI
      LCDOUT $FE,$C0
      FOR T=ILK TO SON
         GOSUB TABLO_UC
         LCDOUT TEMP
      NEXT
      
      SIRA=2:GOSUB TABLO_BIR:GOSUB TABLO_IKI
      LCDOUT $FE,$94
      FOR T=ILK TO SON
         GOSUB TABLO_UC
         LCDOUT TEMP
      NEXT
      
      SIRA=3:GOSUB TABLO_BIR:GOSUB TABLO_IKI
      LCDOUT $FE,$d4
      FOR T=ILK TO SON
         GOSUB TABLO_UC
         LCDOUT TEMP
      NEXT      
      
      GOTO BASLA
           

TABLO_BIR:
          LOOKUP SIRA,[0,3,8,9],ILK:RETURN 

TABLO_IKI: 
   LOOKUP SIRA,[3,5,1,3],ADET:SON=ILK+ADET-1:RETURN      

TABLO_UC :
      
      LOOKUP T,["ABC","AHMET","C","212"],TEMP   
      
RETURN

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

kaganayanoglu

#2
TEKRAR TEŞEKKÜR EDERİM.

Bende aynı sorunu yaşayabilecek ve soracak arkadaşlar için derlenebilecek hale getirip açıklama ekledim.
pic16f877a ve 4x16 LCD de çalışabiliyor.

;----[16F877A Hardware Configuration]-------------------------------------------
#IF __PROCESSOR__ = "16F877A"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg = _HS_OSC                 ; HS oscillator
cfg&= _WDT_OFF                ; WDT disabled
cfg&= _PWRTE_OFF              ; PWRT disabled
cfg&= _BODEN_ON               ; BOR enabled
cfg&= _LVP_OFF                ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg&= _CPD_OFF                ; Data EEPROM code protection off
cfg&= _WRT_OFF                ; Write protection off; all program memory may be written to by EECON control
cfg&= _DEBUG_OFF              ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg&= _CP_ALL                 ; All program memory code-protected
  __CONFIG cfg

#ENDCONFIG

#ENDIF


'*************************************
'ISLEMCI TANIMLAMALARI
DEFINE OSC 20
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 100
    
'*************************************
Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?  
DEFINE LCD_DBIT 0          'LCD data bacakları hangi bitten başlıyor? 
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 4         'LCD RS bacağı Hangi Bite bağlı ?       
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5          'LCD Enable Bacağı Hangi bite bağlı ?    
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4
'*************************************

T VAR BYTE
SIRA VAR BYTE
ILK VAR BYTE
SON VAR BYTE
ADET VAR BYTE
TEMP VAR WORD


BASLA:
     'ASAGIDAKI KOD GRUBU LCD EKRANDA 1.SATIRA "ABC"YAZDIRIR. 
      SIRA=0:GOSUB TABLO_BIR:GOSUB TABLO_IKI   'BURADA SIRA İLK TERIM YANI "ABC" (0) SIFIRINCI SIRADA
      LCDOUT $FE,$80 : FOR T=ILK TO SON : GOSUB TABLO_UC
      LCDOUT TEMP       'TEMP ADLI TABLODAKI TERIMLERDEN, TABLO_1 VE TABLO_2 TABLOLARINDAKI KONUMA GÖRE SEÇİYOR 
      NEXT
      
     'ASAGIDAKI KOD GRUBU LCD EKRANDA 2.SATIRA  "AHMET"YAZDIRIR. 
      SIRA=1:GOSUB TABLO_BIR:GOSUB TABLO_IKI   'BURADA SIRA IKINCI TERIM YANI "AHMET" BIRINCI SIRADA
      LCDOUT $FE,$C0 : FOR T=ILK TO SON : GOSUB TABLO_UC
      LCDOUT TEMP
      NEXT
      
     'ASAGIDAKI KOD GRUBU LCD EKRANDA 3.SATIRA "C"YAZDIRIR. 
      SIRA=2:GOSUB TABLO_BIR:GOSUB TABLO_IKI   'BURADA SIRA UCUNCU TERIM YANI "C" IKINCI SIRADA
      LCDOUT $FE,$90 : FOR T=ILK TO SON : GOSUB TABLO_UC
      LCDOUT TEMP
      NEXT
      
     'ASAGIDAKI KOD GRUBU LCD EKRANDA 4.SATIRA "123"YAZDIRIR. 
      SIRA=3:GOSUB TABLO_BIR:GOSUB TABLO_IKI   'BURADA SIRA DORDUNCU TERIM YANI "123" UCUNCU SIRADA
      LCDOUT $FE,$d0 : FOR T=ILK TO SON : GOSUB TABLO_UC
      LCDOUT TEMP
      NEXT      
      
      GOTO BASLA
           

TABLO_BIR:
LOOKUP SIRA,[0,3,8,9],ILK:RETURN   'SIRASIYLA TABLO_3'DEKI TERIMLERIN ILK KARAKTERLERININ YERLERI 
                                   'NOT: ILK KARAKTER "0"(SIFIR) SONRASI 0-1-2-3 DIYE GIDIYOR
TABLO_IKI: 
LOOKUP SIRA,[3,5,1,3],ADET:SON=ILK+ADET-1:RETURN  'SIRASIYLA ASAGIDAKI TERIMLERIN KARAKTER SAYILARI    

TABLO_UC:
LOOKUP T,["ABC","AHMET","C","212"],TEMP :RETURN   'BIZIM YAZDIRMAK ISTEDIGIMIZ TERIMLER
 

Hatamız varsa affola. :)