picbasic ile tuş takımı

Başlatan herkan, 02 Şubat 2003, 01:28:07

herkan

picbasic ile tuş takımlı devreler hazırlamak istiyorum.Hep hazır hex dosyaları var ,tuştakımının mantığı nedir?
herkan

aslan_korhan

' PicBasic Pro 2.40 or later, LAB-XT Experimenter Board, PIC16F877-20

' Program to display key label on LCD

' EPIC Programmer should not be connected to the ICSP header
' when running this code.  It may interfere with the operation
' of the keypad.  



' Define LOADER_USED to allow use of the boot loader.
' This will not affect normal program operation.
DEFINE	LOADER_USED	1

' Define for 20MHz crystal
DEFINE  OSC  20

' Define LCD connections
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTE
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTE
DEFINE  LCD_EBIT        1


' Define program variables
col     VAR     BYTE            ' Keypad column
row     VAR     BYTE            ' Keypad row
key     VAR     BYTE            ' Key value
disp_key	VAR	BYTE			' Key ASCII value


OPTION_REG.7 = 0        ' Enable PORTB pullups (16F877)
'INTCON2.7 = 0			' Enable PORTB pullups (18F452)

ADCON1 = 7              ' Make PORTA and PORTE digital

Pause 150               ' Wait for LCD to start

LCDOut $fe, 1, "Press any key"  ' Display sign on message

loop:   GoSub getkey            ' Get a key from the keypad
		IF key != $FF Then		' Check to see if a key was pressed
	        LCDOut $fe, 1, disp_key     ' Display ASCII key label
    	EndIF
        GoTo loop               ' Do it forever


' Subroutine to get a key from keypad
getkey:
	' Check for keypress
	For row = 0 TO 3        ' Loop for 4 rows in keypad
        PORTB = 0       ' All output pins low
        TRISB = ~(DCD row)  ' Set one row pin to output
        '@ NOP				' Fudge for 18F452
        col = PORTB >> 4	' Read column pins

        IF col != $0F Then	' Check if key is pressed
        	HPwm 1,127,7500	' Begin speaker tick
        	GoTo gotkey 	' If any keydown, exit
        EndIF
	Next row				' Repeat for the next row
	
	key = $FF				' No keys down, set key to $FF
	Return          		' Return to main loop
	
gotkey: 						' Change row and column to key number 0 - 15
	Pause 15                ' Debounce
	HPwm 1,0,0				' End speaker tick
	
	' Wait for all keys up
	PORTB = 0               ' All output pins low
	TRISB = $F0             ' Least significant 4 pins out, top 4 pins in
	IF ((PORTB >> 4) != $0F) Then gotkey	' If any keys down, loop
	key = (row * 4) + (NCD (col^$0F)) - 1	' Combine row and column into numeric value
	
	
	' Translate key to display label:
	' 1  2  3  A
	' 4  5  6  B
	' 7  8  9  C
	' *  0  #  D
	LookUp key,["123A456B789C*0#D"],disp_key
	
	
Return			' Return to main loop


        End
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

muser53

16F877 
@  device WDT_OFF &  pwrt_on & protect_on & cpd_on 
PCON=%00000000
define osc 20

Define  LCD_DREG       PORTD   ' LCD bağlantılarını tanımla
Define  LCD_DBIT	    4
Define  LCD_RSREG      PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG       PORTE
Define  LCD_EBIT      	1

        ADCON1 = 7 		' PORTA ve  E dijital giriş çıkış olarak ayarla
        Low PORTE.2		' LCD R/W low = yazma modu
        Pause 300   	' LCD başlamak için bekle

option_reg=0        'PORTB Pulluplar etkin.
                    '(Pullup=Portb' nin tüm uçlarını +5V a çekmektir.lojik 1)

TRISB=%11110000     'PORTB 7654 giriş 3210 çıkış olarak ayarlandı
TRISC=%00000000     'PORTC Tüm uçlar çıkış olarak ayarlandı

portb=0:portc=0      'PORTB ve PORTC yi 0 yap

lcdout $FE,1        'LCD ekranı sil
lcdout $FE,2,"LCD-KEYPAD uyg."

' ***************DEĞİŞKEN Tanımlama Blokları ****************
SW1  var byte
SW2  var byte
SW3  var byte
SW4  var byte
SW5  var byte
SW6  var byte
SW7  var byte
SW8  var byte
SW9  var byte
SW10 var byte
SW11 var byte
SW12 var byte
SW13 var byte
SW14 var byte
SW15 var byte
SW16 var byte

gosub degisken0
'**********************  Ana Program ************************
anadongu:
'*******  1.satır taraması ******
portb=%11111110
' portb.0 a 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.
if portb.4=0 then SW1=1
if portb.5=0 then SW2=1
if portb.6=0 then SW3=1

 
'*******  2.satır taraması ******
portb=%11111101
' portb.1 e 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW4=1
if portb.5=0 then SW5=1
if portb.6=0 then SW6=1


'*******  3.satır taraması ******
portb=%11111011
' portb.2 ye 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW7=1
if portb.5=0 then SW8=1
if portb.6=0 then SW9=1


'*******  4.satır taraması ******
portb=%11110111
' portb.3 e 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW10=1
if portb.5=0 then SW11=1
if portb.6=0 then SW12=1

gosub lcdgoster
gosub degisken0

goto anadongu
'****************** Değişken ilk değerleri ****************
degisken0:
SW1=0:SW2=0:SW3=0:SW4=0:SW5=0:SW6=0:SW7=0:SW8=0:SW9=0
SW10=0:SW11=0:SW12=0

return

'******* Buton değerlerini LCD ekranda gösterim ************
lcdgoster:
if SW1=1 then lcdout $FE,$C0,"1 nolu buton...":portc.0=1   'portc.0 portuna bağlı ledi yakar
if SW2=1 then lcdout $FE,$C0,"2 nolu buton...":portc.1=1   'portc.1 portuna bağlı ledi yakar
if SW3=1 then lcdout $FE,$C0,"3 nolu buton...":portc.2=1   'portc.2 portuna bağlı ledi yakar
if SW4=1 then lcdout $FE,$C0,"4 nolu buton...":portc.3=1   'portc.3 portuna bağlı ledi yakar
if SW5=1 then lcdout $FE,$C0,"5 nolu buton...":portc.4=1   'portc.4 portuna bağlı ledi yakar
if SW6=1 then lcdout $FE,$C0,"6 nolu buton...":portc.5=1   'portc.5 portuna bağlı ledi yakar
if SW7=1 then lcdout $FE,$C0,"7 nolu buton...":portc.6=1   'portc.6 portuna bağlı ledi yakar
if SW8=1 then lcdout $FE,$C0,"8 nolu buton...":portc.7=1   'portc.7 portuna bağlı ledi yakar
if SW9=1 then lcdout $FE,$C0,"9 nolu buton...":portc.0=0   'portc.0 portuna bağlı ledi söndürür
if SW10=1 then lcdout $FE,$C0,"10 nolu buton...":portc.1=0 'portc.1 portuna bağlı ledi söndürür
if SW11=1 then lcdout $FE,$C0,"11 nolu buton...":portc.2=0 'portc.2 portuna bağlı ledi söndürür
if SW12=1 then lcdout $FE,$C0,"12 nolu buton...":portc.3=0 'portc.3 portuna bağlı ledi söndürür

return

end