przykładu Pawła z obsługa menu.
Przeglądając net znalazłem sposoby z zastosowaniem select case: i wygląda to tak:
Kod:
'program sterownika rotora napędzanego silnikiem krokowym Bascom AVR
'############## Konfiguracja mikroprocesora ###################
'##############################################################
$regfile = "m644pdef.dat" 'informuje kompilator o typie mikrokontrolera
'$sim
$crystal = 16000000 'informuje kompilator
'o częstotliwości oscylatora 'taktującego mikrokontroler
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 'porty mikrokontrolera, do których dołączono wyświetlacz LCD
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/C
Config Portd = &B00011111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11110111
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwtimer0
Enable Interrupts
'Sw_port Alias Pind 'przyciski
Up Alias Pind.7 'góra
Down Alias Pind.6 'dół
Setup Alias Pind.5 'wejście/zatwierdzenie
Step_ Alias Pinb.0 'Step
Dir_ Alias Pinb.1 'Dir
Enab_ Alias Pinb.2 'Enable
Buzer Alias Portb.3
Deflcdchar 1 , 31 , 31 , 4 , 4 , 4 , 4 , 4 , 4 ' replace ? with number (0-7)
Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 3 , 31 , 31 , 4 , 4 , 4 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 4 , 4 , 4 , 4 , 4 , 14 , 14 , 31 , 31 ' replace ? with number (0-7)
Deflcdchar 5 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 6 , 2 , 6 , 15 , 31 , 15 , 6 , 2 , 32 ' replace ? with number (0-7)
Deflcdchar 7 , 8 , 12 , 30 , 31 , 30 , 12 , 8 , 32 ' replace ? with number (0-7)
Deflcdchar 8 , 32 , 32 , 31 , 31 , 31 , 32 , 32 , 32 ' replace ? with number (0-7)
'#################### Zmienne ##########################
'#######################################################
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte 'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit 'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte
Dim Wart_ac1 As Word 'zmienna na wartość odczytaną z przetwornika
Dim Stopnie As Single 'zmienna stopni odczyt z przetwornika 'Dim V1 As Single 'podzielony przez 2.841
Dim Azym_odcz As Word 'zmienna odczytanego azymutu'Dim V2 As Word
Dim Azym_zad As Word 'zmienna zadanego azymutu'Dim V3 As Word
Dim Pomoc1 As String * 14
Dim Pomoc2 As Byte
Dim Pomoc3 As Byte
Dim Dzielnik(3) As Byte
Dim Czas As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_200ms As Bit , Flaga_1s As Bit 'flagi przerwań
Dim 0_st As Word
Dim 360_st As Word
Dim 0_st_ee As Word
Dim 360_st_ee As Word
Dim Pam1 As Word 'pamięć nastawy 1
Dim Pam2 As Word 'pamięć nastawy 2
Dim Pam3 As Word 'pamięć nastawy 3
Dim Pam4 As Word 'pamięć nastawy 4
Dim Pam5 As Word 'pamięć nastawy 5
Dim Start_menu As Byte
Declare Sub Lewo
Declare Sub Prawo
Declare Sub Zatrz
Declare Sub Setup1
Declare Sub Wysw
'####### ustawienia początkowe ############
'##########################################
Cursor Off
Start Adc 'uruchamia wbudowany przetwornik
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841 'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
'na stopnie zaymutu
Azym_odcz = Int(stopnie) 'wyciągnięcie części całkowitej ze zmienne "stopnie" Azym_odcz = Int(v1)
Readeeprom Pam1
Readeeprom Pam2
Readeeprom Pam3
Readeeprom Pam4
Readeeprom Pam5
Cls
Wait 1
Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Waitms 500
Locate 3 , 4 : Lcd "By SQ2EER"
Waitms 500
Locate 4 , 5 : Lcd "Wer. 1.0"
Wait 1
Cls
Azym_zad = Azym_odcz
Do
'################################################## co 4 ms
If Flaga_4ms = 1 Then
Flaga_4ms = 0
Gosub Przyciski
If Wyswietlono = 1 Then Gosub Wys_lcd
End If
'##################################################
'################################################## co 100 ms
If Flaga_100ms = 1 Then
Flaga_100ms = 0
Gosub Odczyt_adc
End If
'##################################################
'################################################## co 200 ms 'początek pętli program
If Flaga_200ms = 1 Then
Flaga_200ms = 0
Gosub Sterowanie
End If
'##################################################
Loop
End
'############################################################
Przerwtimer0:
Timer0 = 5
Set Flaga_4ms
Incr Dzielnik(1)
If Dzielnik(1) = 25 Then
Dzielnik(1) = 0
Set Flaga_100ms
Incr Dzielnik(2)
If Dzielnik(2) = 2 Then
Dzielnik(2) = 0
Set Flaga_200ms
Incr Dzielnik(3)
If Dzielnik(3) = 5 Then
Dzielnik(3) = 0
Set Flaga_1s
End If
End If
End If
Return
'#############################################################
'###################### Przyciski ############################
Przyciski:
If Up = 0 Then 'zwiększanie zadanego azymutu
Waitms 25
If Up = 0 Then
Incr Azym_zad
Gosub Beep
'Bitwait Up , Set
If Azym_zad => 360 Then
Azym_zad = 360
End If
End If
End If
If Down = 0 Then 'zmiejszanie zadanego azymutu
Waitms 25
If Down = 0 Then
Decr Azym_zad
Gosub Beep
'Bitwait Down , Set
If Azym_zad <= 0 Or Azym_zad > 360 Then
Azym_zad = 0
End If
End If
End If
If Setup = 0 Then
Waitms 25
If Setup = 0 Then
'Gosub Beep
'Bitwait Setup , Set 'Reset
'Czas = 5
'Decr Czas
' If Setup = 0 And Czas = 0 Then
Gosub Beep
Gosub Menu
'Gosub Setup1
'End If
End If
End If
'##################################################################
'##################################################################
Wys_lcd:
Locate 1 , 6 : Lcd "Azymut"
Locate 2 , 1 : Lcd Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; " "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; " "
Return
'#################################################################
'#################################################################
Odczyt_adc:
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
Stopnie = Wart_ac1 / 2.841 'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
'na stopnie zaymutu
Azym_odcz = Int(stopnie) 'wyciągnięcie części całkowitej ze zmienne "stopnie" Azym_odcz = Int(v1)
Return
'###################################################################
'###################################################################
Sterowanie:
Return
'###################################################################
'###################################################################
Menu:
Start_menu = 0
Cls
Do
If Setup = 0 Then
Waitms 25
If Setup = 0 Then
Bitwait Setup , Set
Incr Start_menu
Gosub Beep
If Start_menu => 5 Then
Start_menu = 0
End If
End If
End If
Select Case Start_menu
Case 1 :
Locate 1 , 4 : Lcd "Ustawianie"
Locate 2 , 6 : Lcd "Rotora"
Wait 1 : Cls : Gosub Ustaw_rotor
Case 2 :
Locate 1 , 2 : Lcd "Programowanie"
Locate 2 , 6 : Lcd "Pamieci"
Wait 1 : Cls : Gosub Prog_pamieci
Case 3 :
Locate 1 , 1 : Lcd "Zapis parametrow"
Locate 2 , 6 : Lcd "do eeprom"
Wait 1 : Cls : Gosub Zapisz_eeprom
End Select
Loop Until Start_menu = 4
Return
'#####################################################################
'######################### Beep ######################################
Beep:
Set Buzer
Waitms 25
Reset Buzer
Return
Ustaw_rotor:
Return
Prog_pamieci:
Return
Zapisz_eeprom:
Return