pic16877 klavye macrosu yapmak için yardım lütfen

Başlatan ibo1973, 20 Ağustos 2007, 14:44:19

ibo1973

arkadaşlar sanırım aradığım şeyin anahtarı bu şitede

http://www.piclist.com/techref/microchip/picboard.htm

ancak asmbler ile yazılmış ve ingilizce bunu ustalardan biri siteye ve koda göz atıp bana ne yapmam gerektiğini anlatıp bana başlangıç teşkil edicek bir bilgi verebilirmi

asambler ve ingilizce bilmiyorum

yapıcağınız anlatım yazılım olarak pic basic pro ve pic olarak pic 16f877 e göre olursa çok iyi olur

elektronik

lojikmemo1'in dediği gibi röle yerine bunlardan kullan.




ibo1973

Alıntı yapılan: "ahmet_ahmet"lojikmemo1'in dediği gibi röle yerine bunlardan kullan.



(Resim gizlendi görmek için tıklayın.)


ahmet arkadaşım cevabın için teşşekür ederim ama bu şekilde yapmak istemiyorum direk picden seninde geçen konuda söylediğin gibi picden klavye sinyallerini üretipte yapmak istiyorum

ibo1973

arkadaşlar pic16f877 picden direk klavye kodlarını üretmek isitiyorum allaha  şükür bende herkez kadar akıla sahibim yani anlama kapasitem herkez kadar var ama bu konuda acemiyim bana bu konuyu bana göre picbasic pronun basit olduğunu düşündüğüm için pic basic proda örnek vererek ve mantığını anlatarak öğretmenizi rica ediyorum

ibo1973

mhk hocamızın verdiği bu koddan bi şeyler çıkarmaya uğraşıyorum ama tam olarak anlayamadım

burda mhk hocamız sizinde anlıyacağınız üzere pic16f877 den klavye okumayı ve lcd ye çıkış alamakla ilgili bir program yazmış yani klavyeyi okutmuş bu picle yapılabiliyorsa sanırım benim yapmak istediğim pic16877 den klavye kodlarını üretip bilgisayara gönderme işide yapılabilir bunu buraya belki bana yardımcı olabilicek kişiye yardımı olur diye koydum neyse hala yardım bekliyorum .


' Yazan: mhk 
' Tarih : 03.11.2004 Yalova 
' PC AT pic basic pro klavye programı 
' 2x16 LCD ekran kullanılmıştır. 
' PC AT klavyelerde bir tuşa basma esnasında 
' senkron iletişim ile her tuşa ait kod gönderilir. 
' basılı tuşun bırakılması ile F0 basılan tuş bilgisi gönderilir. 
' örneğin A tuşuna basıldığında ilk önce Hex 1C bilgisi senkron 
' olarak gönderilir. Basmaya devam edildiği müddetçe bu bilgi 
' gönderilmeye devam edilecektir. Eğer tuştan elimizi çekersek 
' F0 sonra 1C bilgisi gönderilecektir. Daha detaylı bilgi için 
' AT klavye haberleşme protokolüne bakınız. 

  
define osc 20 
@ device HS_OSC 
@ device WDT_OFF  &  pwrt_on 


ADCON1 = 7                  ' PORTA ve  E dijital giriş çıkış olarak ayarla 

TRISA = %111111              ' A portunu giriş olarak tanımla 
TRISB = %11111111            ' B portunu giriş olarak tanımla 
TRISC = %11111111            ' C portunu giriş olarak tanımla 
TRISD = %11111111            ' D portunu giriş olarak tanımla 


Define  LCD_DREG        PORTD    ' LCD bağlantı uçları tanımlaması 
Define  LCD_DBIT        4       ' LCD 4 bit modda portD 7 6 5 4 uçlarına bağlı 
Define  LCD_RSREG       PORTC   ' LCD RS ucu PortC.6 ya bağlı 
Define  LCD_RSBIT       6 
Define  LCD_EREG        PORTC   ' LCD EN ucu PortC.7 ye bağlı 
Define  LCD_EBIT        7 
DEFINE LCD_BITS  4 
DEFINE LCD_LINES 2 

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

CLKPIN   var     PORTB.0        ' Klavye clock pin PORTB.0 olarak tanımla 
DATAPIN  var     PORTB.1       ' Klavye Data pin PORTB.1 olarak tanımla 

