Pic ile 2 işlemi bir anda gerçekleştiremiyorum.

Başlatan transistor, 22 Şubat 2019, 02:07:55

transistor

Herkese merhaba, 4*3 keypad kullanarak dotmatrix'de harf yada rakam gösterme çabasındayım. Aslında yapmak istediğim şey telefon tuş takımı gibi çalışacak olması mesela her 2 tuşuna ard arda basınca harfler A,B,C harflerini ve 2 rakamını sırası ile göstereceğim ve kaydedeceğim. Ancak 74hc595 leri sürünce keypad'ı okuyamıyorum. Keypad'ı okuyunca 595'leri süremiyorum. gosub ekran satırını kaldırınca tuş takımı okuyorum. Örnek olarak tus1'e kod satırı ekledim. Çalışsaydı devam edecektim ancak problemin nerede olduğu konusunda fikir ve görüşlerinizi duymak istiyorum. Teşekkürler.


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 22.02.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
asm   
       __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H   
       __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L       
       __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H     
       __CONFIG _CONFIG3H, _CCP2MX_OFF_3H 
       __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L   
       __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L   
       __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H   
       __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L   
       __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H   
       __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L   
       __CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm

'p18f452 denetleyici
DEFINE OSC 20
ADCON1=7

TRISA=%0110000  : PORTA=0
TRISB=%00111000 : PORTB=0
TRISC=%11111100 : PORTC=0
TRISD=0         : PORTD=0
TRISE=%001      : PORTE=0

'BUTONLAR, 74HC595 PİNLERİ VE 4*3 KEYPAD PİNLERİ

SYMBOL COLUM1=PORTA.4 'SÜTUNLAR
SYMBOL COLUM2=PORTA.5
SYMBOL COLUM3=PORTE.0
symbol SH_CP=PORTB.0
symbol DS=PORTB.1
symbol ST_CP=PORTB.2
SYMBOL ART=PORTC.6
SYMBOL AZL=PORTC.7

SUT1        VAR BYTE[8]
SUT2        VAR BYTE[8]
SUT3        VAR BYTE[8]
SUT4        VAR BYTE[8]
SUT5        VAR BYTE[8]
SUT6        VAR BYTE[8]
SUT7        VAR BYTE[8]
SUT8        VAR BYTE[8]

RAKAM       VAR BYTE
I1          VAR BYTE
YERI        VAR BYTE
VERI        VAR BYTE
HARF        VAR BYTE
HARF_REG    VAR BYTE
X1          VAR BYTE : X1=0

BASLA:

PORTA=%110111
IF COLUM1=0 THEN        'TUŞ 1'E BASILDI MI?
WHILE COLUM1=0 : WEND
PAUSE 50   
LOOKUP X1,[46,65,72],HARF_REG 'TUS1 E 3 KEZ BASILINCA SIRAYA GÖRE . ,A ,H HARFLERİNİ HARF_REG İÇİNE ATA.
X1=X1+1
IF X1=3 THEN X1=0
ENDIF

IF COLUM2=0 THEN        'TUŞ 2'E BASILDI MI?
WHILE COLUM2=0 : WEND
...
ENDIF

IF COLUM3=0 THEN        'TUŞ 3'E BASILDI MI?
WHILE COLUM3=0 : WEND
...
ENDIF

'********************
PORTA=%111011
IF COLUM1=0 THEN        'TUŞ 4'E BASILDI MI?
WHILE COLUM1=0 : WEND
...
ENDIF

IF COLUM2=0 THEN        'TUŞ 5'E BASILDI MI?
WHILE COLUM2=0 : WEND
...
ENDIF

IF COLUM3=0 THEN        'TUŞ 6'E BASILDI MI?
WHILE COLUM3=0 : WEND
LOW PORTE.2
ENDIF

'********************
PORTA=%111101
IF COLUM1=0 THEN        'TUŞ 7'E BASILDI MI?
WHILE COLUM1=0 : WEND
...
ENDIF

IF COLUM2=0 THEN        'TUŞ 8'E BASILDI MI?
WHILE COLUM2=0 : WEND
...
ENDIF

IF COLUM3=0 THEN        'TUŞ 9'E BASILDI MI?
WHILE COLUM3=0 : WEND
...
ENDIF

'********************
PORTA=%111110
IF COLUM1=0 THEN        'TUŞ *'A BASILDI MI?
WHILE COLUM1=0 : WEND
...
ENDIF

IF COLUM2=0 THEN        'TUŞ 0'A BASILDI MI?
WHILE COLUM2=0 : WEND
...
ENDIF

IF COLUM3=0 THEN        'TUŞ #'YE BASILDI MI?
WHILE COLUM3=0 : WEND
...
ENDIF

HARF=HARF_REG DIG 0
GOSUB ARA
TEMP1=YERI
FOR I1=0 to 7
YERI=TEMP1+I1
GOSUB DATAAL
SUT1[I1]=VERI
NEXT

GOSUB EKRAN

GOTO BASLA
'*******************************************************************************
EKRAN:             
FOR I1=0 TO 7

RAKAM=SUT8[I1]     
GOSUB AKTAR

