Bascom

Oto kolejne programy Piórnika szkolnego. Eksperymenty zostały przeprowadzone pod kątem pełnego wykorzystania wewnętrznej i zewnętrznej pamięci Eprom oraz zastosowania krótkich procedur w programie.

'Piornik08.bas

'Program do wyświetlania ściągi.

'Z wykorzystaniem pamięci szeregowej 24LC16B lub 24LC04).

'Do zapisania jest 160 znaków.

'Dalsze zaoszczędzenie pamięci. Zastosowano Declare Sub.

'W czasie pisania tekstu pozostaje on cały czas w okienku wyświetlacza.

'Aby zapisać tekst, należy w Portc.3 ustawić 1 i nacisnąć RESET.

'Aby odczytać zapisany tekst, należy ustawić 0 w Portc.3, nacisnąć RESET

'oraz przycisk w Portc.4. Wyświetli się pierwsza paczka tekstu, czyli 32 znaki.

'Ponowne naciśnięcie przycisku w Portc.4 wyświetli następną paczkę tekstu.

'Zerowanie pamięci Eprom: ustaw 1 w Portc.3, naciśnij RESET, naciśnij Esc.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 28%

'Fusebit ustawiony na generator wewnętrzny 4MHz (0011).

'Schemat: Piornik01.png.

 

$regfile = "m8def.dat"                                      'Dyrektyway dla kompilatora.

 $crystal = 4000000                                         'Zastosujemy generator wewnętrzny 4MHz.

 Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0

                                       'LCD dłączony do Portd. 2, 3, 4, 6, 1, 0.

 

Config Timer0 = Timer , Prescale = 1024                     'Konfiguruj Timer0, jako czasomierz, podział wstępny orzez 1024.

 

Config Sda = Portc.5                                        'Konfiguruj transmisję I2C.

Config Scl = Portc.4                                        'Konfiguruj transmisję I2C.

 

 Const Adres_write = 174                                    'Adres do zapisu w pamięci szeregowej.

 Const Adres_read = 175                                     'Adres do odczytu z pamięci szeregowej.

 

Config Pinc.3 = Input                                       'Przełącznik: zapis albo odczyt.

Set Portc.3                                                 'Podciągnij Port.

Config Pind.5 = Input                                       'Przycisk przsuwania napisu na Lcd.

Set Portd.5                                                 'Podciągnij Port.

Config Pind.7 = Output                                      'Synał dźwiękowy (alarm przepełnienia pamięci).

Set Portd.7                                                 'Podciągnij Port.

 

Dim Kodklaw As Byte                                         'Jeden bajt dla Kodklaw (znaki ASCI klawiatury).

Dim Q As Long                                               'Jeden bajt dla Q (kolejność naciskania klawisza).

Dim Suma As Byte                                            'Jeden bajt dla Suma (numer klawisza w ASCI).

Dim Przep As Byte                                           'Pamięta ilość przepełnien Timer0.

Dim Policzlcd As Byte                                       'Zmienna zawierająca ilość zajętych okienek Lcd.

Dim Krok As Byte                                            'Krok zawiera ilość naciśniętych klawiszy.

 

Declare Sub Odcz                                            'Deklaracja procedury do odczytywania pamięci.

 

Enable Interrupts                                           'Odblokuj przerwania.

Enable Timer0                                               'Odblokuj przerwania Timer0.

 

Config Keyboard = Pinc.0 , Data = Pinc.1 , Keydata = Keydata       'Konfiguruj klawiaturę.

On Timer0 Mig                                               'Włącz podprogram Mig Timera (LED).

Cls                                                         'Czyść.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Do                                                          'Pierwsza pętla.

  If Pinc.3 = 1 Then                                        'Jeśli przełącznik w Pinc.3 = 1...

  Gosub Druga                                               'Skocz do podprogramu zapisującego Druga.

  Else                                                      'W przeciewnym razie (gdy Pinc.3 = 0)...

  Gosub Odczyt                                              'Skocz do podprogramu odczytującego.

  End If                                                    'Koniec warunku.

Loop                                                        'Powtarzaj pętlę.

End                                                         'Koniec tej pętli.

 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Druga:                                                      'Podprogram drugiej pętli.

Do                                                          'Pętla.

  Kodklaw = Getatkbd()                                      '

  If Kodklaw > 0 And Kodklaw < 127 Then                     'Jeśli naciśnięto klawisz, a liczba ASCI jest od 0 do 127...

  Incr Q                                                    'Po naciśnięciu klawisza powiększ Q o jeden.

  Suma = Kodklaw                                            'Zmienna Suma będzie zawierać zawartość Kodklaw.

'''''''''''''''''''''''''''''''

'Zapis.

  I2cstart                                                  'Start zapisu znaku do pamięci szeregowej.

  I2cwbyte Adres_write                                      'Wyślij pod adres Adres_write.

  I2cwbyte Q                                                'Zapisz pod numerem Q.

  I2cwbyte Suma                                             'Wyślij zawartość Suma.

  I2cstop                                                   'Zatrzymaj zapis.