'************** Değişken tip tanımlama blokları ********* 
klavyedeg    var     byte 
dvm01 var byte 
dvm02 var byte 
dvm03 var byte 
dvm04 var byte 
dvm05 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] 

'**************** değişken başlangıç değerleri *********** 
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 

gosub ekransil                   ' LCD ekran temizleme alt programına git. 
lcdout $Fe,2,"PC AT Klavye" 
lcdout $Fe,$C0,"Deneme programi" 


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: 
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 ' Eğer shift tuşuna basılmışsa M4 e git 
  
  
 if rx_byte=$F0 then dvm02=1:goto anaprogram ' Eğer klavye tuşu bırakılma kodu olan F0 gelmişse 
 if rx_byte=$E0 then dvm05=1:goto anaprogram ' Eğer klavye tuşu bırakılma kodu olan E0 gelmişse 

 if dvm02=1 then dvm02=0:goto anaprogram     ' Eğer klavye tuşu bırakıldığında tuş tekrarını önler 

    IF rx_byte = $FA THEN                   ' Klavye caps num ve scrlock ledlerini yakmaya hazır  
                                             ' olduğunda FA bilgisini gönderir. 
           GOSUB TX_hazir 
           txdeg=LEDs 
           GOSUB ledcaps 
           rx_byte =0 
     ENDIF 

     IF rx_byte = $12 THEN                   ' Eğer shift tuşuna basılmışsa if bloğu içindekileri yap 
M4: 

           LEDs = LEDs | %00000001          ' scroll lock LED'i 1 ile OR işlemi 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                   ' Eğer shift caps lock basılmışsa if bloğu içindekileri yap 
           LEDs = LEDs ^ %00000100           ' Caps ledini değilleyerek her basışta yanması yada 
           txdeg=$ED                         ' sönmesini sağlar 
           GOSUB TX_hazir 
           GOSUB tx_gonder 
           goto anaprogram 
    ENDIF 


      IF LEDs = 0 THEN                    ' caps = 0, shift = 0 
           harf=1                             ' ( Caps ve Shift basılmamışsa normal durum) 
         gosub kodcoz 
         GOTO anaprogram 
      ENDIF 

      IF LEDs = 1 THEN                    ' caps = 0, shift = 1 
           harf=2                             ' Normal durumda klavyede shift tuşuna basılma işlemi 
          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 işlemi burada gerçekleşir. 
' Senkron iletişimde clock pals ve ardından bilgiler 
' gönderilir. Bu işlem için clock palsin her işlenmesinde 
' datpindeki bilgi bir değişkene aktarılır ve  
' 1 byte lık bilgi elde edilinceye kadar kaydırılır. 
' PC AT klavyelerde bilgi 11 bit ile iletilir. İlk bit start 
' sonra 8 bit bilgi , partiy ( doğrulama biti *) ve stop bitidir. 
' *parity bit hesaplama:Gönderilen 1 ler çift ise parity=1 
' tek ise parity=0 olacak şekilde ayarlanır. 

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önderdiği her clock pals bu kısımda değerlendirilir. 
' Klavye clock hattının 0 olmasını 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 programı ******** 
' Klavyeye bilgi gönderme için ilk önce kontrol biti gönderilmelidir. 
' Bunun için  TX_hazir alt programını 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 giriş tanımlandı 
    endif 
    
     if deg=11 then deg=0:return              ' 11. bite ulaşıldıysa 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 kısımda klavyeye bilginin nasıl gönderileceğini sırasıyla açıklayalım 
' İlk önce data ve clock hattını çıkş olarak tanımla TRISB = 0 
'1)   Clock hattını low yap.(clock=0) yaklaşık olarak 80 mikrosaniye bekle 
'2)   Data pini low yap ( Datapin=0 ) yaklaşık 20 mikrosaniye bekle 
'3)   Clock pin giriş datapin çıkış olarak ayarla TRISB = %00000001 
'4)   Klavye clock hattı low ( 0 ) olana kadar bekle 
'5)   Data hattına göndereceğiniz bilginin ilk bitini yerleştirin 
'6)   Klavye clock hattı high( 1 ) olana kadar bekle 
'7)   Klavye clock hattı low ( 0 ) olana kadar bekle 
'8)   Diğer 7 bit ve parity bit için 5 ve 7 arasındaki işlemleri takip edin. 
'9)   Data pin ve clock pin giriş olarak ayarla TRISB = %00000011 
'10)  Klavye data hattı low ( 0 ) olana kadar bekle 
'11)  Klavye clock hattı 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 sayısı bitsay değişkeninde 
                                               ' saklanır. 