RAKAM=SUT7[I1]
GOSUB AKTAR

RAKAM=SUT6[I1]
GOSUB AKTAR

RAKAM=SUT5[I1]
GOSUB AKTAR

RAKAM=SUT4[I1]
GOSUB AKTAR

RAKAM=SUT3[I1]
GOSUB AKTAR

RAKAM=SUT2[I1]
GOSUB AKTAR

RAKAM=SUT1[I1]
GOSUB AKTAR

HIGH ST_CP : PAUSEUS 2 : LOW ST_CP

       PORTD.BIT0[I1]=1
       PAUSEus 1600
       PORTD.BIT0[I1]=0

NEXT I1
RETURN
'*******************************************************************************
AKTAR:
SHIFTOUT DS,SH_CP,1,[RAKAM]
RETURN
'*******************************************************************************
ARA:
select case HARF
case " ":YERI=0 : return
case ".":YERI=8 : return
CASE "/":YERI=16: RETURN
case 0:YERI=24  : return
case 1:YERI=32  : return
case 2:YERI=40  : return
case 3:YERI=48  : return
case 4:YERI=56  : return
case 5:YERI=64  : return
case 6:YERI=72  : return
case 7:YERI=80  : return
case 8:YERI=88  : return
case 9:YERI=96  : return
case ":":YERI=104:return
case "S":YERI=112:return
case "D":YERI=120:return
case "G":YERI=128:return
case "A":YERI=136:return
case "Y":YERI=144:return
case "H":YERI=152:return
end select
RETURN
'*******************************************************************************
DATAAL:
lookup YERI,[$00,$00,$00,$00,$00,$00,$00,$00_     ;boşluk
             ,$00,$00,$00,$00,$00,$18,$18,$00_     ;nokta
             ,$06,$0C,$18,$30,$60,$C0,$80,$00_     ;/
             ,$7C,$FE,$E6,$F6,$DE,$CE,$FE,$7C_     ;0
             ,$F0,$F0,$60,$60,$60,$E0,$E0,$60_     ;1
             ,$FE,$FE,$C0,$7C,$3E,$86,$FE,$7C_     ;2   
             ,$7C,$FE,$C6,$1C,$1C,$C6,$FE,$7C_     ;3
             ,$0C,$0C,$FE,$FE,$CC,$6C,$3C,$1C_     ;4
             ,$7C,$FE,$CE,$0E,$FC,$E0,$FE,$FE_     ;5
             ,$78,$FC,$CC,$CC,$F8,$70,$38,$1C_     ;6
             ,$30,$30,$30,$18,$0C,$06,$FE,$FE_     ;7
             ,$78,$FC,$CC,$FC,$78,$CC,$FC,$78_     ;8
             ,$E0,$70,$38,$7C,$CC,$CC,$FC,$78_     ;9
             ,$00,$18,$18,$00,$00,$18,$18,$00_     ;:
             ,$7C,$FE,$CE,$1C,$70,$E6,$FE,$7C_     ;S
             ,$FC,$7E,$66,$66,$66,$66,$7E,$FC_     ;D
             ,$7C,$FE,$C6,$DE,$DC,$C0,$FE,$7C_     ;G
             ,$C6,$C6,$FE,$FE,$C6,$C6,$7C,$38_     ;A
             ,$38,$18,$18,$3C,$7E,$66,$66,$E6_     ;Y
             ,$E6,$66,$66,$7E,$7E,$66,$66,$E6],VERI;H
RETURN

END

ete

Şema olmayınca insan hacımsal düşünemiyor. Ama anladığım kadarı ile dotmatrix bir display sürüyorsun ve bunu bekleye bekleye yapıyorsun. Özellikle tuş kontrollerine koyduğun While columnx=0:wend komut satırı, programı kilitler ve displayinde sekteye uğrar. Çözüm kesme kullanmaktan geçer. Dotmatrix sürekli yenilenmesi gereken bir ekran tipidir. Sürekli yenilenme işlemide ancak kesme ile yapılır. Timer0 kesmesini yaklaşık 1 ms lik sürelerde kesme oluşturacak şekilde ayarla. Kesme içinde ise ekranda gösterim işini yap. 2 dijit gösteriyor isen bir kesmede birini diğerinde öteki digiti gösterecek şekilde işlem yap.
Ama ekran kodların yalnızca 1 dijit gösterecek şekilde düzenlenmiş.
Tuş takımında tuşa basıldıktan sonra önce ilgli işlem yapılır sonunda tuşun basılı olup olmadığı kontrol edilir.
Bunuda tek tek sütun bazında değil komple sütünlar için 1 komut verecek şekilde yapmak kod tasarrufu sağlar.
Mesela senin örnekte Sutun=(PORTA & %00110000)>>4 şeklinde bir komut kullansan ve ardından WHILE SUTUN<3:WEND
desen iki sütunu birden kontrol etmiş olacaksın. Kısaca sütunlardan birine basılı tutulması halinde değer 3 den küçük olacaktır değilse her ikisi HIGH olacağı için değer 3 olacaktır. Böylece bir sürü kod dan tasarruf etmiş olursun.

Ete

Powered by EzPortal