Próbuję zrobić menu, ale nic mi nie działa
![Smutek :(](./images/smilies/icon_e_sad.gif)
Na początek chciałbym "ogarnąć" zegarek na ATmega328p + OLED SSD1307 0,96" (i2c) Dane udało mi się wczytać z DS'a ale nie potrafię go ustawić.
Mam pięć przycisków: UP, DOWN, OK, LEFT i RIGHT chciałbym aby moje MENU docelowo działało tak:
- UP zwiększanie ustawianej wartości
- DOWN zmniejszanie ustawianej wartości
- LEFT i RIGHT przesuwanie się po MENU w lewo i prawo
- OK długie naciśnięcie to wejście do MENU, zatwierdzenie ustawionej wartości czy coś w ten deseń
- OK krótkie naciśnięcie w stanie "normalnym" wybudzanie wyświetlacza (jak na razie jeszcze nie wiem jak go wygasić np po 3 minutach nie aktywności)
- w stanie "normalnym" długie naciśnięcie przycisków: UP, DOWN, LEFT i RIGHT ma załączać cztery wyjścia (przekaźniki)
$regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 64 $swstack = 64 $framesize = 64 Config Submode = New $lib "glcdSSD1306-I2C.lib" Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306" 'buzzer Config Portc.0 = Output : Portc.0 = 0 : Buzzer Alias Portc.0 'przyciski Config Pinb.0 = Input : Portb.0 = 1 : Sw_up Alias Pinb.0 Config Pinb.1 = Input : Portb.1 = 1 : Sw_down Alias Pinb.1 Config Pinb.2 = Input : Portb.2 = 1 : Sw_ok Alias Pinb.2 Config Pinb.3 = Input : Portb.3 = 1 : Sw_right Alias Pinb.3 Config Pinb.4 = Input : Portb.4 = 1 : Sw_left Alias Pinb.4 'TIMER Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int10ms Nosave : Compare0a = 155 '10ms @16MHz Declare Sub Oled(byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Declare Sub Oled_init Declare Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) 'Zmienne Dim 10ms As Byte , 100ms As Byte , 500ms As Byte , 1s As Byte Dim Resetflag As Bit Dim Odczyt(2) As Byte , T As Integer , T1 As Single , Wynik As String * 5 Dim Dzien_tygodnia As Byte , Nazwa_dnia(7) As String * 2 Dim Pik As Byte , Tryb As Byte , Index As Byte Dim Mig As Bit , Temp_b As Byte , Offset As Byte Dim Dzien As Byte , Miesiac As Byte , Rok As Byte Dim Sekunda As Byte , Minuta As Byte , Godzina As Byte Dim Licz1 As Byte , Licz2 As Byte , Licz3 As Byte , Licz4 As Byte , Licz5 As Byte Dim Flaga_ok As Byte , Flaga_up As Byte , Flaga_right As Byte , Flaga_down As Byte , Flaga_left As Byte 'nazwy Dnia Tygodnia Nazwa_dnia(1) = "Pn" Nazwa_dnia(2) = "Wt" Nazwa_dnia(3) = "Sr" Nazwa_dnia(4) = "Cz" Nazwa_dnia(5) = "Pi" Nazwa_dnia(6) = "So" Nazwa_dnia(7) = "Nd" 'i2c Config Scl = Portc.5 Config Sda = Portc.4 Const Ds1307w = 208 Const Ds1307r = 209 Call Oled_init Cls 'powitanie Setfont Font8x8tt Lcdat 5 , 24 , "*" , 0 Waitms 500 Lcdat 5 , 44 , "*" , 0 Waitms 500 Lcdat 5 , 64 , "*" , 0 Waitms 500 Lcdat 5 , 84 , "*" , 0 Waitms 500 Lcdat 5 , 104 , "*" , 0 Wait 1 Cls Enable Interrupts '*** START *** Do 'co 10ms If 10ms = 1 Then 10ms = 0 Gosub Sprawdz_wejscia If 100ms < 10 Then Incr 100ms Else 100ms = 0 If 1s < 10 Then Incr 1s Else 1s = 0 Gosub Zegarek Gosub Miganie_dwukropek End If If Pik > 0 Then Decr Pik Toggle Buzzer End If End If End If If Flaga_ok = 1 Then Flaga_ok = 0 Select Case Tryb Case 0 If Flaga_ok = 1 Then Flaga_ok = 0 Cls Tryb = 1 End If Pik = 2 Case 1 If Flaga_ok = 1 Then Flaga_ok = 0 If Index < 6 Then Incr Index Else Index = 0 Cls Tryb = 0 End If End If If Flaga_up = 1 Then Flaga_up = 0 Select Case Index Case 0 Incr Godzina If Godzina > 23 Then Godzina = 1 Call Set_clock(2 , Godzina) Case 1 Incr Minuta If Minuta > 59 Then Minuta = 0 Call Set_clock(1 , Minuta) Case 2 Incr Dzien If Dzien > 31 Then Dzien = 1 Call Set_clock(4 , Dzien) Case 3 Incr Miesiac If Miesiac > 12 Then Miesiac = 1 Call Set_clock(5 , Miesiac) Case 4 Incr Rok If Rok > 30 Then Rok = 00 Call Set_clock(6 , Rok) Case 5 Incr Dzien_tygodnia If Dzien_tygodnia > 7 Then Dzien_tygodnia = 1 Call Set_clock(3 , Dzien_tygodnia) End Select End If Pik = 2 End Select End If Loop End 'przerwania do odmierzania czasu Int10ms: $asm PUSH R24 !in R24, sreg PUSH R24 $end Asm 10ms = 1 $asm POP R24 !out sreg, r24 POP R24 $end Asm Return 'przyciski Sprawdz_wejscia: 'UP If Sw_up = 0 Then If Licz1 < 255 Then Incr Licz1 If Licz1 = 10 Then 'cos End If Else If Licz1 > 1 Then If Licz1 < 10 Then Flaga_up = 1 End If End If Licz1 = 0 End If 'DOWN If Sw_down = 0 Then If Licz2 < 255 Then Incr Licz2 If Licz2 = 10 Then 'cos End If Else If Licz2 > 1 Then If Licz2 < 10 Then Flaga_down = 1 End If End If Licz2 = 0 End If 'OK If Sw_ok = 0 Then If Licz3 < 255 Then Incr Licz3 If Licz3 = 10 Then 'cos End If Else If Licz3 > 1 Then If Licz3 < 10 Then Flaga_ok = 1 End If End If Licz3 = 0 End If 'right If Sw_right = 0 Then If Licz4 < 255 Then Incr Licz4 If Licz4 = 10 Then 'cos End If Else If Licz4 > 1 Then If Licz4 < 10 Then Flaga_right = 1 End If End If Licz4 = 0 End If 'left If Sw_left = 0 Then If Licz5 < 255 Then Incr Licz5 If Licz5 = 10 Then 'cos End If Else If Licz5 > 1 Then If Licz5 < 10 Then Flaga_left = 1 End If End If Licz5 = 0 End If Return Zegarek: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte Sekunda , Ack I2crbyte Minuta , Ack I2crbyte Godzina , Ack I2crbyte Dzien_tygodnia , Ack I2crbyte Dzien , Ack I2crbyte Miesiac , Ack I2crbyte Rok , Nack I2cstop Sekunda = Makedec(sekunda) : Minuta = Makedec(minuta) : Godzina = Makedec(godzina) Dzien_tygodnia = Makedec(dzien_tygodnia) : Dzien = Makedec(dzien) : Miesiac = Makedec(miesiac) : Rok = Makedec(rok) If Godzina < 10 Then Lcdat 1 , 1 , "0" ; Godzina , 0 Else Lcdat 1 , 1 , Godzina , 0 End If Lcdat 1 , 16 , ":" , 0 If Minuta < 10 Then Lcdat 1 , 21 , "0" ; Minuta , 0 Else Lcdat 1 , 21 , Minuta , 0 End If Lcdat 1 , 36 , ":" , 0 If Sekunda < 10 Then Lcdat 1 , 41 , "0" ; Sekunda , 0 Else Lcdat 1 , 41 , Sekunda , 0 End If If Dzien < 10 Then Lcdat 1 , 60 , "0" ; Dzien , 0 Else Lcdat 1 , 60 , Dzien , 0 End If Lcdat 1 , 72 , "/" , 0 If Miesiac < 10 Then Lcdat 1 , 80 , "0" ; Miesiac , 0 Else Lcdat 1 , 80 , Miesiac , 0 End If Lcdat 1 , 92 , "/" , 0 Lcdat 1 , 100 , Rok , 0 Lcdat 1 , 116 , Nazwa_dnia(dzien_tygodnia) , 0 Return Miganie: Mig = Not Mig Select Case Index Case 0 Offset = 1 Temp_b = Godzina Case 1 Offset = 21 Temp_b = Minuta Case 2 Offset = 60 Temp_b = Dzien Case 3 Offset = 80 Temp_b = Miesiac Case 4 Offset = 100 Temp_b = Rok End Select Select Case Index Case 0 To 4 If Mig = 1 Then If Temp_b > 9 Then Lcdat 1 , Offset , Temp_b , 1 Else Lcdat 1 , Offset , "0" ; Temp_b , 1 End If Else Lcdat 1 , Offset , " " , 1 End If Case 5 If Mig = 1 Then Lcdat 1 , 116 , Nazwa_dnia(dzien_tygodnia) , 1 Else Lcdat 1 , 116 , " " , 1 End If End Select Return Miganie_dwukropek: Mig = Not Mig If Mig = 1 Then Lcdat 1 , 16 , ":" , 0 Lcdat 1 , 36 , ":" , 0 Else Lcdat 1 , 16 , "'" , 0 Lcdat 1 , 36 , "'" , 0 End If Return Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) Wartosc = Makebcd(wartosc) I2cstart I2cwbyte Ds1307w I2cwbyte Numer_b I2cwbyte Wartosc I2cstop End Sub 'OLED Sub Oled(byval Byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Dim Buchstabe As String * 1 Dim Q As Integer Dim H As Integer Dim Temp As Integer Dim Senden As Byte Col = Col + 16 Page = Page + 175 I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Page I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte &H00 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Col 'Bestimmung Page (Y) I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H40 For Q = 1 To 16 Temp = 0 Buchstabe = Mid(text , Q , 1) Temp = Asc(buchstabe) Temp = Temp - 32 Temp = Temp * 8 For H = 1 To 8 Senden = Lookup(temp , Asciitab) I2cwbyte Senden Incr Temp Next H Next Q I2cstop End Sub Sub Oled_init I2cstart I2cwbyte &H78 I2cwbyte &HAE 'DISPLAYOFF I2cwbyte &HD5 'SETDISPLAYCLOCKDIV I2cwbyte &H80 'ratio 0x80 I2cwbyte &H00 'SETMULTIPLEX I2cwbyte &H3F ' 1f 128x32 I2cwbyte &HD3 'SETDISPLAYOFFSET I2cwbyte &H00 I2cwbyte &H40 'SETSTARTLINE I2cwbyte &H8D 'CHARGEPUMP I2cwbyte &H14 'vccstate 14 I2cwbyte &H20 'MEMORYMODE I2cwbyte &H00 ' I2cwbyte &HA1 'A0 upside down SEGREMAP I2cwbyte &HC8 'COMSCANDEC I2cwbyte &HDA 'SETCOMPINS I2cwbyte &H12 ' 02 128x32 12 I2cwbyte &H81 'SETCONTRAST I2cwbyte &HFF 'value 1-->256 I2cwbyte &HD9 'SETPRECHARGE I2cwbyte &HF1 'vccstate f1 I2cwbyte &HDB 'SETVCOMDETECT I2cwbyte &H40 I2cwbyte &HA4 'DISPLAYALLON_RESUME I2cwbyte &HA6 'NORMALDISPLAY I2cwbyte &HAF I2cstop End Sub 'czcionki Font8x8tt: $asm .db 1 , 8 , 8 , 2 .db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ; .db 0 , 0 , 6 , 95 , 6 , 0 , 0 , 0 ; ! .db 0 , 7 , 3 , 0 , 7 , 3 , 0 , 0 ; "" .db 0 , 36 , 126 , 36 , 126 , 36 , 0 , 0 ; # .db 0 , 36 , 43 , 106 , 18 , 0 , 0 , 0 ; $ .db 0 , 99 , 19 , 8 , 100 , 99 , 0 , 0 ; % .db 0 , 54 , 73 , 86 , 32 , 80 , 0 , 0 ; & .db 0 , 0 , 7 , 3 , 0 , 0 , 0 , 0 ; ' .db 0 , 0 , 62 , 65 , 0 , 0 , 0 , 0 .db 0 , 0 , 65 , 62 , 0 , 0 , 0 , 0 .db 0 , 8 , 62 , 28 , 62 , 8 , 0 , 0 ; * .db 0 , 8 , 8 , 62 , 8 , 8 , 0 , 0 ; + .db 0 , 0 , 224 , 96 , 0 , 0 , 0 , 0 ; , .db 0 , 8 , 8 , 8 , 8 , 8 , 0 , 0 ; - .db 0 , 0 , 96 , 96 , 0 , 0 , 0 , 0 ; . .db 0 , 32 , 16 , 8 , 4 , 2 , 0 , 0 ; / .db 0 , 62 , 81 , 73 , 69 , 62 , 0 , 0 ; 0 .db 0 , 0 , 66 , 127 , 64 , 0 , 0 , 0 ; 1 .db 0 , 98 , 81 , 73 , 73 , 70 , 0 , 0 ; 2 .db 0 , 34 , 73 , 73 , 73 , 54 , 0 , 0 ; 3 .db 0 , 24 , 20 , 18 , 127 , 16 , 0 , 0 ; 4 .db 0 , 47 , 73 , 73 , 73 , 49 , 0 , 0 ; 5 .db 0 , 60 , 74 , 73 , 73 , 48 , 0 , 0 ; 6 .db 0 , 1 , 113 , 9 , 5 , 3 , 0 , 0 ; 7 .db 0 , 54 , 73 , 73 , 73 , 54 , 0 , 0 ; 8 .db 0 , 6 , 73 , 73 , 41 , 30 , 0 , 0 ; 9 .db 0 , 0 , 108 , 108 , 0 , 0 , 0 , 0 ; : .db 0 , 0 , 236 , 108 , 0 , 0 , 0 , 0 ; ; .db 0 , 8 , 20 , 34 , 65 , 0 , 0 , 0 ; < .db 0 , 36 , 36 , 36 , 36 , 36 , 0 , 0 ; = .db 0 , 0 , 65 , 34 , 20 , 8 , 0 , 0 ; > .db 0 , 2 , 1 , 89 , 9 , 6 , 0 , 0 ; Print .db 0 , 62 , 65 , 93 , 85 , 30 , 0 , 0 ; @ .db 0 , 126 , 17 , 17 , 17 , 126 , 0 , 0 ; A .db 0 , 127 , 73 , 73 , 73 , 54 , 0 , 0 ; B .db 0 , 62 , 65 , 65 , 65 , 34 , 0 , 0 ; C .db 0 , 127 , 65 , 65 , 65 , 62 , 0 , 0 ; D .db 0 , 127 , 73 , 73 , 73 , 65 , 0 , 0 ; E .db 0 , 127 , 9 , 9 , 9 , 1 , 0 , 0 ; F .db 0 , 62 , 65 , 73 , 73 , 122 , 0 , 0 ; G .db 0 , 127 , 8 , 8 , 8 , 127 , 0 , 0 ; H .db 0 , 0 , 65 , 127 , 65 , 0 , 0 , 0 ; I .db 0 , 48 , 64 , 64 , 64 , 63 , 0 , 0 ; J .db 0 , 127 , 8 , 20 , 34 , 65 , 0 , 0 ; K .db 0 , 127 , 64 , 64 , 64 , 64 , 0 , 0 ; L .db 0 , 127 , 2 , 4 , 2 , 127 , 0 , 0 ; M .db 0 , 127 , 2 , 4 , 8 , 127 , 0 , 0 ; N .db 0 , 62 , 65 , 65 , 65 , 62 , 0 , 0 ; O .db 0 , 127 , 9 , 9 , 9 , 6 , 0 , 0 ; P .db 0 , 62 , 65 , 81 , 33 , 94 , 0 , 0 ; Q .db 0 , 127 , 9 , 9 , 25 , 102 , 0 , 0 ; R .db 0 , 38 , 73 , 73 , 73 , 50 , 0 , 0 ; S .db 0 , 1 , 1 , 127 , 1 , 1 , 0 , 0 ; T .db 0 , 63 , 64 , 64 , 64 , 63 , 0 , 0 ; U .db 0 , 31 , 32 , 64 , 32 , 31 , 0 , 0 ; V .db 0 , 63 , 64 , 60 , 64 , 63 , 0 , 0 ; W .db 0 , 99 , 20 , 8 , 20 , 99 , 0 , 0 ; X .db 0 , 7 , 8 , 112 , 8 , 7 , 0 , 0 ; Y .db 0 , 113 , 73 , 69 , 67 , 0 , 0 , 0 ; Z .db 0 , 0 , 127 , 65 , 65 , 0 , 0 , 0 ; [ .db 0 , 2 , 4 , 8 , 16 , 32 , 0 , 0 ; \ .db 0 , 0 , 65 , 65 , 127 , 0 , 0 , 0 ; ] .db 0 , 4 , 2 , 1 , 2 , 4 , 0 , 0 ; ^ .db 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 .db 0 , 0 , 3 , 7 , 0 , 0 , 0 , 0 ; ` .db 0 , 32 , 84 , 84 , 84 , 120 , 0 , 0 ; A .db 0 , 127 , 68 , 68 , 68 , 56 , 0 , 0 ; B .db 0 , 56 , 68 , 68 , 68 , 40 , 0 , 0 ; C .db 0 , 56 , 68 , 68 , 68 , 127 , 0 , 0 ; D .db 0 , 56 , 84 , 84 , 84 , 8 , 0 , 0 ; E .db 0 , 8 , 126 , 9 , 9 , 0 , 0 , 0 ; F .db 0 , 24 , 164 , 164 , 164 , 124 , 0 , 0 ; G .db 0 , 127 , 4 , 4 , 120 , 0 , 0 , 0 ; H .db 0 , 0 , 0 , 125 , 64 , 0 , 0 , 0 ; I .db 0 , 64 , 128 , 132 , 125 , 0 , 0 , 0 ; J .db 0 , 127 , 16 , 40 , 68 , 0 , 0 , 0 ; K .db 0 , 0 , 0 , 127 , 64 , 0 , 0 , 0 ; L .db 0 , 124 , 4 , 24 , 4 , 120 , 0 , 0 ; M .db 0 , 124 , 4 , 4 , 120 , 0 , 0 , 0 ; N .db 0 , 56 , 68 , 68 , 68 , 56 , 0 , 0 ; O .db 0 , 252 , 68 , 68 , 68 , 56 , 0 , 0 ; P .db 0 , 56 , 68 , 68 , 68 , 252 , 0 , 0 ; Q .db 0 , 68 , 120 , 68 , 4 , 8 , 0 , 0 ; R .db 0 , 8 , 84 , 84 , 84 , 32 , 0 , 0 ; S .db 0 , 4 , 62 , 68 , 36 , 0 , 0 , 0 ; T .db 0 , 60 , 64 , 32 , 124 , 0 , 0 , 0 ; U .db 0 , 28 , 32 , 64 , 32 , 28 , 0 , 0 ; V .db 0 , 60 , 96 , 48 , 96 , 60 , 0 , 0 ; W .db 0 , 108 , 16 , 16 , 108 , 0 , 0 , 0 ; X .db 0 , 156 , 160 , 96 , 60 , 0 , 0 , 0 ; Y .db 0 , 100 , 84 , 84 , 76 , 0 , 0 , 0 ; Z .db 0 , 8 , 62 , 65 , 65 , 0 , 0 , 0 ; { .db 0 , 0 , 0 , 119 , 0 , 0 , 0 , 0 ; | .db 0 , 0 , 65 , 65 , 62 , 8 , 0 , 0 ; } .db 0 , 2 , 1 , 2 , 1 , 0 , 0 , 0 ; ~ $end Asm Będę przeogromnie wdzięczny za pomoc
![Sarkazm ;)](./images/smilies/icon_e_wink.gif)