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
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
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. :)