Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

klavyeden veri okuma

Başlatan picman, 03 Ekim 2007, 21:31:32

picman

arkadaşlar herkese iyi günler .  ben klavyeden veri okumaya çalışıyorum ama bi türlü yapamadım daha doğrusu klavyeyi aktif duruma hiç getiremedim . klavyenin beslemne ucuna gerilim uygulandığında ilk önce ışıkları yenıyor sonra sönüyor . daha sonra hiç bir işlem yapmıyor . mesela num lock tuşuna bastığımda tuş kilidi ledi yanması lazım yanmıyor . ama pc ye takınca düzgün çalışıyor . benim sorum şu . klavyeyi çalışır duruma getirmek için enerji uygulamanın dışında başka bir işlem yapmak mı gerekiyor. birde ben ilk defa klavye uygulaması yapıcam. pbp deki shiftin komutu ile klavyeden veri okumabilirmiyim . yada başka türlü nasıl veri alabilirim . bu konuda bilgisi olan arkadaşlardan yardım bekliyorum saygılarımı sunarım herkese çalışmalarında başarılar dilerim .
Bilgi paylaştıkça artar..

conqueror_tr

ORG     H'0004'         ; KESME ADRESİ
              GOTO    KLYOKU          ; KESME ALT PROGRAMI
      
;------------------------------------------------------------------------------------
KLYOKU  ; Klavyeden gönderilen seri bilgiyi, paralel veriye dönüştürür.              
;------------------------------------------------------------------------------------
               CLRF   PORTD
            BCF     INTCON,7        ; Tüm kesme işlemleri geçersiz.
               BCF     INTCON,4        ; PORTB'den gelecek kesmeler geçersiz.
               BCF     INTCON,1        ; PORTB kesme bayrağını sıfırla.

               MOVWF   W_TEMP          ; W'yi W_TEMP'e gönder.
               SWAPF   STATUS,W        ; Alt ve üst 4-bit'i takas et.
               MOVWF   STATUS_TEMP     ; STATUS'ı STATUS_TEMP'e gönder.

START           CLRF    VERI            ; VERI'yi, yeni bilgi için temizle.
               CALL    KLY_KONTROL     ; Bit1 : START bit, değerlendirilmeyecek.
               MOVLW   D'8'            ; W'ye 8 yükle.
               MOVWF   BIT_N           ; BIT_N register'a gönder.
BIT_KAYDIR      RRF     VERI,F          ; VERI içindeki bilgiyi, 1-bit sağa ötele.
               CALL    KLY_KONTROL     ; CLOCK ve DATA sinyallerini değerlendir.
               IORWF   VERI,F          ; W ve VERI'ye OR işlevi uygula.
               IORLW   B'01111111'     ; W ve B'01111111'ye OR işlevi uygula.
               ANDWF   VERI,F          ; Maskele.
               DECFSZ  BIT_N,F         ; BIT_N-1, 0 mı?
               GOTO    BIT_KAYDIR      ; Hayır.
               CALL    KLY_KONTROL     ; Bit10 : EŞLİK bit'i, değerlendirilmeyecek.
               CALL    KLY_KONTROL     ; Bit11 : STOP bit'i, değerlendirilmeyecek.
                
                 MOVLW   .200
            CALL   bekle
            BSF      DURUM,0
KLYCIK          SWAPF   STATUS_TEMP,W   ; STATUS_TEMP'i W'ye yaz.
               MOVWF   STATUS          ; STATUS'ı ilk konumuna getir.
               SWAPF   W_TEMP,F        ; W_TEMP'e swap işlemi uygula.
               SWAPF   W_TEMP,W        ; W'yi ilk konumuna getir.
               BCF     INTCON,1        ; PORTB kesme bayrağını sıfırla.
               BSF     INTCON,7        ; Yeni kesmeler kabul edilir.
               BSF     INTCON,4        ; PORTB'den gelecek kesmeler geçerli.                                                ; Alt programından çık.
            RETFIE
;------------------------------------------------------------------------------------
KLY_KONTROL     BCF   STATUS,5
            BTFSC   PORTB,0         ; CLOCK 0 mı?
               GOTO    $ - 1           ; Hayır, 0 olmasını bekle.
               BTFSS   PORTB,0         ; CLOCK, 1 mi?
               GOTO    $ - 1           ; Hayır, 1 olmasını bekle.
               BTFSS   PORTB,1         ; DATA 1 mi?
               RETLW   B'00000000'     ; Hayır, 0 ile dön.
               RETLW   B'10000000'     ; Evet,  1 ile dön.

