Keypad i Kesme ile Kontrol--Yardım edermisiniz

Başlatan eee1984, 22 Şubat 2008, 09:46:03

eee1984

Alıntı yapılan: "tyildizak"Programda hata görünmüyor gibi, bir an önce denemelisiniz.

:cry:  :cry:  :cry:  :cry: Çalışmıyor Saol emeklerin için :oops:

miral

Mikroelektronika sitesinden indirebileceğiniz mikroc,mikropascal,mikrobasic gibi programlarda hazır kullanılan bazı fonksiyonlar var.Örnek programlarıda help dosyalarında mevcut.Demo olarak indirebiliyorsunuz.Tavsiye ederim.Keypad örneği orda var.
önce selam,sonra kelam...

bymrz

kısaca olayı şu şekilde açıklayalım;

Pici portb4-7 kesmesine kurarsınız...dahili pullup ları da aktif edersiniz.
4*3 keypad kullandıgınızı varsayıyorum ve bu keypadin 4 satır, 3 adet te sutunu bulunmakta...

satırları portb.4,5,6,7 ye bağlıyorsun, sütunları da bortb.1,2,3 ...
satırlar giriş oluyo, sütunlar da çıkış..
Normalde sutunları devamli 0 da tutuyorsunuz,eğer tuşların birisine basılırsa portb.4-7 de durum değişikliği oluyo, yani herhangi biri 0 oluyo ve böylece kesmeye giriyo.

Kesmede de klasik keypad taraması yapıyorsunuz ve hangi tuşa basıldıgını öğreniyorsunuz.daha sağlıklı olması için bir iki defa yapmanız daha iyi olur.

Ve hangi tuşa basıldıgını anladıktan sonra kesmemizden çıkıyoruz, Flaglari temizliyoruz ve ana programa gidiyoruz.Fakat kesmeden çıkmadan önce 100 msn gibi bi süre bekleme yapmanız gerekecek...

Bu kadar  :)  Kolay gelsin

eee1984

Alıntı yapılan: "alone_lover"kısaca olayı şu şekilde açıklayalım;

Pici portb4-7 kesmesine kurarsınız...dahili pullup ları da aktif edersiniz.
4*3 keypad kullandıgınızı varsayıyorum ve bu keypadin 4 satır, 3 adet te sutunu bulunmakta...

satırları portb.4,5,6,7 ye bağlıyorsun, sütunları da bortb.1,2,3 ...
satırlar giriş oluyo, sütunlar da çıkış..
Normalde sutunları devamli 0 da tutuyorsunuz,eğer tuşların birisine basılırsa portb.4-7 de durum değişikliği oluyo, yani herhangi biri 0 oluyo ve böylece kesmeye giriyo.

Kesmede de klasik keypad taraması yapıyorsunuz ve hangi tuşa basıldıgını öğreniyorsunuz.daha sağlıklı olması için bir iki defa yapmanız daha iyi olur.

Ve hangi tuşa basıldıgını anladıktan sonra kesmemizden çıkıyoruz, Flaglari temizliyoruz ve ana programa gidiyoruz.Fakat kesmeden çıkmadan önce 100 msn gibi bi süre bekleme yapmanız gerekecek...

Bu kadar  :)  Kolay gelsin





Saol kardes dediğin gb yaptım ama calısmadı acaba kodları inceleyebilirmisin yani hata nerde anlamadım da  :oops:

Alıntı YapDEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı

ON INTERRUPT GoTo KESME      'kesme oluşursa KESME adlı etikete git.
OPTION_REG.7=0 'pullup lar açıldı
INTCON=%10001000     'Kesmeler aktif ve RB CHANGE kesmesi aktif

PORTB=0:TRISB=%11110000 ; rb4-7 sutun=giriş rb0-3=satır çıkış
portc=0:TRISC=0

Tus var byte
RBIF var INTCON.0 ; flag kesme flagi

Portc.6=1
PORTC.5=1

Main :
;Ana program bulogu burda yer alacak
Goto main

DISABLE     'yeniden kesme oluşması önleniyor  
KESME:
PAUSE 500           '500 ms BEKLEME YAP

lcdout $FE,1
LCDOUT $FE,$80,"ExE"
PAUSE 500
LCDOUT $FE,$C0,"2008"
PAUSE 500


lcdout $FE,1
pause 500

PORTB=%11111110 ;1.satır
;ve ardından dikeyleri kontrol edecegiz.
IF PORTB =%11101110 then TUS=7
IF PORTB =%11011110 then TUS=8
IF PORTB =%10111110 then TUS=9
IF PORTB =%01111110 then TUS=10 '/"

PORTB=%11111101;2.satır
IF PORTB=%11101101 then TUS=4
IF PORTB=%11011101 then TUS=5
IF PORTB=%10111101 then TUS=6
IF PORTB=%01111101 then TUS=11 'x tusu"

PORTB=%11111011;3.satır
IF PORTB=%11101011 then TUS=1
IF PORTB=%11011011 then TUS=2
IF PORTB=%10111011 then TUS=3
IF PORTB=%01111011 then TUS=12 '- tusu"