''''''''''''''''''''''''''''''

  Lcd Chr(kodklaw)                                          'Pokaż klawisz.

 

    'Policzlcd pilnuje, aby w czasie zapisywania znaki znajdowały się zawsze w okienku Lcd.

     Incr Policzlcd                                         'Po naciśnięciu klawisza powiększ Policzlcd o jeden.

     Select Case Policzlcd                                  'Sprawdzanie zawartości Policzlcd.

     Case 16 : Locate 2 , 1                                 'Jeśli Policzlcd zawiera 16, ustaw kursor w drugiej linii, pozycja 1.

     Case 32 : Locate 1 , 1                                 '

     Cls                                                    '

     Case 48 : Locate 2 , 1                                 '

     Case 64 : Locate 1 , 1                                 '

     Cls                                                    '

     Case 80 : Locate 2 , 1                                 '

     Case 96 : Locate 1 , 1                                 '

     Cls                                                    '

     Case 112 : Locate 2 , 1                                '

     Case 128 : Locate 1 , 1                                '

     Cls                                                    '

     Case 144 : Locate 2 , 1                                '

     Case 160 : Locate 1 , 1                                '                                                                                                                                                                                                     '

     End Select                                             'Koniec przeglądu zmiennej.

 

'''''''''''''''''''''''''''''''''''''''''

'Kasowanie.

  If Kodklaw = 1 Then                                       'Jeśli naciśnięto Esc...

  Suma = 0                                                  'Zeruj zmienną Suma.

 For Krok = 0 To 160                                        'Wykonuj kroki od 0 do 160.

 I2cstart                                                   'Start zapisu znaku do pamięci szeregowej.

  I2cwbyte Adres_write                                      'Wyślij pod adres Adres_write.

  I2cwbyte Krok                                             'Zapisz pod numerem Q.

  I2cwbyte Suma                                             'Wyślij zawartość Suma.

  I2cstop                                                   'Zatrzymaj zapis.

  Waitms 10                                                 '

 Next Krok                                                  '

  End If                                                    '

''''''''''''''''''''''''''''''''''''''''

 

  If Kodklaw = 13 Then                                      'Jeśli naciśnięto Enter...

  Lowerline                                                 'Skocz do drugiej linii.

  End If                                                    '

 

  If Kodklaw = 127 Then                                     'Jeśli naciśnięto Delete...

  Cls                                                       'Czyść Lcd.

  End If                                                    '

 

    If Q = 160 Then                                         'Jeśli będzie 160-te przyciśnięcie klawisza, skocz do podprogramu Alarm.

    Gosub Alarm                                             '

    End If                                                  '

 

End If                                                      'Koniec warunku "gdy naciśnięto klawisz".

Loop                                                        'Powtarzaj pętlę.

End                                                         'Koniec tej pętli.

Return                                                      'Wróć do pierwszej pętli.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Odczyt:                                                     'Podprogram odczytujący z Eprom.

   Waitms 300                                               'Czekaj 300 mS.

   Bitwait Pind.5 , Reset                                   'Reaguj, kiedy Pind.5 = 0.

   Cls                                                      'Czyść Lcd.

'''''''''''''''''''''''''

Locate 1 , 1                                                'Pisz w Lcd w pierwszej linii od początku.

  For Krok = 1 To 16                                        '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

 

Locate 2 , 1                                                '

  For Krok = 17 To 32                                       '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

'''''''''''''''''''''''''

   Waitms 300                                               '

   Bitwait Pind.5 , Reset                                   '

   Cls                                                      '

''''''''''''''''''''''''

Locate 1 , 1                                                '

  For Krok = 33 To 48                                       '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

 

Locate 2 , 1                                                '

  For Krok = 49 To 64                                       '

  Call Odcz

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

''''''''''''''''''''''''

   Waitms 300                                               '

   Bitwait Pind.5 , Reset                                   '

   Cls                                                      '

''''''''''''''''''''''''

Locate 1 , 1                                                '

  For Krok = 65 To 80                                       '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

 

Locate 2 , 1                                                '

  For Krok = 81 To 96                                       '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

''''''''''''''''''''''

   Waitms 300                                               '

   Bitwait Pind.5 , Reset                                   '

   Cls                                                      '

'''''''''''''''''''''''

Locate 1 , 1                                                'Pisz w Lcd w pierwszej linii od początku.

  For Krok = 97 To 112                                      '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

 

Locate 2 , 1                                                '

  For Krok = 113 To 128

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

'''''''''''''''''''''''''

   Waitms 300                                               '

   Bitwait Pind.5 , Reset                                   '

   Cls                                                      '

