Otóż, mam licznik w assemblerze na LCD, kodzik poniżej, mam pytanie, jak zrobić by licznik przyspieszał i zwalniał po naciśnięciu przycisku?
Symulator edsim51, myślałem o zmienianiu w czasie rzeczywistym update frequency, tylko jak to zmienić? W assemblerze? Niestety nie mogę sobie klikać na update frequency pokazując program wykładowcy :)

Proszę o szybką pomoc, przeszukałem angielskie fora i nigdzie nie mam rozwiązania co do update frequency :)

     MOV 30H, #' '
        MOV 31H, #' '
        MOV 32H, #' '
        MOV 33H, #' '
        MOV 34H, #' '
        MOV 35H, #' '
        MOV 36H, #' '
        MOV 37H, #' '
        MOV 38H, #' '
        MOV 39H, #' '
        MOV 3AH, #'0'
        MOV 3BH, #'0'
        MOV 3CH, #'0'
        MOV 3DH, #'0'
        MOV 3EH, #'0'
        MOV 3FH, #'0'
                CLR 40H                 ;znak konca linii dla algorytmu pozniej
                
                MOV R2, #10
                MOV R3, #10
                MOV R4, #10
                MOV R5, #10
                MOV R6, #10
                MOV R7, #10




; inicjalizacja LCD - zrodlo: przyklady z edsim51.com

        CLR P1.3                ; poczatek wysylania instrukcji sterujacych do LCD (RS = 0)

        CLR P1.7        ;0      ;ustawienie trybu 4 bitowego 
        CLR P1.6                ;0
        SETB P1.5       ;1
        CLR P1.4        ;0      ;koniec ustawiania trybu  
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        SETB P1.2       ;1              ;przelaczenie 'wajchy' konca 4 bitow komendy
        CLR P1.2        ;0        

        CALL delay                      ;opoznienie zeby wyswietlacz mogl przetworzyc       
                                        
        SETB P1.2       ;1              ;przelaczenie 'wajchy' konca 4 bitow komendy bez zmiany wartosci               
        CLR P1.2                ;bo po przestawieniu trybu wysylamy komende do konca czyli to co dalej
                        

        SETB P1.7               ; druga czesc komendy rozni sie wlasnie ta jedynka aby ustawic na 2 linie LCD

        SETB P1.2       ;1              ;przelaczenie 'wajchy' konca kolejnych4 bitow komendy        
        CLR P1.2                
                                        
        CALL delay              


;//ustalenie inkrementacji pol pamieci i brak przsuniecia ekranu
        CLR P1.7                
        CLR P1.6                
        CLR P1.5                
        CLR P1.4                

        SETB P1.2               
        CLR P1.2                

        SETB P1.6               
        SETB P1.5               

        SETB P1.2               
        CLR P1.2                

        CALL delay              

;//wlaczenie wyswietlacza, wlaczenie kursora, wlaczenie 'mrugania'

        CLR P1.7                
        CLR P1.6                
        CLR P1.5                
        CLR P1.4                

        SETB P1.2               
        CLR P1.2                

        SETB P1.7               
        SETB P1.6               
        SETB P1.5               
        SETB P1.4               

        SETB P1.2               
        CLR P1.2                

        CALL delay              

duzapetla:      ; poczatek glownej petli programu       


; instrukcja sterujaca ustawiajaca "kursor" 
; wyswietlacza do poczatku linii 1  
; oczekiwanie musi byc potem na 1520 ->delay1  

CLR P1.7 
CLR P1.6 
CLR P1.5 
CLR P1.4  

SETB P1.2  
CLR P1.2  

CLR P1.7  
CLR P1.6 
SETB P1.5  
CLR P1.4  

SETB P1.2  
CLR P1.2

CALL delay1


; wysylanie danych(linia 1) do LCD
        SETB P1.3               ; (RS = 1) LCD przyjmuje dane, nie instrukcje
        MOV R1, #30H            ; ustawia poczatek napisu w R1
malapetla1:
        MOV A, @R1              ; R1 -> Akumulator
        JZ end1              ; jump (do koniec) if (A) zero
        CALL wyslijDane      ; wysyla dane z A do LCD
        INC R1                  ; inkrementacja numeru komorki pamieci z napisem=nastepny znak z pamieci
        JMP malapetla1          ; petla
end1:
        INC 3FH                                         ;zwieksza cyfre na ostanim miejscu
        DEC R2                                          ;zmniejsza wartosc pomocnicza
        CALL jednosci                           ;sprawdza czy juz ma uzupelnic
        JMP end2                                        ;to w zasadzie niepotrzebne bo i tak powinien pojsc do end2 takze mozecie wywalic ;p

