I2CWRITE SORUNU.. ??? 24C64WP -lowbyte, highbyte??

Başlatan boraciner, 11 Temmuz 2009, 18:50:08

boraciner

Merhaba arkadaşlar, şu an
boraciner gönderdğimde eepromdan okurken
brcnr görüyorum neden böyle acaba? kodlar en son gönderdiğim mesajda mevcut.

teşekkürler...


IF ANAHTAR = 1 THEN
i2cREAD edat,eclk,cont,0,LIMIT
PAUSE 50
FOR SAYAC = 0 TO LIMIT
i2cREAD edat,eclk,cont,SAYAC,DEGER
PAUSE 50
SAYAC=SAYAC+1
SEROUT portb.7,N2400,[DEGER]
NEXT
ENDIF


IF ANAHTAR=0 THEN
i2cwrite edat,eclk,cont,SAYAC,[kodcozdeg]
pause 50 
SAYAC=SAYAC+1
LIMIT=SAYAC
i2cwrite edat,eclk,cont,0,[LIMIT]
PAUSE 50
endif






kodun tamamı

INCLUDE "modedefs.bas"
' Yazan: mhk 
' Tarih : 03.11.2004 Yalova 
' PC AT pic basic pro klavye programi 
' 2x16 LCD ekran kullanilmistir. 
' PC AT klavyelerde bir tusa basma esnasinda 
' senkron iletisim ile her tusa ait kod gönderilir. 
' basili tusun birakilmasi ile F0 basilan tus bilgisi gönderilir. 
' örnegin A tusuna basildiginda ilk önce Hex 1C bilgisi senkron 
' olarak gönderilir. Basmaya devam edildigi müddetçe bu bilgi 
' gönderilmeye devam edilecektir. Eger tustan elimizi çekersek 
' F0 sonra 1C bilgisi gönderilecektir. Daha detayli bilgi için 
' AT klavye haberlesme protokolüne bakiniz. 

  
define osc 20 
DEFINE I2C_SLOW 1 

@ device HS_OSC 
@ device WDT_OFF  &  pwrt_on 


ADCON1 = 7                  ' PORTA ve  E dijital giris çikis olarak ayarla 

TRISA = %111111              ' A portunu giris olarak tanimla 
TRISB = %11111111            ' B portunu giris olarak tanimla 
TRISC = %11111111            ' C portunu giris olarak tanimla 
TRISD = 0



option_reg=%00000000            'Pull up enable yap 
portb=0:portc=0:portd=0 

CLKPIN   var     PORTB.0        ' Klavye clock pin PORTB.0 olarak tanimla 
DATAPIN  var     PORTB.1       ' Klavye Data pin PORTB.1 olarak tanimla 
anahtar var PORTB.2
'************** Degisken tip tanimlama bloklari ********* 
klavyedeg    var     byte 
dvm01 var byte 
dvm02 var byte 
dvm03 var byte 
dvm04 var byte 
dvm05 var byte 
SAYAC var byte 
LIMIT var byte
DEGER VAR BYTE 
deg var BYTE 
satir var byte 
kodcozdeg var byte 
harf var byte 
parity var bit 
bitsay var byte 
parbit var byte 
txdeg var byte 
rx_byte var byte 
LEDs var byte 
rx_ok var byte 
turk var byte[8] 
  edat var portd.1 
 eclk var portd.0 
 cont con %10100000
'**************** degisken baslangiç degerleri *********** 
klavyedeg=0 
dvm01=0 
dvm02=0 
dvm03=0 
dvm04=0 
dvm05=0 
kodcozdeg=0 
deg=0 
satir=0 
harf=1 
txdeg=0 
rx_byte=0 
LEDs=0 
bitsay=0 
rx_ok=0 
SAYAC=1
LIMIT=1
gosub ekransil                   ' LCD ekran temizleme alt programina git. 



pause 2000 
gosub turkkar                    'LCD CGRAM hücrelerine türkçe karakterleri yükle 
gosub ekransil 
           LEDs =0                
           txdeg=$ED             ' PC AT klavye caps num ve scrlock ledlerini söndür. 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
            
'AAAAAAAAAAAAAAAAAAAAAAA-------  Ana Program ------AAAAAAAAAAAAAAAAA 

anaprogram: 
IF ANAHTAR = 1 THEN
i2cREAD edat,eclk,cont,0,LIMIT
PAUSE 50
FOR SAYAC = 0 TO LIMIT
i2cREAD edat,eclk,cont,SAYAC,DEGER
PAUSE 50
SAYAC=SAYAC+1
SEROUT portb.7,N2400,[DEGER]
NEXT
ENDIF
rx_byte =0 
    gosub RX_klavye 
if rx_ok=0 then anaprogram 
rx_ok=0 

 IF rx_byte=$12 or rx_byte=$59 THEN M4 ' Eger shift tusuna basilmissa M4 e git 
  
  
 if rx_byte=$F0 then dvm02=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan F0 gelmisse 
 if rx_byte=$E0 then dvm05=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan E0 gelmisse 

 if dvm02=1 then dvm02=0:goto anaprogram     ' Eger klavye tusu birakildiginda tus tekrarini önler 

    IF rx_byte = $FA THEN                   ' Klavye caps num ve scrlock ledlerini yakmaya hazir  
                                             ' oldugunda FA bilgisini gönderir. 
           GOSUB TX_hazir 
           txdeg=LEDs 
           GOSUB ledcaps 
           rx_byte =0 
     ENDIF 

     IF rx_byte = $12 THEN                   ' Eger shift tusuna basilmissa if blogu içindekileri yap 