;------------------------------------------------------------------------------------
KLYTIMER       ; Bu alt program, besleme gerilimin uygulanmasıyla birlikte,        
               ; klavyeden gelen tanıtım bilgilerinin bitmesi için birkaç          
               ; saniyelik bir gecikme sağlar.                                    
;------------------------------------------------------------------------------------
               MOVLW   D'5'            ; W'ye 5 yükle.
               MOVWF   TEMP            ; TEMP'e gönder.
               
BEKLEKL         CALL    TIMER_HIGH      ; Gecikme alt programını çağır.
               DECFSZ  TEMP,F          ; TEMP-1, 0 mı?
               GOTO    BEKLEKL         ; Hayır, TEMP'i eksiltmeye devam et.
               RETURN                  ; Alt programdan çık.
;------------------------------------------------------------------------------------
TIMER_HIGH     ; Bu alt program yaklaşık 0.2 saniyelik bir gecikme sağlar.          
;------------------------------------------------------------------------------------
               
               MOVLW   D'255'          ; W'ye 255 yaz.
               MOVWF   TIMER_H1        ; TIMER_H1 register'a gönder.
               
DONGU1          MOVLW   D'255'          ; W'ye 255 yaz.
               MOVWF   TIMER_H2        ; TIMER_H2 register'a gönder.
               
DONGU2          DECFSZ  TIMER_H2,F      ; TIMER_H2-1, 0 mı?
               GOTO    DONGU2          ; Hayır.
               DECFSZ  TIMER_H1,F      ; TIMER_H1-1, 0 mı?
               GOTO    DONGU1          ; Hayır.
               RETURN                  ; Evet, alt programdan çık.



bu programla daha önce kayan yazı yapmıştım çalışıyordu.
portb0 interupt yapcaksın ve klavyenin clk ucuna  bagla klavyenin datasınıda portb1 'e bagla interupt ayarlarıda
               BSF    STATUS,5
   BSF   INTCON,7   
   BSF   INTCON,4   
   BCF   INTCON,1   
   BCF   OPTION_REG,6
   BCF    STATUS,5
şeklinde yap
not: kalvyeye ilk 3-4 sn ye tuşlarına basma  çünkü klavye tanımlama bilgileri gönderir bu sürede bunu program başlangıcında ayarlayıp 3-4 sn klavyeye bakmamasını saglarsan hiç bir sorunun kalmaz. ayrıca kalvyeden ascıı kodu gelmiyor farklı kodlar geliryor bunuda dikkate al.
daha fazla ayrıntılı anlatmak isterdim ama 2 yıl önce yapılmış bir projeydi bazı yerleri unutmuş olabilirim.

yasinbirol

selam

numlock caps lock gibi tuslar sen tusa basarsın pc bu tusa basıldıgını gördugu zaman klavyeye ledi yak sinyali gönderir.klavye senkron haberleşme ile calışır yani start bit 8 data bit parity bit ve stop bit seklinde calışir arz ederim.
Yaşasin Cortex-M3 :D

picman

ilgin için teşekkür ederim ama ben projemi pbp ile geliştiriyorum asm dilini de kullandım ama onunla program yazmak bi hayli uğraştırıyo . ama verdiğin kodları iyice incelersem onu uygun bi şekilde pbp kodlarına dönüştürebilirim sanırım . bide klavyeden okunan kodla ascıı değil demişsiniz nedir peki. hangi koda göre karşılaştırma yappıcam ben. haa bide ben klavyeye enerji verdiğimde birkaç saniye bekledikten sonra klavye çalışır hale gliyor yani değilmi . ledeerin yanmasını pc den gelen veri sağlıyo anladığım kadarıyla. aslında bu formda daha önce paylaştığım kayan yazı uygulamsı . uzun bi süreden sonra devreye bi de kalavye ekliyeyim dedim. proje tamamiyle bittiğinde yine formda paylaşırım sizinla . tekrar teşekkürler ...
Bilgi paylaştıkça artar..

XX_CİHAN_XX

