Odświeżam temat i przedstawiam co zrobiłem .
Wykrywanie stanu i wystawianie stanu logicznego nie chciało działać kiedy było zrealizowane na opóźnieniach.
Do głowy wpadł mi pomysł kolegi pikczu by zrobić coś w przerwaniu TIMERA.
Tak wiec odczytywanie stanu jest w podprogramie przerwania a w pętli sterowanie ledem.
Do zmiennej sw zapisujemy poklei czy ma być zapalony dany led poprzez
Link
Po wciśnięciu switcha niestety jest takie zjawisko,led zapala się i gaśnie z szybkością nadana przez przerwanie,i nieraz nie załapuje wciśnięcia.Trzeba wyczuć

Kolejne w ciśniecie odwraca stan leda.
Możę ktoś to ulepszy?
$regfile = "m8def.dat"
$crystal = 1000000
Enable Interrupts
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
On Timer0 Przerwanie
Dim Sw As Word
Dim Kodkl As Byte
Do
Ddrb = &B00011111 'jako wyjscia
Ddrc = &B00011111
Portb.0 = Not Sw.1 'podaje odwrocony stan bitu na port zeby na poczatku wszyskei byly w zero
Portb.1 = Not Sw.2
Portb.2 = Not Sw.3
Portb.3 = Not Sw.4
Portb.4 = Not Sw.5
Portb.5 = Not Sw.6
Portc.0 = Not Sw.7
Portc.1 = Not Sw.8
Portc.2 = Not Sw.9
Portc.3 = Not Sw.10
Portc.4 = Not Sw.11
Portc.5 = Not Sw.12
Loop
Przerwanie:
Ddrb = &B00000000'jako wejscie
Ddrc = &B00000000
Portb = &B00011111'pull up
Portc = &B00011111
If Pinb.0 = 0 Then Toggle Sw.1 : Kodkl = 1 'jak nacisniety to odwroc stan sw,zmienna kod kl zwraca wartosc wlaczonego switcha
If Pinb.1 = 0 Then Toggle Sw.2 : Kodkl = 2
If Pinb.2 = 0 Then Toggle Sw.3 : Kodkl = 3
If Pinb.3 = 0 Then Toggle Sw.4 : Kodkl = 4
If Pinb.4 = 0 Then Toggle Sw.5 : Kodkl = 5
If Pinb.5 = 0 Then Toggle Sw.6 : Kodkl = 6
If Pinc.0 = 0 Then Toggle Sw.7 : Kodkl = 7
If Pinc.1 = 0 Then Toggle Sw.8 : Kodkl = 8
If Pinc.2 = 0 Then Toggle Sw.9 : Kodkl = 9
If Pinc.3 = 0 Then Toggle Sw.10 : Kodkl = 10
If Pinc.4 = 0 Then Toggle Sw.11 : Kodkl = 11
If Pinc.5 = 0 Then Toggle Sw.12 : Kodkl = 12
Return
Ta czesc jest dla potomnych,teraz ja zadam pytanie.
Moj kod jest taki:
$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Enable Interrupts
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
On Timer0 Przerwanie
On Urxc Przerwanie_rx
Enable Urxc
Dim Sw As Word
Dim Kodkl As Byte
Dim Brx As Byte
Do
Ddrb = &B00011111
Ddrc = &B00011111
Portb.0 = Not Sw.1
Portb.1 = Not Sw.2
Portb.2 = Not Sw.3
Portb.3 = Not Sw.4
Portb.4 = Not Sw.5
Portb.5 = Not Sw.6
Portc.0 = Not Sw.7
Portc.1 = Not Sw.8
Portc.2 = Not Sw.9
Portc.3 = Not Sw.10
Portc.4 = Not Sw.11
Portc.5 = Not Sw.12
Select Case Brx
Case 1 : Sw.1 = 1
Case 2 : Sw.2 = 1
Case 3 : Sw.3 = 1
Case 4 : Sw.4 = 1
Case 5 : Sw.5 = 1
Case 6 : Sw.6 = 1
Case 7 : Sw.7 = 1
Case 8 : Sw.8 = 1
Case 9 : Sw.9 = 1
Case 10 : Sw.10 = 1
Case 11 : Sw.11 = 1
Case 12 : Sw.12 = 1
End Select
If Kodkl > 0 Then Printbin Kodkl
Loop
Przerwanie:
Ddrb = &B00000000
Ddrc = &B00000000
Portb = &B00011111
Portc = &B00011111
If Pinb.0 = 0 Then Toggle Sw.1 : Kodkl = 1
If Pinb.1 = 0 Then Toggle Sw.2 : Kodkl = 2
If Pinb.2 = 0 Then Toggle Sw.3 : Kodkl = 3
If Pinb.3 = 0 Then Toggle Sw.4 : Kodkl = 4
If Pinb.4 = 0 Then Toggle Sw.5 : Kodkl = 5
If Pinb.5 = 0 Then Toggle Sw.6 : Kodkl = 6
If Pinc.0 = 0 Then Toggle Sw.7 : Kodkl = 7
If Pinc.1 = 0 Then Toggle Sw.8 : Kodkl = 8
If Pinc.2 = 0 Then Toggle Sw.9 : Kodkl = 9
If Pinc.3 = 0 Then Toggle Sw.10 : Kodkl = 10
If Pinc.4 = 0 Then Toggle Sw.11 : Kodkl = 11
If Pinc.5 = 0 Then Toggle Sw.12 : Kodkl = 12
Return
Przerwanie_rx:
Brx = Udr
If Brx = Kodkl Then Kodkl = 0
Return
Nie wiem jak poprawnie napisać ta komunikacje.
Mamy taki układ,dwie klawiatury które wysyłają kod klawisza po rs232 na jednej linii i odbierają na drugiej.
Jest centrala obsługująca te klawiatury jeśli odbierze znak to przekazuje go na wyjście(narazie) po to żeby jak w klawiaturze jeden zostaje wciśnięty klawisz to żeby w drugiej ten sam się podświetlił.
Czyli
klawiatura wysyła 1
centrala dostaje 1
centrala wysyła 1
klawiatura 2 dostaje ,podświetla przycisk 1
klawiatura 1 dostaje 1,i zmienna kodkl przyjmuje 0 żeby już nie nadawała
Nie działa
Nie działa pogrubione,i proszę o nakierowanie jak poprawnie nadać znak i go odebrać.
Z góry dziekuje.