M4: 

           LEDs = LEDs | %00000001          ' scroll lock LED'i 1 ile OR islemi yaparak 1' le 
          IF dvm02 = 1 THEN                  
            LEDs =LEDS ^ %00000001         ' Scroll lock LED'i değille 
              dvm02=0 
         ENDIF  
         txdeg=$ED 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
           GOTO anaprogram 
   ENDIF        

    IF rx_byte = $58 THEN                   ' Eger shift caps lock basilmissa if blogu içindekileri yap 
           LEDs = LEDs ^ %00000100           ' Caps ledini değilleyerek her basista yanmasi yada 
           txdeg=$ED                         ' sönmesini saglar 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
           goto anaprogram 
    ENDIF 


      IF LEDs = 0 THEN                    ' caps = 0, shift = 0 
           harf=1                             ' ( Caps ve Shift basilmamissa normal durum) 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

      IF LEDs = 1 THEN                    ' caps = 0, shift = 1 
           harf=2                             ' Normal durumda klavyede shift tusuna basilma islemi 
          gosub kodcoz 
         GOTO anaprogram 
      ENDIF       

      IF LEDs = 4 THEN                       ' Caps = 1, shift = 0 
           harf=3 
          gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

           harf=4 
               gosub kodcoz 
goto anaprogram 

'*************** KLAVYE OKUMA ****************************** 
' Klavye bilgi alma islemi burada gerçeklesir. 
' Senkron iletisimde clock pals ve ardindan bilgiler 
' gönderilir. Bu islem için clock palsin her islenmesinde 
' datpindeki bilgi bir degiskene aktarilir ve  
' 1 byte lik bilgi elde edilinceye kadar kaydirilir. 
' PC AT klavyelerde bilgi 11 bit ile iletilir. Ilk bit start 
' sonra 8 bit bilgi , partiy ( dogrulama biti *) ve stop bitidir. 
' *parity bit hesaplama:Gönderilen 1 ler çift ise parity=1 
' tek ise parity=0 olacak sekilde ayarlanir. 

RX_klavye: 
        gosub clock 
        if deg=1 then RX_klavye 

        if deg<10 then 
                klavyedeg=klavyedeg>>1 
                klavyedeg.7=DATAPIN 
              
        endif        
        
    if deg>10 then deg=0:rx_byte=klavyedeg:rx_ok=1:return 

GOTO RX_klavye 
return 
'******************** CLOCK ************************ 
clock: 
' Klavyenin gönderdigi her clock pals bu kisimda degerlendirilir. 
' Klavye clock hattinin 0 olmasini bekler. 
if CLKPIN=1 then dvm01=0:goto clock 

if dvm01=1 then clock 

if CLKPIN=0 then 
        deg=deg+1 
        dvm01=1 
endif 

return 
'************* Seri bilgi gönderme alt programi ******** 
' Klavyeye bilgi gönderme için ilk önce kontrol biti gönderilmelidir. 
' Bunun için  TX_hazir alt programini inceleyiniz. 

tx_gonder: 

gosub clock 
        if deg<9 then 
                datapin=txdeg.0 
                txdeg=txdeg>>1 
        endif        
    if deg=9 then datapin=1 
    if deg=10 then 
            option_reg=0                      ' Pull up devrede 
            TRISB = %00000011                 ' Clock ve data giris tanimlandi 
    endif 
    
     if deg=11 then deg=0:return              ' 11. bite ulasildiysa geri dön 

goto tx_gonder 
return 
'******************************************************* 
ledcaps: 
'parity bit hesaplama: Gönderilen 1 ler çift ise parity=1, tek ise parity=0 olacak 
gosub clock 

        if deg<9 then 
                datapin=txdeg.0 
                txdeg=txdeg>>1 
        endif        
    if deg=9 then 
                datapin=parity 
    endif 

    if deg=10 then 
            option_reg=0 
            TRISB = %00000011 
    endif 
   if deg=11 then deg=0:return 

goto ledcaps 
return 
'******************************************************* 
TX_hazir: 
' Alt kisimda klavyeye bilginin nasil gönderilecegini sirasiyla açiklayalim 
' Ilk önce data ve clock hattini çiks olarak tanimla TRISB = 0 
'1)   Clock hattini low yap.(clock=0) yaklasik olarak 80 mikrosaniye bekle 
'2)   Data pini low yap ( Datapin=0 ) yaklasik 20 mikrosaniye bekle 
'3)   Clock pin giris datapin çikis olarak ayarla TRISB = %00000001 
'4)   Klavye clock hatti low ( 0 ) olana kadar bekle 
'5)   Data hattina göndereceginiz bilginin ilk bitini yerlestirin 
'6)   Klavye clock hatti high( 1 ) olana kadar bekle 
'7)   Klavye clock hatti low ( 0 ) olana kadar bekle 
'8)   Diger 7 bit ve parity bit için 5 ve 7 arasindaki islemleri takip edin. 
'9)   Data pin ve clock pin giris olarak ayarla TRISB = %00000011 
'10)  Klavye data hatti low ( 0 ) olana kadar bekle 
'11)  Klavye clock hatti low ( 0 ) olana kadar bekle 

