' Keypad_3x4.bas
' 3*4-as Numerikus Keypad alkalmazása Mega64 - 128-ason.
' 2009 09. Kapu48
' Keypad Bekötése
' Tüskék Bits: | 6 | 5 | 4 | 3 | 2 | 1 | 0 | NC | Felülről nézve
' Oszlopok Bits:| 1 | 2 | 3 | Balról > jobbra
' Sorok Bits: | 4 | 3 | 2 | 1 | | Lentről > felfele
' Billentyű Bits:
'Oszlopok: | 1 | 2 | 3 |
'-----------|---|---|---|
'Sorok:------------------
' 4 | 1 | 2 | 3 |
' -------------------
' 3 | 4 | 5 | 6 |
' -------------------
' 2 | 7 | 8 | 9 |
' -------------------
' 1 | * | 0 | # |
' -------------------
'
'$regfile = "m48def.dat"
$crystal = 8000000
'$crystal = 14745600 'Sebesseg
$regfile = "M64def.dat" 'Chip
$baud = 19200
$hwstack = 38
$swstack = 12
$framesize = 40
'Const True = 1
'Const False = 0
'specify which port must be used
'all 8 pins of the port are used
Config Kbd = Portd 'A PORTB-t már a SPI használja nálam
'dimension a variable that receives the value of the pressed key
Dim Bil As Byte , Ujbil As Byte ', Keypress As Bit
Dim Key As String * 1
Ddrd = &B01110000 'oszlopok columns (PortD.6, 5, 4) set as output, sorok rows (PortD.3, 2, 1, 0) as input
Portd = &B10001111 'bemenetekre felhúzó ellenállás. enable internal pullups on the row inputs (PortD.3, 2, 1, 0)
'Enél a Procinál sajnos nincsen Pinchange. Ezért a megszakítást nem használjuk!?
'Config Int0 = Falling
'On Int0 Keypad_isr : Enable Int0
'Enable Interrupts
'Keypress = False
'KeyPad olvasása, és konvertálás ASCII értékre.
Do
Bil = 16 'Bil = 16 Billentyűnek alap érték adás, nagyobb mint bármelyik billentyű érték.
Bil = Getkbd()
'look in the help file on how to connect the matrix keyboard
'when you simulate the getkbd() it is important that you press/click the keyboard button
' before running the getkbd() line !!!
If Bil < 16 Then 'Ha volt billentyű lenyomás?
Select Case Bil 'Billentyű érték konvertálása ASCII értékre. (Karakterre)
Case 0 : Key = "#"
Case 1 : Key = "9"
Case 2 : Key = "6"
Case 3 : Key = "3"
Case 4 : Key = "0"
Case 5 : Key = "8"
Case 6 : Key = "5"
Case 7 : Key = "2"
Case 8 : Key = "*"
Case 9 : Key = "7"
Case 10 : Key = "4"
Case 11 : Key = "1"
End Select
Print "Bil = " ; Bin(bil) ; " " ; Bil ; " Key = " ; Key
Ujbil = Bil
Do
Ujbil = Getkbd() 'Ismétlések kivédése!
Loop Until Bil <> Ujbil 'Megvárja, hogy elenged a billentyűt.
Waitms 20 'Elengedéskor volt néha 1 Prel!
End If
'when no key is pressed 16 will be returned
'use the Lookup() function to translate the value to another one
' this because the returned value does not match the number on the keyboad
Loop
'(
Do
' While Keypress = False : Wend 'do something while no keypress interrupt
Print Bil 'there must have been a keypress interrupt
Keypress = False 'reset the flag
Loop
')
End
'(
Keypad_isr:
Keypress = True
B = Getkbd()
Return
')
' Keypad_3x4_Multi.bas
' 3*4-as Numerikus Keypad alkalmazása Mega64 - 128-ason.
'Egyszerre több billentyű megnyomásának kiértékelése.
'*****************************************************
'FIGYELEM 1 SORBAN EGYSZERRE TÖBB BILLENTYŰ NEM NYOMHATÓ!!!
'Mert zárlatot okoz két kimenet között
'Ezért ajánlott az oszlop pinekhez berakni 1-1 470ohm-os ellenállást.
'Oszloponként bármenyi bil. nyomható 1*re.
'*****************************************************
' 2009 09. Kapu48
' Keypad Bekötése
' Tüskék Bits: | 6 | 5 | 4 | 3 | 2 | 1 | 0 | NC | Felülről nézve
' Oszlopok Bits:| 1 | 2 | 3 | Balról > jobbra
' Sorok Bits: | 4 | 3 | 2 | 1 | | Lentről > felfele
' Billentyű Bits:
'Oszlopok: | 1 | 2 | 3 |
'-----------|---|---|---|
'Sorok:------------------
' 4 | 1 | 2 | 3 |
' -------------------
' 3 | 4 | 5 | 6 |
' -------------------
' 2 | 7 | 8 | 9 |
' -------------------
' 1 | * | 0 | # |
' -------------------
'
'$regfile = "m48def.dat"
$crystal = 8000000
'$crystal = 14745600 'Sebesség
$regfile = "M64def.dat" 'Chip
$baud = 19200
$hwstack = 38
$swstack = 12
$framesize = 40
'Config Kbd = Portd 'A PORTB-t már a SPI használja nálam
'dimension a variable that receives the value of the pressed key
Dim Bil(3) As Byte , Ujbil(3) As Byte , Num As Byte ', Keypress As Bit
Dim Key(3) As String * 8
Ddrd = &B01110000 'oszlopok columns (PortD.6, 5, 4) set as output, sorok rows (PortD.3, 2, 1, 0) as input
Portd = &B10001111 'bemenetekre felhúzó ellenállás. enable internal pullups on the row inputs (PortD.3, 2, 1, 0)
'Enél a Procinál sajnos nincsen Pinchange. Ezért a megszakítást nem használhatjuk!?
'KeyPad olvasása, és konvertálás ASCII értékre.
Do
Portd = &B10111111 'első oszlop lekérdezése
Ujbil(1) = Pind
Portd = &B11011111 'második oszlop lekérdezése
Ujbil(2) = Pind
Portd = &B11101111 'harmadik oszlop lekérdezése
Ujbil(3) = Pind
Portd = &B10001111 'Oszlopok lekapcsolása
'Felesleges bits törlése.
Ujbil(1) = Ujbil(1) And &B00001111
Ujbil(2) = Ujbil(2) And &B00001111
Ujbil(3) = Ujbil(3) And &B00001111
'Ha van állapot változás, kiértékeljük..
If Bil(1) <> Ujbil(1) Or Bil(2) <> Ujbil(2) Or Bil(3) <> Ujbil(3) Then
Bil(1) = Ujbil(1)
Bil(2) = Ujbil(2)
Bil(3) = Ujbil(3)
'String tömb törlése
Key(1) = ""
Key(2) = ""
Key(3) = ""
Num = 0
'Kiértékelés: 1. oszlop
If Bil(1) < 15 Then 'Ha volt az oszlopban gombnyomás
If Bil(1).0 = 0 Then
Key(1) = " *"
Num = Num + 1
End If
If Bil(1).1 = 0 Then
Key(1) = Key(1) + " 7"
Num = Num + 1
End If
If Bil(1).2 = 0 Then
Key(1) = Key(1) + " 4"
Num = Num + 1
End If
If Bil(1).3 = 0 Then
Key(1) = Key(1) + " 1"
Num = Num + 1
End If
End If
' 2. Oszlop
If Bil(2) < 15 Then 'Ha volt az oszlopban gombnyomás
If Bil(2).0 = 0 Then
Key(2) = " 0"
Num = Num + 1
End If
If Bil(2).1 = 0 Then
Key(2) = Key(2) + " 8"
Num = Num + 1
End If
If Bil(2).2 = 0 Then
Key(2) = Key(2) + " 5"
Num = Num + 1
End If
If Bil(2).3 = 0 Then
Key(2) = Key(2) + " 2"
Num = Num + 1
End If
End If
' 3. oszlop
If Bil(3) < 15 Then 'Ha volt az oszlopban gombnyomás
If Bil(3).0 = 0 Then
Key(3) = " #"
Num = Num + 1
End If
If Bil(3).1 = 0 Then
Key(3) = Key(3) + " 9"
Num = Num + 1
End If
If Bil(3).2 = 0 Then
Key(3) = Key(3) + " 6"
Num = Num + 1
End If
If Bil(3).3 = 0 Then
Key(3) = Key(3) + " 3"
Num = Num + 1
End If
End If
Print "Megnyomott billentyuk: " ; Num
Print " 1. oszlop: " ;
If Bil(1) < 10 Then Print " " ;
Print Bil(1) ; " " ; Key(1)
Print " 2. oszlop: " ;
If Bil(2) < 10 Then Print " " ;
Print Bil(2) ; " " ; Key(2)
Print " 3. oszlop: " ;
If Bil(3) < 10 Then Print " " ;
Print Bil(3) ; " " ; Key(3)
End If
Loop
End
Nemrég csináltam egy keypad-os zárat ismerősömnek (tiny2313-al), de csak egy hagyományos 3x4-es billt tudtam venni hozzá. Védelme: IP40, szóval kellett neki esővédő ernyőt is felszerelni.
Hol lehet venni kissé komolyabb, értsd vízálló nyomógombos billentyűzetet venni, ami nem 20-ezerbe kerül (lásd Conrad-os rablótanya)
Fólia bill. is jó lenne...Ennek most járok utána, van magyar cég ami egyedileg is csinál fóliabillentyűzet, akár előlappal egybeépítve is. Nemsokára kérek tőlük árajánlatot.
kapu48:
a versenyre tartogatok többek közt egy pinkódos zár vezérlést (teljes legyártásig kiveitelezve dokumentálva), de úgylátom a programomban már nemsok újdoságot fogok tudni kínálni :D:D:D
(félre ne értsd, de szerintem is az a jó, ha minél többen publikálunk ilyet, mert a többiek annál könnyebben megtanulják. És természetesen az én megoldásom eléggé eltér a tiedtől...szóval csak viccelek)
Ezek nem egész alkalmazások. Csak rutinok egy feladat megoldására.
Inkább azt szemlélteti, hogy többféle képen is meglehet oldani ugyanazt a dolgot.
Ezért kíváncsi vagyok a Te megoldásodra is! Az már a sorban a 4. variáció lesz.
Igaz még tovább akarom fejleszteni a témát. Következő cél úgy nevezet telefon tasztatúra lenne. Ezzel a 12 billentyűvel be kellene tudni adni a számokat, + az egész magyar ABC-t + az írásjeleket is!
Ui.: Amiket ide kiteszek nyugodtan felhasználhatóak bármely kisebb – nagyobb alkalmazásokban! Csak örülni fogok, ha viszontlátom, és használhatóak voltak!
Ó az enyém az igazán favágó módszerrel kezeli a bill-t...vagyishogy a Bascom beépített eljárásával olvastatom ki. az visszaad egy értéket amit megfeleltettem a gomboknak és kész.
Nálam a cél szentesíti az eszközt, és ha (JÓL) megy, akkor utána nemigen szoktam agyalni hogy lehetne másképp/faszábban megoldani. Persze ha bugzana akkor csiszolgatnám.
Így is a Tiny2313 2048 byte-os flash helyén 2042 byte a program, szóval mikor már belefért és jó volt akkor úgy hagytam.
Majd ha csinálom a következőt akkor "felülvizsgálom" a programot és alakítok rajta szerintem.
Egyszerű és nagyszerűnek mondanám a megoldásod!
Ha 1 soros diódán 0.6V feszültség esik, akkor 4*0.6= 2.4V. Ez a tápfesz 1/2-e nyugalmi állapotban mindég rajta van a bemeneten. És ezt húzza el az aktuális ellenállásosztó és dióda sor.
OFF: Nagy kár, hogy ha az ábra idővel esetleg lekerül a szerverről, akkor értelmezhetetlen lesz a hozzászólásod!
Róbert igazán beemelhetné az oldalra valahogyan!