next 
 parity=0 
 if bitsay//2=0 then parity=1                  ' Eğer bitsay çift ise parity=1 
 bitsay=0:parbit=0                             ' Değilse parity=0 olarak hesaplanır. 
  
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 tuşunun kodu , eğer bu tuşa basılmışsa 
  kodcozdeg=" ":satir=satir-1             ' LCD ekran temizlenir. 
        if satir>15 then satir=0          ' 2x16 LCD ekranda 16.satıra gelindiğinde ekran 
        gosub lcdgoster                   ' temizlenir ve satır başı yapılır. 
    return 
endif 

if rx_byte=$0E then kodcozdeg=34:goto gec02 ' OE kodu " karakterini oluşturmak için kullanılır. 
if rx_byte=$54 then kodcozdeg=0:goto gec02  ' Türkçe Ğ 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 Ş 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 / tuşunun aktif yapılması için kullanıldı. 
if dvm05=1 THEN 
       if rx_byte=$4A then dvm05=0:kodcozdeg="/":goto gec02 
endif 
' Bakspace tuş kodu, bu tuşa basıldığında yazılan son karakter silinir. 
if rx_byte=$76 then satir=0:kodcozdeg=" ":gosub ekransil:gosub lcdgoster:return 

' Klavyede kullanılmayacak tuşların ekranda kodlarının görüntülenmesini engeller. 
if rx_byte>126 or rx_byte<20 then return 

' Keypad tuşlarının kullanımı ile ilgili kodları çözmek için kullanılır. 
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 OLUŞTURMA ************** 
turkkar: 
' Türkçe karakterlerin LCD CGRAM hücrelerine yerleştirilmesi 
' LCD CGRAM hücrelerine custom karakter ekleyebilirsiniz. 
' Bunun için LCDOut $FE,64 yazmanız gerekir. 
' 64 LCD CGRAM hüzresinin ( Custom karakter ) yada ram başlangıç 
' adresidir. Max 64 byte yazabilirsiniz. Her karakter 5x8 matrix 
' şeklinde oluştuğuna göre  8 karakter kapasiteye sahiptir. 
' LCD CGRAM hücresine yazma işlemi ilk adres olan $64 ten başlar 
' $7 F ile biter. LCDOUT ile ilk adrese veriler yazılır. 
' Daha sonra adres otomatik artar ve sonuncu bit yazıldıktan sonra 
' LCD CGRAM doldurulmuş olur. LCD CGRAM doldurulan bilgi yada karakterleri 
' ilk adresten itibaren okumak gerekir. Bunun için 
' LCDOUT $FE,2,0 yazıldığında 1. adresteki karakter ekrana yazılır. 
' LCDOUT $FE,2,1 yazıldığında 2. adresteki karakter ekrana yazılır. 

      LCDOut $FE,64 

for deg=0 to 63 
' Türkçe ğ 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 ş 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 ı 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: 
       LCDOut turk[0] 
       LCDOut turk[1] 
       LCDOut turk[2] 
       LCDOut turk[3] 
       LCDOut turk[4] 
       LCDOut turk[5] 
       LCDOut turk[6] 
       LCDOut turk[7] 

return 
'**************************** HARF ÇÖZME ********************** 
Harfbul: 
' Klavyaden alınan tuş bilgilerini çözmek için 
' kullanılan kod karşılık tablosu. 
' Klavyeden çözülen kodların karşılıkları ilgili 
' tablodan alınarak LCD ekranda yazdırılır. 

' caps = 0, shift = 0 ise harf=1  küçük harf modu , nümerik tuşlar normal 
' caps = 0, shift = 1 ise harf=2  büyük harf modu , nümerik tuşlar ikinci karakterde 
' Caps = 1, shift = 0 ise harf=3  büyük harf modu , nümerik tuşlar normal 
' Caps = 1, shift = 1 ise harf=4  küçük harf modu , nümerik tuşlar ikinci karakterde 
' Harf = 5 ise keypad tuşlarındaki kodlar tablodan alınır.            
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 ı 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: 
lcdout $FE,2,"Kod=",hex2 rx_byte," Satir=",dec2 satir 
lcdout $FE,$C0+satir ,kodcozdeg'," " 
return 
'*************** EKRAN TEMİZLEME ALT PROGRAMI ************ 
ekransil: 
lcdout $FE,1 
return 

End