Język C
Język C
Chodzi o obiekty poruszające się w pewnym obszarze rejestrowane podczerwienią.
Mam ten program podany w asemblerz do programowania w DSM- 51, a potrzebuje przerobić go na język C wygląda to tak:
ORG 13H
;obsługa przerwania z wejścia INT1
PUSH ACC ;przechowanie akumulatora
PUSH PSW ;i rejestru stanu na stosie
MOV R1,#CSIC ;odczyt ze sterownika przerwań
MOVX A,@R1 ;numeru przerwania
ANL A,#03H
MOVX @R1,A ;skasowanie przerwania
CJNE A,#3,INT_NO3 ;inne przerwanie
;przerwanie IPB - TOR 1
INC R7 ;licznik kolejnych faz ruchu obiektu
MOV A,R7
JB ACC.0,T1_KIER_OK
INC R5 ;przy kierunku nieprawidłowym przerwanie
;IPB dla 2 i 4 fazy ruchu
SJMP OBIEKT
T1_KIER_OK: ;przy kierunku prawidłowym przerwanie
INC R6 ;IPB dla 1 i 3 fazy ruchu
SJMP OBIEKT
INT_NO3:
CJNE A,#2,INT_END ;inne przerwanie-nie wystąpi
;przerwanie IPA - TOR 2
INC R7 ;licznik kolejnych faz ruchu obiektu
MOV A,R7
JNB ACC.0,T2_KIER_OK
INC R5 ;przy kierunku nieprawidłowym przerwanie
;IPA dla 1 i 3 fazy ruchu
SJMP OBIEKT
T2_KIER_OK: ;przy kierunku prawidłowym przerwanie
INC R6 ;IPB dla 1 i 3 fazy ruchu
OBIEKT:
MOV R1,#CS55C ;odczyt stanu na porcie C 8255
MOVX A,@R1
ANL A,#0FH ;tylko młodsza część jest wejściem
CJNE A,#6,INT_END ;czy obiekt w którymś torze podczerwieni
;obiekt już poza licznikiem - analiza kierunku ruchu i prawidłowości przesuwu
CJNE R7,#4,INT_ERROR ;nie było czterech faz ruchu
CJNE R6,#4,OK_NO ;ruch nie był 4 razy sklasyfikowany
;jako w prawidłowym kierunku
INC R2 ;ruch prawidłowy - zwiększam licznik
OK_NO:
CJNE R5,#4,INT_ERROR ;ruch nie był 4 razy sklasyfikowany
;jako w kierunku przeciwnym
DEC R2 ;ruch w kierunku przeciwnym
INT_ERROR:
MOV R7,#0 ;zerownie liczników jednego obiektu
MOV R6,#0
MOV R5,#0
INT_END:
POP PSW ;odtworzenie rejestrów na koniec przerwania
POP ACC
RETI
;**************************************
ORG 0100H
START:
MOV R1,#CS55D ;ustawienie układu 8255
MOV A,#SET_8255
MOVX @R1,A
DEC R1
MOV A,#11101111B ;włączenie nadajnika IR
MOVX @R1,A
LCALL LCD_CLR ;wypisanie napisu na wyświetlaczu LCD
MOV DPTR,#TEXT
LCALL WRITE_TEXT
;zerowanie sterownika przerwań
MOV R1,#CSAD ;skasowanie ewentualnego przerwania
MOVX A,@R1 ;wystawianego przez przetwornik A/C
MOV R1,#CSIC ;skasowanie przerwań 0..3
CLR A ;w sterowniku przerwań
MOVX @R1,A
INC A
MOVX @R1,A
INC A
MOVX @R1,A
INC A
MOVX @R1,A
CLR A
MOV R7,A ;wyzerowanie liczników pojedyńczego obiektu
MOV R6,A
MOV R5,A
MOV R2,A ;wyzerowanie liczników obiektów
MOV R3,A
SETB EA ;włączenie przerwań z wejścia INT1
SETB EX1 ;- tj. sterownika przerwań
CLR INT55 ;uaktywnienie sterownika na przerwania
;z układu 8255
LOOP:
MOV A,R2
CJNE A,B0R3,WRITE ;zapis na LCD dla nowej wartości licznika
SJMP LOOP
WRITE:
MOV R3,A ;zapamiętanie nowej wartości licznika
ACALL KURSOR_2L ;przesunięcie kursora o 2 pozycje w lewo
MOV A,R3
LCALL WRITE_HEX ;wyświetlenie nowej wartości licznika
SJMP LOOP
;**************************************
TEXT:
DB 'Liczba obiektow GORA -> DOL 00',0
;**************************************
;podprogram przesuwający kursor o 2 pozycje w lewo
KURSOR_2L:
MOV A,#10H ;kod rozkazu dla wyświetlacza LCD
LCALL WRITE_INSTR ;przesunięcia kursora w lewo
MOV A,#10H
LCALL WRITE_INSTR
RET
Mam ten program podany w asemblerz do programowania w DSM- 51, a potrzebuje przerobić go na język C wygląda to tak:
ORG 13H
;obsługa przerwania z wejścia INT1
PUSH ACC ;przechowanie akumulatora
PUSH PSW ;i rejestru stanu na stosie
MOV R1,#CSIC ;odczyt ze sterownika przerwań
MOVX A,@R1 ;numeru przerwania
ANL A,#03H
MOVX @R1,A ;skasowanie przerwania
CJNE A,#3,INT_NO3 ;inne przerwanie
;przerwanie IPB - TOR 1
INC R7 ;licznik kolejnych faz ruchu obiektu
MOV A,R7
JB ACC.0,T1_KIER_OK
INC R5 ;przy kierunku nieprawidłowym przerwanie
;IPB dla 2 i 4 fazy ruchu
SJMP OBIEKT
T1_KIER_OK: ;przy kierunku prawidłowym przerwanie
INC R6 ;IPB dla 1 i 3 fazy ruchu
SJMP OBIEKT
INT_NO3:
CJNE A,#2,INT_END ;inne przerwanie-nie wystąpi
;przerwanie IPA - TOR 2
INC R7 ;licznik kolejnych faz ruchu obiektu
MOV A,R7
JNB ACC.0,T2_KIER_OK
INC R5 ;przy kierunku nieprawidłowym przerwanie
;IPA dla 1 i 3 fazy ruchu
SJMP OBIEKT
T2_KIER_OK: ;przy kierunku prawidłowym przerwanie
INC R6 ;IPB dla 1 i 3 fazy ruchu
OBIEKT:
MOV R1,#CS55C ;odczyt stanu na porcie C 8255
MOVX A,@R1
ANL A,#0FH ;tylko młodsza część jest wejściem
CJNE A,#6,INT_END ;czy obiekt w którymś torze podczerwieni
;obiekt już poza licznikiem - analiza kierunku ruchu i prawidłowości przesuwu
CJNE R7,#4,INT_ERROR ;nie było czterech faz ruchu
CJNE R6,#4,OK_NO ;ruch nie był 4 razy sklasyfikowany
;jako w prawidłowym kierunku
INC R2 ;ruch prawidłowy - zwiększam licznik
OK_NO:
CJNE R5,#4,INT_ERROR ;ruch nie był 4 razy sklasyfikowany
;jako w kierunku przeciwnym
DEC R2 ;ruch w kierunku przeciwnym
INT_ERROR:
MOV R7,#0 ;zerownie liczników jednego obiektu
MOV R6,#0
MOV R5,#0
INT_END:
POP PSW ;odtworzenie rejestrów na koniec przerwania
POP ACC
RETI
;**************************************
ORG 0100H
START:
MOV R1,#CS55D ;ustawienie układu 8255
MOV A,#SET_8255
MOVX @R1,A
DEC R1
MOV A,#11101111B ;włączenie nadajnika IR
MOVX @R1,A
LCALL LCD_CLR ;wypisanie napisu na wyświetlaczu LCD
MOV DPTR,#TEXT
LCALL WRITE_TEXT
;zerowanie sterownika przerwań
MOV R1,#CSAD ;skasowanie ewentualnego przerwania
MOVX A,@R1 ;wystawianego przez przetwornik A/C
MOV R1,#CSIC ;skasowanie przerwań 0..3
CLR A ;w sterowniku przerwań
MOVX @R1,A
INC A
MOVX @R1,A
INC A
MOVX @R1,A
INC A
MOVX @R1,A
CLR A
MOV R7,A ;wyzerowanie liczników pojedyńczego obiektu
MOV R6,A
MOV R5,A
MOV R2,A ;wyzerowanie liczników obiektów
MOV R3,A
SETB EA ;włączenie przerwań z wejścia INT1
SETB EX1 ;- tj. sterownika przerwań
CLR INT55 ;uaktywnienie sterownika na przerwania
;z układu 8255
LOOP:
MOV A,R2
CJNE A,B0R3,WRITE ;zapis na LCD dla nowej wartości licznika
SJMP LOOP
WRITE:
MOV R3,A ;zapamiętanie nowej wartości licznika
ACALL KURSOR_2L ;przesunięcie kursora o 2 pozycje w lewo
MOV A,R3
LCALL WRITE_HEX ;wyświetlenie nowej wartości licznika
SJMP LOOP
;**************************************
TEXT:
DB 'Liczba obiektow GORA -> DOL 00',0
;**************************************
;podprogram przesuwający kursor o 2 pozycje w lewo
KURSOR_2L:
MOV A,#10H ;kod rozkazu dla wyświetlacza LCD
LCALL WRITE_INSTR ;przesunięcia kursora w lewo
MOV A,#10H
LCALL WRITE_INSTR
RET