parbit=LEDs 
for deg=0 to 2 
         if parbit.0=1 then bitsay=bitsay+1    ' Parity bit hesalama için gönderilecek  
        parbit=parbit>>1                       ' bilgideki 1 lerin sayisi bitsay degiskeninde 
                                               ' saklanir. 
next 
 parity=0 
 if bitsay//2=0 then parity=1                  ' Eger bitsay çift ise parity=1 
 bitsay=0:parbit=0                             ' Degilse parity=0 olarak hesaplanir. 
  
deg=0 
       option_reg=0 
      TRISB = 0 
       clkpin=0:pauseus 80 
       datapin=0:pauseus 20 
        TRISB = %00000001    

        

return 
'****************** KOD COZME ****************************** 
kodcoz: 

if rx_byte=$66 then                       ' ESC tusunun kodu , eger bu tusa basilmissa 
  kodcozdeg=" ":satir=satir-1             ' LCD ekran temizlenir. 
        if satir>15 then satir=0          ' 2x16 LCD ekranda 16.satira gelindiginde ekran 
        gosub lcdgoster                   ' temizlenir ve satir basi yapilir. 
    return 
endif 

if rx_byte=$0E then kodcozdeg=34:goto gec02 ' OE kodu " karakterini olusturmak için kullanilir. 
if rx_byte=$54 then kodcozdeg=0:goto gec02  ' Türkçe G karakteri 
if rx_byte=$49 then kodcozdeg=1:goto gec02  ' Türkçe Ç karakteri 
if rx_byte=$5B then kodcozdeg=2:goto gec02  ' Türkçe Ü karakteri 
if rx_byte=$4C then kodcozdeg=3:goto gec02  ' Türkçe S karakteri 
if rx_byte=$41 then kodcozdeg=5:goto gec02  ' Türkçe ö karakteri 
'if rx_byte=$54 then kodcozdeg=64:goto gec02' @ karakteri 

' Keypad / tusunun aktif yapilmasi için kullanildi. 
if dvm05=1 THEN 
       if rx_byte=$4A then dvm05=0:kodcozdeg="/":goto gec02 
endif 
' Bakspace tus kodu, bu tusa basildiginda yazilan son karakter silinir. 
if rx_byte=$76 then satir=0:kodcozdeg=" ":gosub ekransil:gosub lcdgoster:return 

' Klavyede kullanilmayacak tuslarin ekranda kodlarinin görüntülenmesini engeller. 
if rx_byte>126 or rx_byte<20 then return 

' Keypad tuslarinin kullanimi ile ilgili kodlari çözmek için kullanilir. 
if rx_byte>104 THEN harf=5 

gec01: 
gosub harfbul              
gec02:                      
if satir>15 then satir=0:gosub ekransil 
gosub lcdgoster 
satir=satir+1 
rx_byte=0 
return 

'**************** LCD TÜRKÇE KARAKTER OLUSTURMA ************** 
turkkar: 
' Türkçe karakterlerin LCD CGRAM hücrelerine yerlestirilmesi 
' LCD CGRAM hücrelerine custom karakter ekleyebilirsiniz. 
' Bunun için LCDOut $FE,64 yazmaniz gerekir. 
' 64 LCD CGRAM hüzresinin ( Custom karakter ) yada ram baslangiç 
' adresidir. Max 64 byte yazabilirsiniz. Her karakter 5x8 matrix 
' seklinde olustuguna göre  8 karakter kapasiteye sahiptir. 
' LCD CGRAM hücresine yazma islemi ilk adres olan $64 ten baslar 
' $7 F ile biter. LCDOUT ile ilk adrese veriler yazilir. 
' Daha sonra adres otomatik artar ve sonuncu bit yazildiktan sonra 
' LCD CGRAM doldurulmus olur. LCD CGRAM doldurulan bilgi yada karakterleri 
' ilk adresten itibaren okumak gerekir. Bunun için 
' LCDOUT $FE,2,0 yazildiginda 1. adresteki karakter ekrana yazilir. 
' LCDOUT $FE,2,1 yazildiginda 2. adresteki karakter ekrana yazilir. 

      LCDOut $FE,64 

for deg=0 to 63 
' Türkçe g karakteri 
if deg=0 then 
turk[0]=$0E:turk[1]=$00:turk[2]=$0E:turk[3]=$11:turk[4]=$11:turk[5]=$0F:turk[6]=$01:turk[7]=$0E 
    gosub yerlestir 
endif 

' Türkçe ç karakteri 
if deg=8 then 
 turk[0]=$00:turk[1]=$0E:turk[2]=$11:turk[3]=$10:turk[4]=$11:turk[5]=$0E:turk[6]=$04:turk[7]=$08 
    gosub yerlestir 
