<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=12&amp;t=2243&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-08-27T22:06:20+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=12&amp;t=2243&amp;mode</id>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-08-27T22:06:20+01:00</updated>
<published>2013-08-27T22:06:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47269#p47269</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47269#p47269"/>
<title type="html"><![CDATA[Re: BASCOM  ---  NAJPOPULARNIEJSZE PYTANIA i ODPOWIEDZI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47269#p47269"><![CDATA[
Nie tylko tobie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Ale wbrew pozorom da się- tylko trzeba mocno sobie postanowić żeby w czasie nauki używać jednego języka- jak ja- na bascoma nie patrzę już parę miesięcy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 27 sie 2013, o 22:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2013-08-26T18:38:02+01:00</updated>
<published>2013-08-26T18:38:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47139#p47139</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47139#p47139"/>
<title type="html"><![CDATA[Re: BASCOM  ---  NAJPOPULARNIEJSZE PYTANIA i ODPOWIEDZI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=47139#p47139"><![CDATA[
<div class="quotetitle">k_mirek napisał(a):</div><div class="quotecontent"><br />Tez kiedyś zaczynałem karierę w Bascom. No nie powiem szlo nawet dobrze. Po czasie stwierdziłem że czas na przesiadkę na C. Oj i tee moje walki z tym językiem. Książek przeróżnych chyba z 5, stron www setki i stwierdziłem ze wracam do punktu wyjścia czyli Bascom. Na szczęście w moje ręce wpadła niebieska książeczka wydawnictwa ATNEL (nie mylić z inną niebieską książką na temat j. C którą również posiadam) Pierwsze wrażenie ojj jakieś volatile,  struktury, wskaźniki a do tego jeszcze własne biblioteki obsługi różnych modułów ??? omg! I teraz cenna uwaga dla czytających ten topic. Bajki piszę w ostatnim zdaniu. Wszystko świetnie wyjaśnione.W ogóle to teraz się zastanawiam dlaczego nie od razu C. A no dla tego że nie było odpowiedniej literatury czyli tego niebieskiego booka. Zachęcam wszystkich bascomowiczów na taką przesiadkę. Naprawdę warto.<br /></div><br /><br /><br />I tu pojawia się problem bo Mi osobiście ciężko jest się przesiąść z bascoma na C. Nawet kupiłem sobie &quot;niebieską&quot; książkę przeczytałem połowę i mam mętlik w głowie...<br />Żałuje że od razu nie wziąłem się za C na bank było by mi teraz łatwiej<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br /><div class="quotetitle">k_mirek napisał(a):</div><div class="quotecontent"><br />Tez kiedyś zaczynałem karierę w Bascom. No nie powiem szlo nawet dobrze. Po czasie stwierdziłem że czas na przesiadkę na C. Oj i tee moje walki z tym językiem. Książek przeróżnych chyba z 5, stron www setki i stwierdziłem ze wracam do punktu wyjścia czyli Bascom. Na szczęście w moje ręce wpadła niebieska książeczka wydawnictwa ATNEL (nie mylić z inną niebieską książką na temat j. C którą również posiadam) Pierwsze wrażenie ojj jakieś volatile,  struktury, wskaźniki a do tego jeszcze własne biblioteki obsługi różnych modułów ??? omg! I teraz cenna uwaga dla czytających ten topic. Bajki piszę w ostatnim zdaniu. Wszystko świetnie wyjaśnione.W ogóle to teraz się zastanawiam dlaczego nie od razu C. A no dla tego że nie było odpowiedniej literatury czyli tego niebieskiego booka. Zachęcam wszystkich bascomowiczów na taką przesiadkę. Naprawdę warto.<br /></div><br /><br /><br />I tu pojawia się problem bo Mi osobiście ciężko jest się przesiąść z bascoma na C. Nawet kupiłem sobie &quot;niebieską&quot; książkę przeczytałem połowę i mam mętlik w głowie...<br />Żałuje że od razu nie wziąłem się za C na bank było by mi teraz łatwiej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 26 sie 2013, o 18:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[k_mirek]]></name></author>
<updated>2013-02-02T15:33:11+01:00</updated>
<published>2013-02-02T15:33:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26609#p26609</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26609#p26609"/>
<title type="html"><![CDATA[Re: BASCOM  ---  NAJPOPULARNIEJSZE PYTANIA i ODPOWIEDZI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26609#p26609"><![CDATA[
Tez kiedyś zaczynałem karierę w Bascom. No nie powiem szlo nawet dobrze. Po czasie stwierdziłem że czas na przesiadkę na C. Oj i tee moje walki z tym językiem. Książek przeróżnych chyba z 5, stron www setki i stwierdziłem ze wracam do punktu wyjścia czyli Bascom. Na szczęście w moje ręce wpadła niebieska książeczka wydawnictwa ATNEL (nie mylić z inną niebieską książką na temat j. C którą również posiadam) Pierwsze wrażenie ojj jakieś volatile,  struktury, wskaźniki a do tego jeszcze własne biblioteki obsługi różnych modułów ??? omg! I teraz cenna uwaga dla czytających ten topic. Bajki piszę w ostatnim zdaniu. Wszystko świetnie wyjaśnione.W ogóle to teraz się zastanawiam dlaczego nie od razu C. A no dla tego że nie było odpowiedniej literatury czyli tego niebieskiego booka. Zachęcam wszystkich bascomowiczów na taką przesiadkę. Naprawdę warto.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=499">k_mirek</a> — 2 lut 2013, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-02-02T15:10:17+01:00</updated>
<published>2013-02-02T15:10:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26604#p26604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26604#p26604"/>
<title type="html"><![CDATA[Re: BASCOM  ---  NAJPOPULARNIEJSZE PYTANIA i ODPOWIEDZI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26604#p26604"><![CDATA[
O! jaki expresowy poradnik do Bascoma <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> SZOK! .... Sun ty to masz fajne pomysły.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lut 2013, o 15:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-02-02T14:51:59+01:00</updated>
<published>2013-02-02T14:51:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26602#p26602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26602#p26602"/>
<title type="html"><![CDATA[BASCOM  ---  NAJPOPULARNIEJSZE PYTANIA i ODPOWIEDZI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2243&amp;p=26602#p26602"><![CDATA[
Postanowiłem jakoś uporządkować to wszystko dla potencjalnych Bascomowców<br />sam już się zresztą gubię w bascomie bo dawno go nie używałem -- siła ewolucji i został wyparty przez ARDUINO<br />do szybkiego sprawdzania koncepcji . Nie mniej warto to i owo sobie przypomnieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jedziemy:<br /><br />Z wielu dziwnych zapytań wybór padła na 16 .... oto one <br /><br />1. Jak deklarować zmienne?<br />2. Jak deklarować stałe?<br />3. Jak deklarować tablice?<br />4. Jak zrobić pętlę?<br />5. Jak deklarować i wywoływać podprogramy?<br />6. Jak sterować alfanumerycznym wyświetlaczem LCD?<br />7. Jak pisać warunki?<br />8. Jak zmienić nazwę zmiennych, stałych itp?<br />9. Jak wykonać pętle opóźnienia czasowego?<br />10. Jak obsługiwać przerwania?<br />11. Jak obsługiwać szynę I2C?<br />12. Jak wyeliminować drgania styków?<br />13. Co to jest wyświetlacz multipleksowy i jak nim sterować z poziomu Bascom'a?<br />14. Jak obsłużyć klawiaturę od PC'ta?<br />15. Jak zamienić liczbę na ciąg 01?<br />16. Jak obsłużyć impulsator?<br /><br /><br />------------------- ODPOWIEDZI ------------------------------<br /><br /><strong>1. Jak deklarować zmienne?</strong><br /><br />DIM nazwa_zmiennej1 AS BIT - zakres zmiennej 0..1<br />DIM nazwa_zmiennej2 AS BYTE - zakres zmiennej 0..255<br />DIM nazwa_zmiennej3 AS WORD - zakres zmiennej<br />DIM nazwa_zmiennej4 AS INTEGER - zakres zmiennej -32767..32768<br />DIM nazwa_zmiennej5*10 AS STRING - zmienna tekstowa o długości w tym przypadku 10<br /><br /><strong>2. Jak deklarować stałe?</strong><br /><br />CONST nazwa_stałej1 = &amp;HF<br />CONST nazwa_stałej2 = -1000<br />CONST nazwa_stałej3 = 1.1<br />CONST nazwa_stałej4 = &quot;tekst&quot;<br /><br /><strong>3. Jak deklarować tablice?</strong><br /><br />DIM nazwa_tablicy(ilość) AS rodzaj_zmiennej<br />nazwa_tablicy(5) = 146 'zapianie do 5 elementu tablicy liczby 146<br /><br /><strong>4. Jak zrobić pętlę?</strong><br /><br />DO 'początek pętli<br />... 'operacje i polecenia wykonywane w pętli<br />LOOP 'koniec pętli i powrót do początku<br /><br /><strong>5. Jak deklarować i wywoływać podprogramy?</strong><br /><br />Na początku programu wpisujemy deklaracje o podprogramie:<br /><br />DECLARE SUB nazwa_podprogramu(zmienna AS typ_zmiennej)<br /><br />A następnie w programie piszemy, co konkretnie podprogram ma wykonywać. Robimy to w następujący sposób:<br /><br />SUB nazwa_podprogramu(zmienna AS typ_zmiennej) 'początek podprogramu<br />... 'operacje i polecenia wykonywane w pętli<br />END SUB 'koniec podprogramu<br /><br />Aby wywołać podprogram piszemy:<br /><br />CALL nazwa_podprogramu(zmienna)<br /><br />Oczywiście, jeśli w podprogramie nie będziemy wykonywać jakichkolwiek operacji na zmiennej podawanej w nawiasie, nie deklarujemy tego na początku, a przy wywoływaniu podprogramu pomijamy zmienną.<br /><br /><strong>6. Jak sterować alfanumerycznym wyświetlaczem LCD?</strong><br /><br />W Bascomie sterowanie wyświetlaczy alfanumerycznych LCD jest banalnie proste. Wystarczy tylko poinformować kompilator, do których linii portu będzie on podłączony (OPTIONS/COMPILER/LCD) i zadeklarować na początku programu rodzaj podłączanego wyświetlacza:<br /><br />CONFIG LCD=ilość_znaków*ilość_linii<br /><br />gdzie ilość znaków i ilośćlinii może być następująca: 40*4, 40*2, 16*1, 16*1a, 16*2, 16*4, 16*4, 20*2, 20*4,40*4a<br />W przypadku problemów ze sterowaniem 16*1 lub 40*4 należy zamienić je na 16*1a lub 40*4a<br />Bascom pozwala na wykonywanie następujących operacji na wyświetlaczu:<br /><br />LCD &quot;TEKST&quot; 'wyświetlenie napisu TEKST<br />LCD zmienna 'wyświetlenie zmiennej<br />LCD &quot;tekst&quot;; zmienna 'wyświetlenie w jednej linii napisu TEKST i wartości zmiennej<br />CLS 'kasowanie wyświetlacz<br />CURSOR ON/OFF, BLINK/NOBLINK 'operacje na kursorze<br />gdzie ON/OFF - włącz lub wyłącz kursor, BLINK/NOBLINK - włącz lub wyłącz miganie kursora, polecenia ta mogą działać oddzielnie, czyli możemy np. napisać:<br />CURSOR BLINK<br />LOCATE linia,pozycja_kursora 'ustawienie kursora na linii i pozycji<br />SHIFTCURSOR LEFT/RIGHT 'przesuwanie kursora w lewo lub wprawo<br />SHIFTLCD LEFT/RIGHT 'przesuwanie tekstu w lewo lub w prawo<br />DISPLAY ON/OFF 'włączenie lub wyłączenie wyświetlacza<br />UPPERLINE 'przejście kursora do wyższej linii<br />LOWERLINE 'przejście kursora do niższej linii<br />THIRDLINE 'przejście kursora do trzeciej linii<br />FOURTHLINE 'przejście kursora do czwartej linii<br />DEFLCDCHAR numer_banku , 31 , 17 , 17 , 17 , 17 , 17 , 31 , 0 ' deklarowanie własnego znaku np. polskich liter, gdzie numer_banku: 0..7. Aby stworzyć dowolny znak należy wybrać z menu TOOLS/LCD DESIGNER, a następnie narysować żądany znak. Bascom automatycznie wstawi polecenie DEFLCDCHAR do programu. My tylko musimy podać numer banku.<br /><br /><strong>7. Jak pisać warunki?</strong><br /><br />IF zdarzenie THEN<br />... 'to co ma się zdarzyć jeśli warunek będzie spełniony<br />ELSE<br />... 'to co ma się zdarzyć jeśli warunek nie będzie spełniony<br />END IF 'koniec warunku<br />Zdarzenie może mieć następującą postać:<br />zmienna = 0 'jeśli zmienna będzie równa zero<br />P1.0 = 1 'jeśli bit 0 portu P1 będzie równy jeden<br />PRZYKŁAD:<br />'Chcemy zliczać sekundy w pętli<br />DIM sekundy AS BYTE 'deklaracja zmiennej sekundy<br />DO 'początek pętli<br />INCR sekundy 'zwiększenie o 1 zmiennej sekundy<br />IF sekundy = 60 THEN 'jeśli sekundy = 60 to<br />sekundy = 0 'wyzeruj sekundy<br />END IF 'koniec warunku przepełnienia<br />LOOP 'zapętlenie - skok do DO<br />Pewnie się zastanawiasz co trzeba zrobić, aby zliczać jeszcze minuty, godziny, czy nawet dni. Odpowiedź jest bardzo prosta. W warunku przepełnienia (if sekundy =60 then) wpisujemy polecenia od INCR do END IF odwołując się do minut. Następnie w warunku przepełnienia minut wpisujemy to samo odnośnie godzin itd. <br /><br /><strong>8. Jak zmienić nazwę zmiennych, stałych itp</strong>?<br /><br />nowa_nazwa ALIAS stara_nazwa<br />To polecenie jest bardzo przydatne, gdyż możemy nazwać np. bity portów w zależności od funkcji jakie pełnią np. chcemy za pomocą P3.7 sterować buzzerem możemy więc zmienić nazwę P3.7 na BUZZER, a nastepnie odwoływać się do nowej nazwy. Wygląda to tak:<br />BUZZER ALIAS P3.7<br />RESET BUZZER 'wyzerowanie BUZZER, a właściwie P3.7<br />WAIT 1 'poczekaj 1 sekundę<br />SET BUZZER 'ustawienie 1 na P3.7<br /><br /><strong>9. Jak wykonać pętle opóźnienia czasowego?</strong><br /><br />DELAY 'opóźnienie ok. 100us<br />WAITMS milisekundy 'opóżnienie w milisekundach 0..255<br />WAIT sekundy 'opóźnienie w sekundach<br /><br /><strong>10. Jak obsługiwać przerwania?</strong><br /><br />ENABLE INT0 'zezwolenie na przerwanie z INT0, zamiast INT0 możemy wpisać: INT1, SERIAL, TIMER0, TIMER1,TIMER2, a nawet INT3, INT4, INT5, INT6, INT7, INT8 , CAN. Zależy to oczywiście od używanego mikroprocesora.<br />ON INT0 podprogram 'poinformowanie kompilatora, który podprogram ma być wywoływany przy przerwaniu<br />ENABLE INTERRUPTS 'odblokowanie układu przerwań<br />DIASBLE INT0 'wyłączenie przerwania<br /><br /><strong>11. Jak obsługiwać szynę I2C?</strong><br /><br />Na początku musisz zadeklarować, które bity portu będą pełnić funkcje linii danych SDA i linii zegarowej SCL.<br />CONFIG SDA = P1.0<br />CONFIG SCL = P1.1<br />Potem w programie:<br />I2CSTART 'warunek startu szyny<br />I2CWBYTE zmienna, ACK/NOACK 'zapis zmiennej z potwierdzeniem (ACK) lub bez<br />I2CRBYTE zmienna, ACK/NOACK 'odczyt zmiennej z potwierdzeniem (ACK) lub bez<br />I2CSTOP 'warunek stopu szyny<br /><br /><strong>12. Jak wyeliminować drgania styków?</strong><br /><br />Drgania styków można wyeliminować w dwojaki sposób:<br />- sprzętowo poprzez dodanie kondensatorów zwierających<br />- programowo: poprzez dwukrotne sprawdzanie stanu przycisku z odstępem czasu między nimi. Wygląda to tak:<br /><br />IF P1.0 = 0 THEN 'jeśli P1.0 = 0 to<br />WAITMS 30 'poczekaj 30 milisekund<br />IF P1.0 = 0 THEN 'sprawdź po raz drugi, czy P1.0 = 0 i jeśli tak to<br />CALL podprogram 'wywołaj podprogram<br />END IF 'koniec drugiego warunku<br />END IF 'koniec pierwszego warunku<br /><br /><strong>13. Co to jest wyświetlacz multipleksowy i jak nim sterować z poziomu Bascom'a?</strong><br /><br />Wyświetlacz multipleksowy to taki, w którym wykorzystuje się bezwładność ludzkiego oka sterując w jednej chwili tylko jednym znakiem na wyświetlaczu. Poprzez szybkie włączanie i wyłączanie kolejnych znaków uzyskuje się efekt świecenia wszystkich znaków.W przypadku wyświetlaczy LED robi się to w następujący sposób: każdy segment jednej cyfry łączymy z takim samym segmentem drugiej cyfry itd. W przypadku techniki mikroprocesorowej będą to najczęściej katody, gdyż wydajność prądowa portu jest dla &quot;0&quot; logicznego. Połączone segmenty łączy się z wybranymi bitami portu. Anody wyświetlaczy muszą być załączane z drugiego portu np. P3 poprzez tranzystory PNP. Sterowanie odbywa się w następujący sposób przy założeniu, że na początku wszystkie wyświetlacze są wyłączone:<br /><br />- ustaw na porcie P1 to co ma być wyświetlone na pierwszym pojedyńczym wyświetlaczu,<br />- włącz pierwszy wyświetlacz,<br />- poczekaj chwilę<br />- wyłącz pierwszy wyświetlacz<br />- ustaw na porcie P1 to co ma być wyświetlone na drugim pojedyńczym wyświetlaczu,<br />- włącz drugi wyświetlacz,<br />- poczekaj chwilę,<br />- wyłącz drugi wyświetlacz<br />- ...<br />- skocz do początku<br /><br />Przykładowy program:<br />[syntax=basic4gl]<br />DIM tablica_znakow( 9 ) AS BYTE 'deklaracja tablicy znaków<br />tablica_znakow(0) = 192 'deklaracja wartości<br />tablica_znakow(1) = 249 'podano liczby dla następującego podłączenia: P1.0-segment a, P1.1-b, P1.2-c, P1.3-d itd<br />tablica_znakow(2) = 164<br />tablica_znakow(3) = 176<br />tablica_znakow(4) = 153<br />tablica_znakow(5) = 146<br />tablica_znakow(6) = 130<br />tablica_znakow(7) = 248<br />tablica_znakow(8) = 128<br />tablica_znakow(9) = 144<br />wys1 ALIAS P3.4 'zmiana nazwy bitu P3.4, który będzie sterował wyswietlaczem nr. 1<br />wys2 ALIAS P3.5 'dzięki temu nie musimy pamiętać gdzie będą podłączone poszczególne wyświetlacze<br />wys3 ALIAS P3.7<br />DO 'początek pętli<br />P1 = tablica_znakow ( 1 ) 'wysłanie znaku 1 na port P1<br />RESET wys1 'włączenie pierwszego wyświetlacza<br />WAITMS 10 'pętla opóźnienia czasowego<br />SET wys1 'wyłączenie pierwszego wyświetlacza<br />P1 = tablica_znakow ( 5 ) 'wysłanie znaku 5 na port P1 - w tym przypadku dla drugiego wyświetlacza<br />RESET wys2<br />WAITMS 10<br />SET wys2<br />P1 = tablica_znakow ( 9 )<br />RESET wys3<br />WAITMS 10<br />SET wys3<br />LOOP 'powrót do początku pętli<br />[/syntax]<br /><br /><strong>14. Jak obsłużyć klawiaturę od PC'ta?</strong><br /><br />[syntax=basic4gl]<br />' Program: ATPCKBD.BAS<br />' Author: Dusko Djuricin<br />' E-mail: <!-- e --><a href="mailto:djdusko@eunet.yu">djdusko@eunet.yu</a><!-- e --><br />'<br />' This program demonstrates how to interface AT PC keyboard to 8031 microcontrollers family.<br />' Program was originally written and tested for ATMEL 89C2051. For keyboard interfacing it<br />' uses only two I/O lines with two pull up resistors. At the output, through serial channel,<br />' it sends ASCII code of pressed key. Other used I/O lines are not necessary.<br />' Complete description of PC keyboard operation, could be found at the following address:<br />'<br />' <!-- m --><a class="postlink" href="http://www.geocities.com/SiliconValley/Bay/8302/keybrd.htm#1" >http://www.geocities.com/SiliconValley/ ... ybrd.htm#1</a><!-- m --><br />'<br />Dim B1 As Byte , B2 As Byte , N As Byte , Status As Byte , Key As Byte<br />Dim Caps As Bit , Caps_lock As Bit , Ctrl As Bit , Alt As Bit , Tmp As Bit<br />Dim Temp As String * 1<br /><br />Declare Sub Tx_byte(b1 As Byte)<br />Declare Sub Rx_byte<br />Declare Sub Kbd_status<br /><br />Kbd_data Alias P1.1 ' connected with 4K7 pull up resistor<br />Kbd_clk Alias P1.0 ' connected with 4K7 pull up resistor<br />Buzzer Alias P3.7 ' for details see BASCOM51 documentation<br />Res_sw Alias P3.5 ' optional output (see code)<br /><br />Dim Frequency As Const 2048<br />Dim Duration As Const 50<br />Dim L_shift As Const &amp;H12<br />Dim R_shift As Const &amp;H59<br />Dim Ctrl_key As Const &amp;H14<br />Dim Alt_key As Const &amp;H11<br />Dim Caps_key As Const &amp;H58<br />Dim Scroll_key As Const &amp;H7E<br /><br />Dim Flag As Bit<br />Dim Flaga As Bit<br /><br />'---------------------------[Beginning of Program]-------------------------------<br />Config Lcd = 16 * 2<br />Cls<br />Lcd &quot;kbrd test&quot;<br />Wait 3<br />Cls<br />clr flag<br />clr flaga<br />Reset Kbd_clk ' disable the Keyboard<br /><br />Waitms 100<br />Do<br />Tx_byte &amp;HFF ' reset the Keyboard and wait<br />Rx_byte ' till the Keyboard answer with<br />If B1 = &amp;HFA Then Exit Do ' acknowledge byte<br />If B1 = &amp;HAA Then Exit Do ' or Power On Self Test OK code<br />Loop<br /><br />'Print<br />'Print &quot;*** AT PC Keyboard Interface ***&quot;<br />'Print &quot; author: Dusko Djuricin&quot;<br />'Print &quot; E-mail: <!-- e --><a href="mailto:djdusko@eunet.yu">djdusko@eunet.yu</a><!-- e -->&quot;<br />'Print &quot;********************************&quot;<br />'Print<br /><br />' KBD LED: Status.0 - Scroll Lock, Status.1 - Num Lock, Status.2 - Caps Lock<br />Status = 2 ' initially Num Lock On<br />Kbd_status<br /><br />Do<br />' KEY variable will hold ASCII value of pressed key<br />Key = 0 ' initial value<br />Rx_byte ' read scan code from PC keyboard into B1<br /><br />Select Case B1<br />Case Ctrl_key:<br />Set Ctrl ' mark that CTRL key is pressed<br />B1 = 0<br />Case Alt_key:<br />Set Alt ' same as above but for ALT key ...<br />B1 = 0<br />Case L_shift:<br />Set Caps ' same as above but for Left SHIFT key ...<br />B1 = 0<br />Case R_shift:<br />Set Caps ' same as above but for Right SHIFT key ...<br />B1 = 0<br />Case &amp;HE0: ' extended codes are not handled!<br />B1 = 0<br />Case &amp;HF0: ' BREAK CODE is detected (key depressed)<br />Rx_byte ' read again to see which key is depressed<br />If B1 = L_shift Then ' and keep tracking flags...<br />Reset Caps<br />Elseif B1 = R_shift Then<br />Reset Caps<br />End If<br />If B1 = Ctrl_key Then<br />Reset Ctrl<br />Elseif B1 = Alt_key Then<br />Reset Alt<br />End If<br />B1 = 0<br />Case Caps_key: ' in a case of CAPS LOCK key<br />Caps_lock = Caps_lock Xor 1 ' there must be calculated status of it's LED<br />Status = Status Xor 4<br />Kbd_status ' and then we must send it to keyboard<br />B1 = 0<br />Case Scroll_key: ' I use combination of Ctrl + Alt + ScrLock<br />Tmp = Ctrl And Alt ' keys to generate reset signal...<br />If Tmp = 1 Then<br />Reset Res_sw ' ...for my host controller<br />Status = Status Xor 1 ' (Scroll Lock LED will lit and buzzer beeps)<br />Kbd_status<br />' Sound Buzzer , Duration , 512<br />' Waitms 100<br />' Sound Buzzer , Duration , 512<br />' Waitms 100<br />' Sound Buzzer , Duration , 512<br />' Waitms 100<br />Set Res_sw<br />Status = Status Xor 1 ' turn off Scroll Lock LED<br />Kbd_status<br />End If<br />B1 = 0<br />Case Else: ' handling of &quot;printable&quot; characters<br />If B1 &gt; 131 Then ' this program handles only lower part<br />B1 = 0 ' of ASCII code table (with exception of<br />End If ' function keys - see lookup table)<br />If Caps = 1 Then<br />Key = Lookup(b1 , With_shift) ' one table is for SHIFT + key combination<br />Else<br />Key = Lookup(b1 , No_shift) ' and another is for key WITHOUT SHIFT<br />End If<br />If Caps_lock = 1 Then<br />If Caps = 0 Then ' if CAPS LOCK was ON and there is no<br />Temp = Chr(key) ' SHIFT + key combination, then convert<br />Temp = Ucase(temp) ' pressed key into upper case letter<br />Key = Asc(temp)<br />End If<br />End If<br />End Select<br /><br />If B1 &lt;&gt; 0 Then<br />' Sound Buzzer , Duration , Frequency ' beep<br />' Print Chr(key); ' and print pressed key<br />If Key = 27 Then<br />Cls<br />Set Flaga<br />End If<br />If Key = 13 Then<br />Flaga = 1<br />Flag = Not Flag<br />If Flag = 0 Then<br />Locate 1 , 1<br />Else<br />Locate 2 , 1<br />End If<br />End If<br /><br />If Flaga = 0 Then<br />Lcd Chr(key)<br />Reset Flaga<br />End If<br />End If<br />Waitms 10 ' dummy delay ...<br />Loop<br /><br />'-----------------------[Receive Byte from Keyboard]----------------------------<br /><br />Sub Rx_byte<br />Set Kbd_clk ' enable Keyboard<br />mov {n},#0<br />jb Kbd_clk,*+0 ' wait CLK to become zero<br />' START bit<br />jnb Kbd_data,L_cont ' if START bit is zero continue<br />sjmp .L_error ' if not exit via error label<br />' DATA bits<br />!L_cont:<br />Incr N ' this is counter of received bits<br />acall zero2one<br />mov a,{b1} ' prepare buffer<br />mov c,Kbd_data ' read DATA bit<br />rrc a ' read it into the buffer<br />mov {b1},a ' store buffer value<br />mov a,{n}<br />cjne a,#8,L_cont ' if it isn't last bit repeat<br />' PARITY bit<br />acall zero2one<br />mov a,{b2} ' prepare buffer<br />mov c,Kbd_data ' read ODD PARITY bit<br />rrc a ' store it into the buffer<br />' STOP bit<br />acall zero2one<br />mov c,Kbd_data ' read STOP bit<br />rrc a ' store it into the buffer<br />rrc a ' now align bits to right...<br />rrc a<br />rrc a<br />rrc a<br />rrc a<br />rrc a<br />anl a,#3 ' extract valuable bits and<br />mov {b2},a ' store to buffer<br />' check STOP bit<br />anl a,#2<br />jz .L_error<br />' PARITY checking<br />mov a,{b1}<br />mov c,psw.0 ' this is EVEN PARITY<br />rlc a<br />anl a,#1<br />xch a,{b2}<br /><br />anl a,#1<br />xrl a,{b2}<br />jz .L_error<br />sjmp .L_end<br />L_error: ' exit in case of an error<br />Waitms 1 ' wait end of transmission<br />mov a,#0<br />mov {b1},a<br />L_end:<br />Reset Kbd_clk ' stop the Keyboard<br />End Sub<br /><br />'------------------------[Transmit Byte to Keyboard]----------------------------<br /><br />Sub Tx_byte(b1 As Byte)<br />B2 = 8<br />Reset Kbd_clk ' break the Keyboard<br />Delay ' (safety reasons)<br />Delay<br />Delay<br />Delay<br />Delay<br />Delay<br />Reset Kbd_data ' request to send<br />Set Kbd_clk ' enable the Keyboard<br />' START BIT<br />acall zero2one<br />' DATA BITS<br />mov a,{b1}<br />!L_tx_data:<br />rrc a<br />mov Kbd_data,c<br />acall zero2one<br />djnz {b2},L_tx_data<br />' PARITY BIT<br />mov a,{b1} ' calculate parity bit<br />mov c,psw.0 ' this is Even parity<br />cpl c ' and Keyboard needs Odd parity<br />mov Kbd_data,c ' send parity bit<br />acall zero2one<br />' STOP BIT<br />Set Kbd_data ' send stop bit<br />acall zero2one<br />' KBD ACK BIT<br />acall zero2one<br />Reset Kbd_clk ' stop the keyboard<br />End Sub<br /><br />'------------------[ASM Subroutine wait for falling edge]-----------------------<br /><br />!zero2one:<br />jnb Kbd_clk,*+0 ' wait till CLK rise<br />jb Kbd_clk,*+0 ' now wait till CLK fall down<br />ret<br /><br />'------------[Subroutine for sending LED status to the Keyboard]----------------<br /><br />Sub Kbd_status:<br />Tx_byte &amp;HED<br />Rx_byte<br />Tx_byte Status<br />Rx_byte<br />End Sub<br /><br />'---------------------[Scan Code to ASCII conversion table]---------------------<br />' Here are two lookup tables, one for handling ordinary keys and other for<br />' handling combination of SHIFT + key. I gave (under block remark) same tables<br />' written as strings, so matching with ASCII codes could be easier.<br />'<br />' Note that function keys (F1 to F12) are coded as one byte. F1 is coded as 129,<br />' F2 gives 130, F3 gives 131 and so on. This was OK for my application and it is<br />' because of simplicity.<br />'<br />' Gray keys are not handled (INS, DEL, HOME, ARROWS etc)! These keys returns ASCII<br />' value of appropriate key on numeric keypad (HOME will give 7, END gives 1, etc).<br />'<br />' Pressing of Num Lock key have no effects. Num Lock LED is always ON and serves<br />' as indicator that controller is turned on (if the keyboard is connected).<br />'<br />' Keyboard mapping is for ordinary 101 keys keyboard (standard US layout).<br />'<br />No_shift:<br />'(<br />Data &quot;&quot;<br />Data &quot;F9&quot; , &quot;&quot; , &quot;F5&quot; , &quot;F3&quot; , &quot;F1&quot; , &quot;F2&quot; , &quot;F12&quot; , &quot;&quot; , &quot;F10&quot; , &quot;F8&quot;<br />Data &quot;F6&quot; , &quot;F4&quot; , &quot;TAB&quot; , &quot;`&quot; , &quot;&quot; , &quot;&quot; , &quot;LAlt&quot; , &quot;LSh&quot; , &quot;&quot; , &quot;LCtr&quot; , &quot;q&quot;<br />Data &quot;1&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;z&quot; , &quot;s&quot; , &quot;a&quot; , &quot;w&quot; , &quot;2&quot; , &quot;&quot;<br />Data &quot;&quot; , &quot;c&quot; , &quot;x&quot; , &quot;d&quot; , &quot;e&quot; , &quot;4&quot; , &quot;3&quot; , &quot;&quot; , &quot;&quot; , &quot; &quot;<br />Data &quot;v&quot; , &quot;f&quot; , &quot;t&quot; , &quot;r&quot; , &quot;5&quot; , &quot;&quot; , &quot;&quot; , &quot;n&quot; , &quot;b&quot; , &quot;h&quot;<br />Data &quot;g&quot; , &quot;y&quot; , &quot;6&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;m&quot; , &quot;j&quot; , &quot;u&quot; , &quot;7&quot;<br />Data &quot;8&quot; , &quot;&quot; , &quot;&quot; , &quot;,&quot; , &quot;k&quot; , &quot;i&quot; , &quot;o&quot; , &quot;0&quot; , &quot;9&quot; , &quot;&quot;<br />Data &quot;&quot; , &quot;.&quot; , &quot;/&quot; , &quot;l&quot; , &quot;;&quot; , &quot;p&quot; , &quot;-&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data &quot;'&quot; , &quot;&quot; , &quot;[&quot; , &quot;=&quot; , &quot;&quot; , &quot;&quot; , &quot;Caps&quot; , &quot;RSht&quot; , &quot;Enter&quot; , &quot;]&quot;<br />Data &quot;&quot; , &quot;\&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data &quot;BkSp&quot; , &quot;&quot; , &quot;&quot; , &quot;1&quot; , &quot;&quot; , &quot;4&quot; , &quot;7&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data &quot;0&quot; , &quot;.&quot; , &quot;2&quot; , &quot;5&quot; , &quot;6&quot; , &quot;8&quot; , &quot;ESC&quot; , &quot;NumLck&quot; , &quot;F11&quot; , &quot;+&quot;<br />Data &quot;3&quot; , &quot;-&quot; , &quot;*&quot; , &quot;9&quot; , &quot;ScrLck&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;F7&quot;<br />')<br />Data 0<br />Data 137 , 0 , 133 , 131 , 129 , 130 , 140 , 0 , 138 , 136<br />Data 134 , 132 , 9 , 96 , 0 , 0 , 0 , 0 , 0 , 0 , 113<br />Data 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0<br />Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32<br />Data 118 , 102 , 116 , 114 , 53 , 0 , 0 , 110 , 98 , 104<br />Data 103 , 121 , 54 , 0 , 0 , 0 , 109 , 106 , 117 , 55<br />Data 56 , 0 , 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0<br />Data 0 , 46 , 47 , 108 , 59 , 112 , 45 , 0 , 0 , 0<br />Data 39 , 0 , 91 , 61 , 0 , 0 , 0 , 0 , 13 , 93<br />Data 0 , 92 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0<br />Data 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0<br />Data 48 , 46 , 50 , 53 , 54 , 56 , 27 , 0 , 139 , 43<br />Data 51 , 45 , 42 , 57 , 0 , 0 , 0 , 0 , 0 , 135<br /><br />With_shift:<br />'(<br />Data &quot;&quot;<br />Data &quot;F9&quot; , &quot;&quot; , &quot;F5&quot; , &quot;F3&quot; , &quot;F1&quot; , &quot;F2&quot; , &quot;F12&quot; , &quot;&quot; , &quot;F10&quot; , &quot;F8&quot;<br />Data &quot;F6&quot; , &quot;F4&quot; , &quot;TAB&quot; , &quot;~&quot; , &quot;&quot; , &quot;&quot; , &quot;LAlt&quot; , &quot;LSh&quot; , &quot;&quot; , &quot;LCtr&quot; , &quot;Q&quot;<br />Data &quot;!&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;Z&quot; , &quot;S&quot; , &quot;A&quot; , &quot;W&quot; , &quot;@&quot; , &quot;&quot;<br />Data &quot;&quot; , &quot;C&quot; , &quot;X&quot; , &quot;D&quot; , &quot;E&quot; , &quot;$&quot; , &quot;#&quot; , &quot;&quot; , &quot;&quot; , &quot; &quot;<br />Data &quot;V&quot; , &quot;F&quot; , &quot;T&quot; , &quot;R&quot; , &quot;%&quot; , &quot;&quot; , &quot;&quot; , &quot;N&quot; , &quot;B&quot; , &quot;H&quot;<br />Data &quot;G&quot; , &quot;Y&quot; , &quot;^&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;M&quot; , &quot;J&quot; , &quot;U&quot; , &quot;&amp;&quot;<br />Data &quot;*&quot; , &quot;&quot; , &quot;&quot; , &quot;&lt;&quot; , &quot;K&quot; , &quot;I&quot; , &quot;O&quot; , &quot;)&quot; , &quot;(&quot; , &quot;&quot;<br />Data &quot;&quot; , &quot;&gt;&quot; , &quot;?&quot; , &quot;L&quot; , &quot;:&quot; , &quot;P&quot; , &quot;_&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data 34 , 0 , &quot;&quot; , &quot;{&quot; , &quot;+&quot; , &quot;&quot; , &quot;&quot; , &quot;Caps&quot; , &quot;RSht&quot; , &quot;Enter&quot; , &quot;}&quot;<br />Data &quot;&quot; , &quot;|&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data &quot;BkSp&quot; , &quot;&quot; , &quot;&quot; , &quot;1&quot; , &quot;&quot; , &quot;4&quot; , &quot;7&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot;<br />Data &quot;0&quot; , &quot;.&quot; , &quot;2&quot; , &quot;5&quot; , &quot;6&quot; , &quot;8&quot; , &quot;ESC&quot; , &quot;NumLck&quot; , &quot;F11&quot; , &quot;+&quot;<br />Data &quot;3&quot; , &quot;-&quot; , &quot;*&quot; , &quot;9&quot; , &quot;ScrLck&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;&quot; , &quot;F7&quot;<br />')<br />Data 0<br />Data 137 , 0 , 133 , 131 , 129 , 130 , 140 , 0 , 138 , 136<br />Data 134 , 132 , 9 , 126 , 0 , 0 , 0 , 0 , 0 , 0 , 81<br />Data 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 64 , 0<br />Data 0 , 67 , 88 , 68 , 69 , 36 , 35 , 0 , 0 , 32<br />Data 86 , 70 , 84 , 82 , 37 , 0 , 0 , 78 , 66 , 72<br />Data 71 , 89 , 94 , 0 , 0 , 0 , 77 , 74 , 85 , 38<br />Data 42 , 0 , 0 , 60 , 75 , 73 , 79 , 41 , 40 , 0<br />Data 0 , 62 , 63 , 76 , 58 , 80 , 95 , 0 , 0 , 0<br />Data 34 , 0 , 123 , 43 , 0 , 0 , 0 , 0 , 13 , 125<br />Data 0 , 124 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0<br />Data 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0<br />Data 48 , 46 , 50 , 53 , 54 , 56 , 27 , 0 , 139 , 43<br />Data 51 , 45 , 42 , 57 , 0 , 0 , 0 , 0 , 0 , 135<br /><br />'-----------------------------[End of Program]----------------------------------<br /><br />[/syntax]<br /><br /><strong>15. Jak zamienić liczbę na ciąg 01?</strong><br /><br />Nazwa_zmiennej.numer_bitu = 1 'ustawienie bitu o numerze = numer_bitu.<br />Print Nazwa_zmiennej.numer_bitu 'wysłanie po RS' bitu o numerze = numer_bitu.<br />Gdzie numer_bitu liczymy od 0 (najmniej znaczący bit).<br /><br /><strong><em>PRZYKŁAD:</em></strong><br /><br />Chcemy wyświetlić na wyświetlaczu LCD 8 bitów liczby<br />[syntax=basic4gl]<br />Dim Liczba as Byte<br />Dim i as byte<br /><br />Config lcd=16*1<br />Cls<br /><br />for i = 7 downto 0<br />lcd liczba.i<br />next<br /><br />end<br />Jeśli chcemy wykonać jakieś działania w zależności od wartości poszczególnych bitów to robimy to tak:<br />for i = 7 downto 0<br />if liczba.i = 1 then<br />...<br />else<br />...<br />next <br />[/syntax]<br /><br />Jeśli dla wartości poszczególnych bitów będziemy wykonywać inne czynności to musimy jeszcze dodać warunki na wartość zmiennej i. Można to zrobić za pomocą IF bądź CASE. Jest to najlepszy sposób na definiowanie ustawień w naszym urządzeniu. Jeśli np bit 5 zmiennej ustawienia ma wartość 1 to znaczy, że np budzik jest włączony.<br /><br /><strong>16. Jak obsłużyć impulsator?</strong><br /><br />Przykład z listy dyskusyjnej bascoma <br /><br />[syntax=basic4gl]<br />'<br />' byte var.<br />'<br />Dim Attuale As Byte <br />Dim Preced As Byte <br />Dim Cntr As Byte ' licznik dla Encodera <br />'<br />' Alias<br />'<br />Ph_A Alias P1.0  'fase A<br />Ph_B Alias P1.1  'fase B<br /><br />Print &quot;Encoder TEST&quot;<br />Cntr = 0<br />Attuale = P1 And 3 <br />Preced = Attuale<br />Do<br />While Preced = Attuale <br />Attuale = P1 And 3 'solo P1.1 e P1.0<br />Wend<br />Rotate Preced , Left 'allinea fase A con fase B<br />Preced = Preced XOR Attuale 'valuta se CW o CCW<br />Preced = Preced AND 2 'solo bit Preced.1<br />If Preced = 0 Then<br />decr Cntr 'indietro<br />else<br />incr Cntr 'avanti<br />end if<br />Preced = Attuale 'aggiorna stato<br />Print Cntr 'display counter<br />loop <br /><br />[/syntax]<br /><br />Może się to komyś przyda ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 2 lut 2013, o 14:51</p><hr />
]]></content>
</entry>
</feed>