end2:

                ;;obsluga klawisza
        CLR P0.0                ; clear row0
        CALL Scan               ; call column-scan subroutine
        JB F0, end2                             ;jesli jest 1 to znaczy ze nic nie jest wcisniete 
                                                                ;i zapetla sie do sprawdzania znow czy cos jest wcisniete
                                                                ;a jesli jest 0 to idzie dalej bo klawisz jest wcisniety
        CLR P1.3 ;ekran odbiera instrukcje
jmp duzapetla   ; koniec glownej petli


; przesyl liter do LCD (zrodlo: przyklady edsim51.com)

wyslijDane:
        MOV C, ACC.7                    ;przesyla bit do CARRY-ja mysle ze to taki nosnik pomocniczy ;p            
        MOV P1.7, C                   
        MOV C, ACC.6            
        MOV P1.6, C                   
        MOV C, ACC.5            
        MOV P1.5, C                    
        MOV C, ACC.4            
        MOV P1.4, C                    

        SETB P1.2                       
        CLR P1.2                        

        MOV C, ACC.3            
        MOV P1.7, C                    
        MOV C, ACC.2            
        MOV P1.6, C
                MOV C, ACC.1                                
        MOV P1.5, C                    
        MOV C, ACC.0            
        MOV P1.4, C                     

        SETB P1.2                       
        CLR P1.2                        

        CALL delay
                RET             ;tego nie bylo wczesniej a pozwala to ominac jedno opoznienie             

delay:                  ; opoznienie
        MOV R0, #37     ; 37 operacji - wedlug dokumentacji
        DJNZ R0, $      ; dekrementuj i jump ($) if (R0) not zero czyli skacze do poczatku tej samej instrukcji
        RET             ; powrot tam skad opoznienie zostalo wywolane
                
delay1:                                 ;wieksze opoznienie zlozone z kilku
        MOV R0, #255
        DJNZ R0, $
        MOV R0, #255
        DJNZ R0, $
        MOV R0, #255
        DJNZ R0, $
        MOV R0, #255
        DJNZ R0, $
        MOV R0, #255
        DJNZ R0, $
        MOV R0, #255
        DJNZ R0, $
                MOV R0, #10
        DJNZ R0, $
        RET

Scan:
        JNB P0.4, gotKey        ; if col0 is cleared - key found -> 
                                                                ; kolumna ma same zera-przycisk wcisniety skocz do gotKey
        SETB F0                 ; otherwise set F0 -> jesli nie to ustaw F0 na '1'
        RET                     ; return from subroutine - key not found ->
                                                                ; powrot z podprogramu - przycisk nie wcisniety
gotKey:
        CLR F0                  ; key found - clr F0 -> przycisk wcisniety wyczysc F0
        RET
jednosci:
                MOV A, R2                               ; wstaw R2 do A(kumulatora) w celu porownania
                JNZ return                              ; jesli nie jest zerem-jeszcze nie minelo 10 cyfr-to wroc ze sprawdzania
                MOV R2,#10                              ; jesli jest zerem to ustaw R2 na 10 (cyfr)
                MOV 3FH, #'0'                   ; wyzeruj 3FH-ostatnia cyfre
                INC 3EH                                 ; skoro przeskoczyly jednosci to zwieksz dziesiatki
                DEC     R3                                      ; zmniejsz wartosc pomocnicza dla dziesiatek
                CALL dziesiatki                         ; wywolaj sprawdzanie czy nie trzeba juz uzupelnic dziesiatek
                RET                                             ; po wykonaniu poprzednich - powrot

dziesiatki:
                MOV A, R3                               ; wstaw R3 do A(kumulatora) w celu porownania
                JNZ return                              ; jesli nie jest zerem-jeszcze nie minelo 10 cyfr-to wroc ze sprawdzania
                MOV R3, #10                             ; jesli jest zerem to ustaw R3 na 10 (cyfr)
                MOV 3EH, #'0'                   ; wyzeruj 3EH-cyfre dziesiatek
                INC 3DH
                DEC R4
                CALL setki
                RET                                             ; po wykonaniu poprzednich - powrot

setki:
                MOV A,R4
                JNZ return
                MOV R4, #10
                MOV 3DH, #'0'
                INC 3CH
                DEC R5
                CALL tysiace
                RET

tysiace:
                MOV A, R5
                JNZ return
                MOV R5, #10
                MOV 3CH, #'0'
                INC 3BH
                DEC R6
                CALL tysiace1
                RET

tysiace1:
                MOV A, R6
                JNZ return
                MOV R6, #10
                MOV 3BH, #'0'
                INC 3AH
                DEC R7
                CALL tysiace2
                RET 
tysiace2:
                MOV A,R7
                JNZ return
                MOV R7, #10
                MOV 3AH, #'0'

                
return:                                                 ;pomocnicza funkcja powrotu
                RET