endif 

' Türkçe ü karakteri 
if deg=16 then 
 turk[0]=$00:turk[1]=$0A:turk[2]=$00:turk[3]=$11:turk[4]=$11:turk[5]=$11:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe s karakteri 
if deg=24 then 
 turk[0]=$00:turk[1]=$0F:turk[2]=$10:turk[3]=$0E:turk[4]=$01:turk[5]=$1E:turk[6]=$04:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe i karakteri 
if deg=32 then 
 turk[0]=$00:turk[1]=$00:turk[2]=$0C:turk[3]=$04:turk[4]=$04:turk[5]=$04:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe ö karakteri 
if deg=40 then 
 turk[0]=$0A:turk[1]=$00:turk[2]=$0E:turk[3]=$11:turk[4]=$11:turk[5]=$11:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

next 

return 
yerlestir: 


return 
'**************************** HARF ÇÖZME ********************** 
Harfbul: 
' Klavyaden alinan tus bilgilerini çözmek için 
' kullanilan kod karsilik tablosu. 
' Klavyeden çözülen kodlarin karsiliklari ilgili 
' tablodan alinarak LCD ekranda yazdirilir. 

' caps = 0, shift = 0 ise harf=1  küçük harf modu , nümerik tuslar normal 
' caps = 0, shift = 1 ise harf=2  büyük harf modu , nümerik tuslar ikinci karakterde 
' Caps = 1, shift = 0 ise harf=3  büyük harf modu , nümerik tuslar normal 
' Caps = 1, shift = 1 ise harf=4  küçük harf modu , nümerik tuslar ikinci karakterde 
' Harf = 5 ise keypad tuslarindaki kodlar tablodan alinir.            
if harf=1 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["q1   zsaw2  cxde43   vftr5  nbhgy6   mju78   k o09   .l p*=  i  -       ,   <"],kodcozdeg 
'Türkçe i karakteri 
if rx_byte=$43 then kodcozdeg=4 

endif 

if harf=2 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["Q!   ZSAW'  CXDE+^   VFTR%  NBHGY&   MJU/(   KIO=)   :L P?=  I  _       ;   >"],kodcozdeg 
endif 

if harf=3 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["Q1   ZSAW2  CXDE43   VFTR5  NBHGY6   MJU78   KIO09   .L P*=  I  -       ,   <"],kodcozdeg 
endif 

if harf=4 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["q!   zsaw'  cxde+^   vftr%  nbhgy&   mju/(   k o=)   :l p?=  i  _       ;   >"],kodcozdeg 
endif 


if harf=5 then                                                                              
'***************************************************** 
'******************************11111111112222222222333 
'********************012345678901234567890123456789012 
LOOKUP rx_byte-105,["1 47   0,2568   +3-*9"],kodcozdeg 
endif 
return 

'*************** LCD GÖSTERME **************************** 
lcdgoster: 
SEROUT portb.7,N2400,[kodcozdeg]

IF ANAHTAR=0 THEN
i2cwrite edat,eclk,cont,SAYAC,[kodcozdeg]
pause 50 
SAYAC=SAYAC+1
LIMIT=SAYAC
i2cwrite edat,eclk,cont,0,[LIMIT]
PAUSE 50
endif

return 
'*************** EKRAN TEMIZLEME ALT PROGRAMI ************ 
ekransil: 

return 

End

boraciner

bu arada clk ve data girişlerini Vcc 'ye 4.7k lık dirençlere pull-up bağlıyorum.. fakat hala çalışmıyor ?? =(((((

boraciner