'''''''''''''''''''''''

Locate 1 , 1                                                'Pisz w Lcd w pierwszej linii od początku.

  For Krok = 129 To 144

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

 

Locate 2 , 1                                                '

  For Krok = 145 To 160                                     '

  Call Odcz                                                 'Procedura odczytywania pamięci szeregowej.

  Lcd Chr(suma)                                             'Pokaż na Lcd zawartość Suma i zamień ją na znak klawiatury.

  Suma = 0                                                  '

  Next Krok                                                 '

'''''''''''''''''''''''''

   Return                                                   'Wróć do Druga.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Z tej pętli wychodzimy przy pomocy RESET.

Alarm:                                                      'Po zapełnieniu pamięci alarm dźwiękowy.

Do                                                          'Pętla.

  Sound Portd.7 , 400 , 500                                 'Sygnał Dźwiękowy.

  Waitms 150                                                'Krótka przerwa.

  Sound Portd.7 , 400 , 400                                 'Sygnał Dźwiękowy.

  Waitms 300                                                '

  Cls                                                       'Czyść.

  Lcd "Memory MAX!"                                         'Komunikat o przepełnieniu pamięci.

  Lowerline                                                 '

  Lcd "RESET"                                               '

  Loop                                                      'Powtarzaj pętlę.

End                                                         'Koniec tej pętli.

Return                                                      'Wróć do Zapis.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Mig:                                                        'Podprogram Timer0 (miganie diody).

 Incr Przep                                                 'Po załadowaniu Timer0, zwiększaj zmienną Przep o 1.

 If Przep = 25 Then                                         'Jeśli uzbiera się 25 przepełnień...

 Przep = 0                                                  'Zeruj zmienną.

  Portc.2 = 0                                               'Zmień poziom w Prtc.5 (zaświeć diodę).

  Waitms 100                                                'Trzymaj świecenie przez 100mS.

  Portc.2 = 1                                               'Wyłącz diodę.

 End If                                                     '

Return                                                      'Wróć do Timer0.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Procedura odczytywania pamięci szeregowej.

Sub Odcz                                                    '

   I2cstart                                                 'Start transmisji.

   I2cwbyte Adres_write                                     'Sprawdź pod jakim adresem zapisano.

   I2cwbyte Krok                                            'Pod jakim numerem.

   I2cstart                                                 'Start odczytu.

   I2cwbyte Adres_read                                      'Wpisz adres odczytu.

   I2crbyte Suma , Nack                                     'Odczytaj zapis. Nack=koniec dalszego odzczytu.

   I2cstop                                                  'Zatrzymaj transmisję.

End Sub                                                     '

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 'Tablica numerów przycisków klawiatury AT w kodzie ASCI:

   Keydata:                                                 'Podprogram tablicy.

     'Małe litery

   Data 0 , 5 , 0 , 3 , 4 , 5 , 6 , &H07 , 5 , 5 , 5 , &H0B , &H0C , 0,       ''''''''''''A

   Data 63 , 63 , 63 , 63 , 63 , 63 , 63 , 113 , 49 , 63 , 63 , 63 , 122,       ''''''''''B

   Data 115 , 97 , 119 , 50 , 63 , 63 , 99 , 120 , 100 , 101 , 52 ,       ''''''''''''''''C

   Data 51 , 63 , 63 , 32 , 118 , 102 , 116 , 114 , 53 , 63 , 63 , 110 ,       '''''''''''D

   Data 98 , 104 , 103 , 121 , 54 , 63 , 63 , 63 , 109 , 106 , 117 , 55 ,       ''''''''''E

   Data 56 , 63 , 63 , 44 , 107 , 105 , 111 , 48 , 57 , 63 , 63 , 46 , 47 ,       ''''''''F

   Data 108 , 59 , 112 , 95 , 63 , 63 , 63 , 63 , 63 , 63 , 61 , 63 , 63 , 63 ,       ''''G

   Data 63 , 13 , 63 , 63 , 124 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63,       'H

   Data 63 , 49 , 63 , 52 , 55 , 63 , 63 , 63 , 48 , 127 , 50 , 53 , 54 , 56,       ''''''I

   Data 1 , 63 , 5 , 43 , 51 , 45 , 42 , 57 , 63 , 63       ''''''''''''''''''''''''''''''J

 

    'Duże litery

  Data 0 , 0 , 0 , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,       ''''''''''K

  Data 0 , 0 , 0 , 0 , 0 , 0 , 81 , 33 , 03 , 0 , 0 , 90 , 83 , 65,       ''''''''L

  Data 87 , 64 , 0 , 0 , 67 , 88 , 68 , 69 , 36 , 35 , 0 , 0 , 0 , 86,       '''''M

  Data 70 , 84 , 82 , 37 , 0 , 0 , 78 , 66 , 72 , 71 , 89 , 94 , 0,       ''''''''N

  Data 0 , 0 , 77 , 74 , 85 , 38 , 42 , 0 , 0 , 60 , 75 , 73 , 79,       '''''''''O

  Data 41 , 40 , 0 , 0 , 62 , 63 , 76 , 58 , 80 , 0 , 0 , 0 , 0 , 0,       '''''''P

  Data 0 , 123 , 43 , 0 , 0 , 0 , 0 , 0 , 125 , 0 , 0 , 0 , 0 , 0 , 0,       '''''Q

  Data 0 , 0 , 0 , 0 , 0 , 0 , 49 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 48,       '''''R

  Data 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0       'S