Sitede pbp içinde örnek kod var.Hatta mhk hocamın çok iyi bir uygulaması var kılavye hakkındada tonla bilgi var biraz araştıralım lütfen.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.


picman

arkadaşlar aşağıdaki kodu incelermisiniz . bu kodlar ile klavyeden veriyi düzgün okuyorum . ama rb0 interrupt ile bunu yapmaya kalktığımda neden olmuyor. verı yanlış alınıyor . bunun sebebi nedir arkadsaşlar .
interrup ile yaptığımda klavyenin data ucunu  rb0 a bağlıyorum . ama veri hatalı alınıyor . bu programı daha önce formda sizinle paylaştığım kayan yazı devresi için yaptım . ama bi türlü olmuyor . kesme olmadan yaptığımda bu seferde aşağıda verdiğim haliyle düzgün çalışan program bu seferde sutun rarama işlemi yüzünden düzgün çalışmıyor ...
kodlar aşağıda verilmiştir .
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [set under view...options]                        *
'*  Notice  : Copyright (c) 2007 [set under view...options]     *
'*          : All Rights Reserved                               *
'*  Date    : 06.10.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :klavyeden veri okuma denemesi                      *
'*          :                                                   *
'****************************************************************
ADCON1=7;ÇIKIŞLAR DİGİTAL
DEFINE OSC 8; 8MHZ KRİSTAL KULLANILIYOR

SCAN_DATA VAR BYTE   ; KLAVYEDEN OKUNAN SCAN_DATA  
KDATA VAR PORTC.0    ; DATA UCU 
KCLK VAR PORTC.1     ; CLK UCU
I VAR BYTE            ;DATA OKUMA FOR DONGÜSÜ DEĞİŞKENİ 
ASCII_DATA VAR BYTE   ;ASCII YE DONUŞTÜRÜLEN DATA
CAPS_LOCK VAR BIT     ; KAPS LOCK TUŞU 
SCAN_TEMP VAR BYTE    ;SCAN TABLOSUNDAN ALINAN DEĞER 
SCAN_INDEX VAR BYTE   ;SCAN TABLOSU INDEX DEĞİŞKENİ 
ASCII_INDEX VAR BYTE  ;ASCII TABLOSU INDEX DEĞİŞKENİ 
ALTGR VAR BIT
SHIFT VAR BIT
          

TRISB=0 ; PORTB ÇIKIŞ
PORTB=0 ; PORBYİ SIFIRLA 
TRISC=$FF ; PORTC ÇIKIŞ
TRISD=0
PORTD=0                                        
I=0 ; I DEGERİ SIFIRLANIYOR
LOW CAPS_LOCK ; CAPS_LOCK KAPALI
SCAN_INDEX = 0
ASCII_INDEX = 0
ALTGR=0
SHIFT=0

PAUSE 5000; 5SANİYE KLAVYE İÇİN BEKLE 

MAIN_PROGRAM
WHILE KCLK=1  : WEND    ;TUŞA BASILDIYSA
    GOSUB KLAVYE_OKU    ;KLAVYE OKU ALT PROGRAMINA GIT 
GOTO MAIN_PROGRAM

KLAVYE_OKU:
    WHILE KCLK=0 : WEND           ;1. CLOCK SİNYALİ ALINDI (START BİTİ)     
    WHILE KCLK=1 : WEND           ;START BITI ATLANIR 
 OZEL_OKU:   