DEFINE I2C_SLOW 1
ekledim yine çalışmıyor =( çalışıyor ama hep garip bir karakter okuyor..

lojikmemo1

IF ANAHTAR = 1 THEN satırı işi bozabilir çünki anahtara ilk basıldığı anda onlarca defa gürültü sinyali oluşabiliyor ister kodu düzelt ister anahtara 100nf paralel bağla.
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.

boraciner

anahtar sıfıra çekiliyken enerji veriyorum, kayıt yapmaya başlıyor sonra enerjiyi kesip anahtarı 1 e çekiyorum ve tekrar enerji veriyorum fakat yine sorun aynı.. sanırım kodlarla ilgili bir sorun var?

boraciner

i2cwrite edat,eclk,cont,0,[6]
i2cREAD edat,eclk,cont,0,[kodcozdeg]
PAUSE 50
SEROUT portb.7,N2400,[kodcozdeg]


bu kodların sonucunda ÿ  karakteri ekrana geliyor..

i2cwrite edat,eclk,cont,0,[65]
i2cREAD edat,eclk,cont,0,[kodcozdeg]
PAUSE 50
SEROUT portb.7,N2400,[kodcozdeg]

bu kodların sonucunda da ÿ  karakteri ekrana geliyor..

+5V 'a ve eeprom'un clk data bağlı olan 4.7k lık dirençlerin birini çıkarıyorum bu sefer ÿ   karakteri yerine | gibi bir karakter çıkıyor. acaba devrede mi bir sorun var. aşağıdaki resim doğru değilmi??


boraciner

değişken tipini word yaptım çünkü 64 ve üzeri olunca word olması gerekiyormuş adres kısmının word olması gerekiyormuş ama şimdi de şu var

boraciner yazdığımda sırayla... gelen karakterler şu oluyor
brcnr
aralardaki harfleri okumuyor.. nasıl olacak???

boraciner

kodların son hali : boraciner yazınca brcnr getiriyor..
INCLUDE "modedefs.bas"
' Yazan: mhk 
' Tarih : 03.11.2004 Yalova 
' PC AT pic basic pro klavye programi 
' 2x16 LCD ekran kullanilmistir. 
' PC AT klavyelerde bir tusa basma esnasinda 
' senkron iletisim ile her tusa ait kod gönderilir. 
' basili tusun birakilmasi ile F0 basilan tus bilgisi gönderilir. 
' örnegin A tusuna basildiginda ilk önce Hex 1C bilgisi senkron 
' olarak gönderilir. Basmaya devam edildigi müddetçe bu bilgi 
' gönderilmeye devam edilecektir. Eger tustan elimizi çekersek 
' F0 sonra 1C bilgisi gönderilecektir. Daha detayli bilgi için 
' AT klavye haberlesme protokolüne bakiniz. 

  
define osc 20 
@ device HS_OSC 
@ device WDT_OFF  &  pwrt_on 
DEFINE I2C_SLOW 1
'Define I2C_SCLOUT 1 
ADCON1 = 7                  ' PORTA ve  E dijital giris çikis olarak ayarla 

TRISA = %111111              ' A portunu giris olarak tanimla 
TRISB = %11111111            ' B portunu giris olarak tanimla 
TRISC = %11111111            ' C portunu giris olarak tanimla 
TRISD = 0

portd=0

option_reg=%00000000            'Pull up enable yap 
portb=0:portc=0:portd=0 

CLKPIN   var     PORTB.0        ' Klavye clock pin PORTB.0 olarak tanimla 
DATAPIN  var     PORTB.1       ' Klavye Data pin PORTB.1 olarak tanimla 
anahtar var PORTB.2
'************** Degisken tip tanimlama bloklari ********* 
klavyedeg    var     byte 
dvm01 var byte 
dvm02 var byte 
dvm03 var byte 
dvm04 var byte 
dvm05 var byte 
SAYAC var word 
LIMIT var word
SIFIR VAR WORD
DEGER VAR byte 
deg var BYTE 
satir var byte 
kodcozdeg var byte 
harf var byte 
parity var bit 
bitsay var byte 
parbit var byte 
txdeg var byte 
rx_byte var byte 
LEDs var byte 
rx_ok var byte 
turk var byte[8] 
  edat var portd.1 
 eclk var portd.0 
hedef var word
tampon var byte
 cont con %10100000
 a var byte[8]
'**************** degisken baslangiç degerleri *********** 
klavyedeg=0 
dvm01=0 
dvm02=0 
dvm03=0 
dvm04=0 
dvm05=0 
kodcozdeg=0 
deg=0 
satir=0 
harf=1 
txdeg=0 
rx_byte=0 
LEDs=0 
bitsay=0 
rx_ok=0 
SAYAC=1
LIMIT=0
hedef=0
SIFIR=0
gosub ekransil                   ' LCD ekran temizleme alt programina git. 



pause 2000 
gosub turkkar                    'LCD CGRAM hücrelerine türkçe karakterleri yükle 
gosub ekransil 
           LEDs =0                
           txdeg=$ED             ' PC AT klavye caps num ve scrlock ledlerini söndür. 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
            
'AAAAAAAAAAAAAAAAAAAAAAA-------  Ana Program ------AAAAAAAAAAAAAAAAA 

anaprogram: 
IF ANAHTAR = 1 THEN
i2cREAD edat,eclk,cont,SIFIR,[LIMIT]
PAUSE 50
FOR SAYAC = 0 TO LIMIT
i2cREAD edat,eclk,cont,SAYAC,[DEGER]
PAUSE 50
SEROUT portb.7,N2400,[DEGER]
SAYAC=SAYAC+1

NEXT
ENDIF
rx_byte =0 
    gosub RX_klavye 
if rx_ok=0 then anaprogram 
rx_ok=0 

 IF rx_byte=$12 or rx_byte=$59 THEN M4 ' Eger shift tusuna basilmissa M4 e git 
  
  
 if rx_byte=$F0 then dvm02=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan F0 gelmisse 
 if rx_byte=$E0 then dvm05=1:goto anaprogram ' Eger klavye tusu birakilma kodu olan E0 gelmisse 

 if dvm02=1 then dvm02=0:goto anaprogram     ' Eger klavye tusu birakildiginda tus tekrarini önler 

    IF rx_byte = $FA THEN                   ' Klavye caps num ve scrlock ledlerini yakmaya hazir  
                                             ' oldugunda FA bilgisini gönderir. 
           GOSUB TX_hazir 
           txdeg=LEDs 
           GOSUB ledcaps 
           rx_byte =0 
     ENDIF 

     IF rx_byte = $12 THEN                   ' Eger shift tusuna basilmissa if blogu içindekileri yap 
M4: 

           LEDs = LEDs | %00000001          ' scroll lock LED'i 1 ile OR islemi yaparak 1' le 
          IF dvm02 = 1 THEN                  
            LEDs =LEDS ^ %00000001         ' Scroll lock LED'i değille 
              dvm02=0 
         ENDIF  
         txdeg=$ED 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
           GOTO anaprogram 
   ENDIF        

    IF rx_byte = $58 THEN                   ' Eger shift caps lock basilmissa if blogu içindekileri yap 
           LEDs = LEDs ^ %00000100           ' Caps ledini değilleyerek her basista yanmasi yada 
           txdeg=$ED                         ' sönmesini saglar 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
           goto anaprogram 
    ENDIF 


      IF LEDs = 0 THEN                    ' caps = 0, shift = 0 
           harf=1                             ' ( Caps ve Shift basilmamissa normal durum) 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

      IF LEDs = 1 THEN                    ' caps = 0, shift = 1 
           harf=2                             ' Normal durumda klavyede shift tusuna basilma islemi 
          gosub kodcoz 
         GOTO anaprogram 
      ENDIF       

      IF LEDs = 4 THEN                       ' Caps = 1, shift = 0 
           harf=3 
          gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

           harf=4 
               gosub kodcoz 
goto anaprogram 

'*************** KLAVYE OKUMA ****************************** 
' Klavye bilgi alma islemi burada gerçeklesir. 
' Senkron iletisimde clock pals ve ardindan bilgiler 
' gönderilir. Bu islem için clock palsin her islenmesinde 
' datpindeki bilgi bir degiskene aktarilir ve  
' 1 byte lik bilgi elde edilinceye kadar kaydirilir. 
' PC AT klavyelerde bilgi 11 bit ile iletilir. Ilk bit start 
' sonra 8 bit bilgi , partiy ( dogrulama biti *) ve stop bitidir. 
' *parity bit hesaplama:Gönderilen 1 ler çift ise parity=1 
' tek ise parity=0 olacak sekilde ayarlanir. 

RX_klavye: 
        gosub clock 
        if deg=1 then RX_klavye 

        if deg<10 then 
                klavyedeg=klavyedeg>>1 
                klavyedeg.7=DATAPIN 
              
        endif        
        
    if deg>10 then deg=0:rx_byte=klavyedeg:rx_ok=1:return 

GOTO RX_klavye 
return 
'******************** CLOCK ************************ 
clock: 
' Klavyenin gönderdigi her clock pals bu kisimda degerlendirilir. 
' Klavye clock hattinin 0 olmasini bekler. 
if CLKPIN=1 then dvm01=0:goto clock 

if dvm01=1 then clock 

if CLKPIN=0 then 
        deg=deg+1 
        dvm01=1 
endif 

return 
'************* Seri bilgi gönderme alt programi ******** 
' Klavyeye bilgi gönderme için ilk önce kontrol biti gönderilmelidir. 
' Bunun için  TX_hazir alt programini inceleyiniz. 

tx_gonder: 

gosub clock 
        if deg<9 then 
                datapin=txdeg.0 
                txdeg=txdeg>>1 
        endif        
    if deg=9 then datapin=1 
    if deg=10 then 
            option_reg=0                      ' Pull up devrede 
            TRISB = %00000011                 ' Clock ve data giris tanimlandi 
    endif 
    
     if deg=11 then deg=0:return              ' 11. bite ulasildiysa geri dön 

goto tx_gonder 
return 
'******************************************************* 
ledcaps: 
'parity bit hesaplama: Gönderilen 1 ler çift ise parity=1, tek ise parity=0 olacak 
gosub clock 

        if deg<9 then 
                datapin=txdeg.0 
                txdeg=txdeg>>1 
        endif        
    if deg=9 then 
                datapin=parity 
    endif 

    if deg=10 then 
            option_reg=0 
            TRISB = %00000011 
    endif 
   if deg=11 then deg=0:return 

goto ledcaps 
return 
'******************************************************* 
TX_hazir: 
' Alt kisimda klavyeye bilginin nasil gönderilecegini sirasiyla açiklayalim 
' Ilk önce data ve clock hattini çiks olarak tanimla TRISB = 0 
'1)   Clock hattini low yap.(clock=0) yaklasik olarak 80 mikrosaniye bekle 
'2)   Data pini low yap ( Datapin=0 ) yaklasik 20 mikrosaniye bekle 
'3)   Clock pin giris datapin çikis olarak ayarla TRISB = %00000001 
'4)   Klavye clock hatti low ( 0 ) olana kadar bekle 
'5)   Data hattina göndereceginiz bilginin ilk bitini yerlestirin 
'6)   Klavye clock hatti high( 1 ) olana kadar bekle 
'7)   Klavye clock hatti low ( 0 ) olana kadar bekle 
'8)   Diger 7 bit ve parity bit için 5 ve 7 arasindaki islemleri takip edin. 
'9)   Data pin ve clock pin giris olarak ayarla TRISB = %00000011 
'10)  Klavye data hatti low ( 0 ) olana kadar bekle 
'11)  Klavye clock hatti low ( 0 ) olana kadar bekle 

parbit=LEDs 
for deg=0 to 2 
         if parbit.0=1 then bitsay=bitsay+1    ' Parity bit hesalama için gönderilecek  
        parbit=parbit>>1                       ' bilgideki 1 lerin sayisi bitsay degiskeninde 
                                               ' saklanir. 
next 
 parity=0 
 if bitsay//2=0 then parity=1                  ' Eger bitsay çift ise parity=1 
 bitsay=0:parbit=0                             ' Degilse parity=0 olarak hesaplanir. 
  
deg=0 
       option_reg=0 
      TRISB = 0 
       clkpin=0:pauseus 80 
       datapin=0:pauseus 20 
        TRISB = %00000001    

        

return 
'****************** KOD COZME ****************************** 
kodcoz: 

if rx_byte=$66 then                       ' ESC tusunun kodu , eger bu tusa basilmissa 
  kodcozdeg=" ":satir=satir-1             ' LCD ekran temizlenir. 
        if satir>15 then satir=0          ' 2x16 LCD ekranda 16.satira gelindiginde ekran 
        gosub lcdgoster                   ' temizlenir ve satir basi yapilir. 
    return 
endif 

if rx_byte=$0E then kodcozdeg=34:goto gec02 ' OE kodu " karakterini olusturmak için kullanilir. 
if rx_byte=$54 then kodcozdeg=0:goto gec02  ' Türkçe G karakteri 
if rx_byte=$49 then kodcozdeg=1:goto gec02  ' Türkçe Ç karakteri 
if rx_byte=$5B then kodcozdeg=2:goto gec02  ' Türkçe Ü karakteri 
if rx_byte=$4C then kodcozdeg=3:goto gec02  ' Türkçe S karakteri 
if rx_byte=$41 then kodcozdeg=5:goto gec02  ' Türkçe ö karakteri 
'if rx_byte=$54 then kodcozdeg=64:goto gec02' @ karakteri 

' Keypad / tusunun aktif yapilmasi için kullanildi. 
if dvm05=1 THEN 
       if rx_byte=$4A then dvm05=0:kodcozdeg="/":goto gec02 
endif 
' Bakspace tus kodu, bu tusa basildiginda yazilan son karakter silinir. 
if rx_byte=$76 then satir=0:kodcozdeg=" ":gosub ekransil:gosub lcdgoster:return 

' Klavyede kullanilmayacak tuslarin ekranda kodlarinin görüntülenmesini engeller. 
if rx_byte>126 or rx_byte<20 then return 

' Keypad tuslarinin kullanimi ile ilgili kodlari çözmek için kullanilir. 
if rx_byte>104 THEN harf=5 

gec01: 
gosub harfbul              
gec02:                      
if satir>15 then satir=0:gosub ekransil 
gosub lcdgoster 
satir=satir+1 
rx_byte=0 
return 

'**************** LCD TÜRKÇE KARAKTER OLUSTURMA ************** 
turkkar: 
' Türkçe karakterlerin LCD CGRAM hücrelerine yerlestirilmesi 
' LCD CGRAM hücrelerine custom karakter ekleyebilirsiniz. 
' Bunun için LCDOut $FE,64 yazmaniz gerekir. 
' 64 LCD CGRAM hüzresinin ( Custom karakter ) yada ram baslangiç 
' adresidir. Max 64 byte yazabilirsiniz. Her karakter 5x8 matrix 
' seklinde olustuguna göre  8 karakter kapasiteye sahiptir. 
' LCD CGRAM hücresine yazma islemi ilk adres olan $64 ten baslar 
' $7 F ile biter. LCDOUT ile ilk adrese veriler yazilir. 
' Daha sonra adres otomatik artar ve sonuncu bit yazildiktan sonra 
' LCD CGRAM doldurulmus olur. LCD CGRAM doldurulan bilgi yada karakterleri 
' ilk adresten itibaren okumak gerekir. Bunun için 
' LCDOUT $FE,2,0 yazildiginda 1. adresteki karakter ekrana yazilir. 
' LCDOUT $FE,2,1 yazildiginda 2. adresteki karakter ekrana yazilir. 

      LCDOut $FE,64 

for deg=0 to 63 
' Türkçe g karakteri 
if deg=0 then 
turk[0]=$0E:turk[1]=$00:turk[2]=$0E:turk[3]=$11:turk[4]=$11:turk[5]=$0F:turk[6]=$01:turk[7]=$0E 
    gosub yerlestir 
endif 

' Türkçe ç karakteri 
if deg=8 then 
 turk[0]=$00:turk[1]=$0E:turk[2]=$11:turk[3]=$10:turk[4]=$11:turk[5]=$0E:turk[6]=$04:turk[7]=$08 
    gosub yerlestir 
endif 

' Türkçe ü karakteri 
if deg=16 then 
 turk[0]=$00:turk[1]=$0A:turk[2]=$00:turk[3]=$11:turk[4]=$11:turk[5]=$11:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe s karakteri 
if deg=24 then 
 turk[0]=$00:turk[1]=$0F:turk[2]=$10:turk[3]=$0E:turk[4]=$01:turk[5]=$1E:turk[6]=$04:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe i karakteri 
if deg=32 then 
 turk[0]=$00:turk[1]=$00:turk[2]=$0C:turk[3]=$04:turk[4]=$04:turk[5]=$04:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

' Türkçe ö karakteri 
if deg=40 then 
 turk[0]=$0A:turk[1]=$00:turk[2]=$0E:turk[3]=$11:turk[4]=$11:turk[5]=$11:turk[6]=$0E:turk[7]=$00 
    gosub yerlestir 
endif 

next 

return 
yerlestir: 


return 
'**************************** HARF ÇÖZME ********************** 
Harfbul: 
' Klavyaden alinan tus bilgilerini çözmek için 
' kullanilan kod karsilik tablosu. 
' Klavyeden çözülen kodlarin karsiliklari ilgili 
' tablodan alinarak LCD ekranda yazdirilir. 

' caps = 0, shift = 0 ise harf=1  küçük harf modu , nümerik tuslar normal 
' caps = 0, shift = 1 ise harf=2  büyük harf modu , nümerik tuslar ikinci karakterde 
' Caps = 1, shift = 0 ise harf=3  büyük harf modu , nümerik tuslar normal 
' Caps = 1, shift = 1 ise harf=4  küçük harf modu , nümerik tuslar ikinci karakterde 
' Harf = 5 ise keypad tuslarindaki kodlar tablodan alinir.            
if harf=1 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["q1   zsaw2  cxde43   vftr5  nbhgy6   mju78   k o09   .l p*=  i  -       ,   <"],kodcozdeg 
'Türkçe i karakteri 
if rx_byte=$43 then kodcozdeg=4 

endif 

if harf=2 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["Q!   ZSAW'  CXDE+^   VFTR%  NBHGY&   MJU/(   KIO=)   :L P?=  I  _       ;   >"],kodcozdeg 
endif 

if harf=3 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["Q1   ZSAW2  CXDE43   VFTR5  NBHGY6   MJU78   KIO09   .L P*=  I  -       ,   <"],kodcozdeg 
endif 

if harf=4 then                                                                              
'************************************************************************************************************ 
'*****************************1111111111222222222233333333334444444444555555555566666666667777777777888888888 
'*******************01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 
LOOKUP rx_byte-21,["q!   zsaw'  cxde+^   vftr%  nbhgy&   mju/(   k o=)   :l p?=  i  _       ;   >"],kodcozdeg 
endif 


if harf=5 then                                                                              
'***************************************************** 
'******************************11111111112222222222333 
'********************012345678901234567890123456789012 
LOOKUP rx_byte-105,["1 47   0,2568   +3-*9"],kodcozdeg 
endif 
return 

'*************** LCD GÖSTERME **************************** 
lcdgoster: 
SEROUT portb.7,N2400,[kodcozdeg]

IF ANAHTAR=0 THEN
i2cwrite edat,eclk,cont,SAYAC,[kodcozdeg]
pause 50 
SAYAC=SAYAC+1
LIMIT=SAYAC
i2cwrite edat,eclk,cont,SIFIR,[LIMIT]
pause 50
endif

return 
'*************** EKRAN TEMIZLEME ALT PROGRAMI ************ 
ekransil: 

return 

End

Macera

boraciner yolluyorsun vede brcnr yazıyor ==>
ilk harfi yazıyor ikincil harfleri yazamıyor!
ilk harfi eeproma kaydederken ikinci harfi eeproma yolluyor olmayasın
her harf yazma operayonu sonrasında 5 ms gecikme rutini yaz
Bakalım düzeliyormu?
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

boraciner

tamamdır!! hallettim şimdi , sorun sayaçtaymış
word tipi sayaçla byte tipini
"for next " döngüsünde karşılaştırma yaparken hata çıkıyormuş. bende bir word tipi daha yaratıp 0 a eşitledim sonra o byte'ı word'ün high byte ına yazdım ve tekrar döngüye soktum artık çalışıyor!! teşekkürler ;)