PORTB=%11110111;4.satır
IF PORTB=%11100111 then TUS=13 'ON/C tusu
IF PORTB=%11010111 then TUS=0
IF PORTB=%10110111 then TUS=14 '= TUSU
IF PORTB=%01110111 then TUS=15 '+ tusu"

PORTB=%11111111

IF TUS<10 THEN  LCDOUT $fe,2,"TUS=", Dec Tus ,"   "
IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," /    "
IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X   "
IF TUS=12 THEN LCDOUT $FE,2,"TUS="," -    "
IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C   "
IF TUS=14 THEN LCDOUT $FE,2,"TUS="," =   "
IF TUS=15 THEN LCDOUT $FE,2,"TUS="," +  "

PAUSE 100

      RESUME   'geldiğin yere dön.
      ENABLE         'kesmeler yeniden aktif.
End   

Yukardaki program kesme alt programıyla kullanılmadıgınıda yani surekli tarama yoluyla calıstırıldıgında calısıyor ama kesme ile calısmıyor :cry:

ahmet2004

DEFINE OSC 4

'******LCD TANIMLAMALARI****** 
DEFINE LCD_DREG PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI 
DEFINE LCD_DBIT 0 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??! 
DEFINE LCD_EREG PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI 
DEFINE LCD_EBIT 5 'LCD ENABLE BITI HANGI PORTA BAGLI ?? 
DEFINE LCD_RSREG PORTC 'LCD RS BACAGI HANGI PORTA BAGLI 
DEFINE LCD_RSBIT 6 'LCD RS BACAGI HANGI BITE BAGLI ??? 
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI 
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR satır sayısı 

ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. 
OPTION_REG.7=0 'pullup lar açıldı 
INTCON=%10001000 'Kesmeler aktif ve RB CHANGE kesmesi aktif 

PORTB=0:TRISB=%11110000 ; rb4-7 sutun=giriş rb0-3=satır çıkış 
portc=0:TRISC=0 

Tus var byte 
RBIF var INTCON.0 ; flag kesme flagi 

Main: 
 IF TUS<10 THEN LCDOUT $fe,2,"TUS=", Dec Tus ," " 
 IF TUS=10 THEN LCDOUT $FE,2,"TUS="," / " 
 IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X " 
 IF TUS=12 THEN LCDOUT $FE,2,"TUS="," - " 
 IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C " 
 IF TUS=14 THEN LCDOUT $FE,2,"TUS="," = " 
 IF TUS=15 THEN LCDOUT $FE,2,"TUS="," + "
 pause 100 
Goto main 

DISABLE 'yeniden kesme oluşması önleniyor 
KESME: 
PORTB=%11111110 ;1.satır 
;ve ardından dikeyleri kontrol edecegiz. 
IF PORTB =%11101110 then TUS=7 
IF PORTB =%11011110 then TUS=8 
IF PORTB =%10111110 then TUS=9 
IF PORTB =%01111110 then TUS=10 '/" 
pause 5
PORTB=%11111101;2.satır 
IF PORTB=%11101101 then TUS=4 
IF PORTB=%11011101 then TUS=5 
IF PORTB=%10111101 then TUS=6 
IF PORTB=%01111101 then TUS=11 'x tusu" 
pause 5
PORTB=%11111011;3.satır 
IF PORTB=%11101011 then TUS=1 
IF PORTB=%11011011 then TUS=2 
IF PORTB=%10111011 then TUS=3 
IF PORTB=%01111011 then TUS=12 '- tusu" 
pause 5
PORTB=%11110111;4.satır 
IF PORTB=%11100111 then TUS=13 'ON/C tusu 
IF PORTB=%11010111 then TUS=0 
IF PORTB=%10110111 then TUS=14 '= TUSU 
IF PORTB=%01110111 then TUS=15 '+ tusu" 
pause 5
PORTB=%11111111 
RESUME 'geldiğin yere dön. 
ENABLE 'kesmeler yeniden aktif. 
End

atila

74c922 entegresiyle daha az pin kullanarakta yapabilirsin.linkte şema ve prgramını verdim.74c922 butona basıldığında 'DA'(data available)pinini logic 1 yapıyor.'DA' pinini 'RB0' pinine bağlayıp harici kesmeyi yükselen kenar tetiklemesiyle aktif edebilirsin.

http://rapidshare.com/files/94282830/13_5.rar.html

bymrz

kardeşim programını tam olarak incelemedim ama gördüğüm kadarıyla unuttuğun bişey var...
Kesmeden çıkmada PORTB4-7 kesme bayrağıı temizlememişsin..

Onu ekle çalışır sanırım, olmazsa tekrar kontrol ederiz hallederiz sorununu...

msn:  securityman2000@hotmail.com

eee1984

Çok teşekkürler arkadaslar ilginiz için  :oops:  Sorunu beraber çözdük  :D

bymrz


eee1984

Alıntı yapılan: "alone_lover"sorun neymiş peki tam olarak?

Sanırım sorun surda imiş ben keypad i kesme de taratıp aynı kesme programında lcdout la çıkış almaya calısmıstım ama calısan programda lcdprogramı ana proogramda yer alıyor  :roll:  ;)