FOR I= 0 TO 10 
   SELECT CASE I
   CASE 0: SCAN_DATA.0 = KDATA         ;2. CLOCK  DATA0
   CASE 1: SCAN_DATA.1 = KDATA         ;3. CLOCK  DATA1
   CASE 2: SCAN_DATA.2 = KDATA         ;4. CLOCK  DATA2
   CASE 3: SCAN_DATA.3 = KDATA         ;5. CLOCK  DATA3
   CASE 4: SCAN_DATA.4 = KDATA         ;6. CLOCK  DATA4
   CASE 5: SCAN_DATA.5 = KDATA         ;7. CLOCK  DATA5
   CASE 6: SCAN_DATA.6 = KDATA         ;8. CLOCK  DATA6
   CASE 7: SCAN_DATA.7 = KDATA         ;9. CLOCK  DATA7
   CASE 8:  WHILE KCLK=0 : WEND        ;10. CLOCK PERITY BITI             
   CASE 9:  WHILE KCLK=0 : WEND        ;11. CLOCK STOP BITI              
   END SELECT 
      WHILE KCLK=0 : WEND
      WHILE KCLK=1 : WEND              ;KCLK HER 0 OLDUĞUNDA VERI OKUMAYA GIT
 NEXT I : I=0 
 ;BASILAN OZEL TUŞLAR TESPIT EDİLİR
   SELECT CASE SCAN_DATA  
   CASE $E0: GOTO OZEL_OKU             ;OZEL TUŞ
   CASE $58: TOGGLE CAPS_LOCK          ;CAPS_LOCK TESRLE
   CASE $11: ALTGR=1
   CASE $66: GOSUB BACK_SPACE          ;BİR KARAKTER SİL
   CASE $71: GOSUB DELETE          ;YAZILAN HERŞEYI SIL 
   CASE $5A: GOSUB ENTER          ;(ENTER TUŞU) KLAVYEDEN YAZMA İŞLEMİ TAMAM NORMAL YAZIYI KAYDIRMAYA BAŞLA
   END SELECT
   IF ( SCAN_DATA=$12 OR SCAN_DATA=$59 ) THEN SHIFT=1  ;SHIFT TUŞUNA BASILDI
      PORTB=SCAN_DATA                 ; KLAVYE DATASINI GOSTER   
      PAUSE 10         
 ;------------------------------------------------------------------   
;SCAN_TABLOSU
   FOR SCAN_INDEX = 0 TO 62
     LOOKUP SCAN_INDEX,[$1C,$32,$21,$49,$23,$24,$2B,34,_  ;ABCÇDEFG
                        $54,$33,$43,$52,$3B,$42,$4B,$3A,_ ;ĞHIİJKLM
                        $31,$44,$41,$4D,$2D,$1B,$4C,$2C,_ ;NOÖPRSŞT
                        $3C,$5B,$2A,$35,$1A,$15,$22,$1D,_ ;UÜVYZQXW
                        $45,$16,$1E,$26,$25,$2E,$36,$3D,_ ;01234567
                        $3E,$46,$70,$69,$72,$7A,$6B,$73,_ ;8 9 K0 K1 K2 K3 K4 K5
                        $74,$6C,$75,$7D,$4E,$55,$5D,$4A,_ ;K6 K7 K8 K9 * - , . 
                        $61,$0E,$79,$7B,$7C,$4A,$29],SCAN_TEMP  ;< " + - * / (BOŞLUK)
                   IF ( SCAN_DATA = SCAN_TEMP ) THEN   ASCII_INDEX = SCAN_INDEX    
             NEXT SCAN_INDEX  ; TARAMAYA DEVAM ET   
                           
;ASCII_TABLOSU:
     LOOKUP ASCII_INDEX,[65,66,67,199,68,69,70,71,_  ;ABCÇDEFG
                         208,72,73,221,74,75,76,77,_ ;ĞHIİJKLM
                         78,79,214,80,82,83,222,84,_ ;NOÖPRSŞT
                         85,220,86,89,90,81,88,87,_  ;UÜVYZQXW    
                         48,49,50,51,52,53,54,55,_   ;01234567
                         56,57,48,49,50,51,52,53,_   ;89012345
                         54,55,56,57,42,45,44,46,_   ;6789*-,.
                         60,34,43,45,42,47,32],ASCII_DATA  ;<"+-*/ (BOŞLUK)
                    PORTD=ASCII_DATA   ; ASCII KARAKTERINI GÖSTER   
RETURN                
 
    
BACK_SPACE:


     RETURN


DELETE:

     RETURN
     
     
ENTER:

     RETURN 
                          
 END; 
 
 ;PROGRAMI HAZIRLAYAN : YUSUF YİĞİT
 
yorumlarınızı ve önerilerinizi bekliyorum bekliyorum..
Bilgi paylaştıkça artar..

picman

arkadaşlar bana yardım edebilecek kimse yokmu . yukarıda vardiğim programı rb0 interrupt ile yapabilecek arkadaş var mı acaba benim denemelerimde olmadı birde siz deneseniz şunu . ama yukardaki program bu hali ile çalışıyor . rb0 interrupt ile yapıldığında veriyi düzgün almıyor .  yardımlarınızı bekliyorum arkadaşlar
Bilgi paylaştıkça artar..