gladi

IF ANAHTAR = 1 THEN
i2cREAD edat,eclk,cont,0,LIMIT
PAUSE 50
FOR SAYAC = 0 TO LIMIT
i2cREAD edat,eclk,cont,SAYAC,DEGER
PAUSE 50
SAYAC=SAYAC+1
SEROUT portb.7,N2400,[DEGER]
NEXT
ENDIF

------------------------------------

döngüde  sayac değişkenini hem döngüde hemde 1 er artırarak kullandıgın için mi
misafir olan kimse, beraberce getiremediği birşeye kalbini bağlamaz.

boraciner

döngüde sıradan okutmak için, word tipi  seçilmesi de 64KB olduğu için adreslemesine 13 bit gerekiyor bu da byte ile yapılamıyor

Alıntı yapılan: "gladi"IF ANAHTAR = 1 THEN
i2cREAD edat,eclk,cont,0,LIMIT
PAUSE 50
FOR SAYAC = 0 TO LIMIT
i2cREAD edat,eclk,cont,SAYAC,DEGER
PAUSE 50
SAYAC=SAYAC+1
SEROUT portb.7,N2400,[DEGER]
NEXT
ENDIF

------------------------------------

döngüde  sayac değişkenini hem döngüde hemde 1 er artırarak kullandıgın için mi