En mycket god ROBOT med mikrokontroller 89c 51. (5 / 6 steg)
Steg 5: programmering
; P0.0 = M1 FRAMÅT RELAY
; P0.1 = M1 OMVÄND RELAY
; P0.2 = M2 FRAMÅT RELAY
; P0.3 = M2 OMVÄND RELAY
; P0.4 = M3 FRAMÅT RELAY
; P0.5 = M3 OMVÄND RELAY
; P0.6 = M4 FRAMÅT RELAY
; P0.7 = M4 OMVÄND RELAY
;
; P0.0 = LCD-D0
; P0.0 = LCD-D1
; P0.0 = LCD-D2
; P0.0 = LCD-D3
; P0.0 = LCD-D4
; P0.0 = LCD-D5
; P0.0 = LCD-D6
; P0.0 = LCD D7
;
; P2.0 = FAN
; P2.1 =
; P2.2 = LIMT VÄXEL 1
; P2.3 = MOTTAGNA DATA
; P2.4 = MOTTAGNA DATA LSB
; P2.5 = MOTTAGNA DATA LSB + 1
; P2.6 = MOTTAGNA DATA LSB + 2
; P2.7 = MOTTAGNA DATA MSB
;
; P3.0 =
; P3.1 =
; P3.2 = LCD-RS
; P3.3 = LCD-R/W
; P3.4 = LCD-E
; P3.5 =
; P3.6 =
; P3.7 =
; Programmet börjar här
ORG 0000H; START
MOV P0, #00 H
MOV P2, #OFOH
SETB P2.3
MOV DPTR, #COMM1; KOMMANDOT REGISTER
UPI: CLR. INITIERAS AV COMM1 STRÄNG
MOVC EN,
INC DPTR
CJNE A, #' $', COMMAND1
Här:
MOV, #80 TIM. STARTADRESSEN FÖR LINJE 1
AKALLAR KOMMANDO
MOV DPTR, #DATA 1. VISA DATA
LCALL LINE_DISPLAY_ROLL
HERE1:
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA2
LCALL LINE_DISPLAY
LCALL CHECK_INPUT
CJNE A, #00 H, NEXT1
MOV P0, #05 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, # UPPGIFTER3
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
COMMAND1: AKALLAR KOMMANDO
AJMP UP1
NEXT1:
CJNE A, #01 H, NEXT2
MOV P0, #0AH
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, ## 0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA4
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT2:
CJNE A, #02 H, NEXT3
MOV P0, #09 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #OCOH; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA5
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT3:
CJNE A, #03 H, NEXT4
MOV P0, #06 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA6
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT4:
CJNE A, #04 H, NEXT5
MOV P0, #10 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA7
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT5:
CJNE A, #05 H, NEXT6
MOV P0, #20 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA8
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT6:
CJNE A, #06 H, NEXT7
MOV P0, #40 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA9
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT7:
CJNE A, #07 H, NEXT8
MOV P0, #80 H
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA10
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT8:
CJNE A, #08 H, NEXT9
SETB P2.0;(CONDITIONAL.. OM LAGT EXTRA FUNKTIONER)
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA11
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXT9:
CJNE A, #09 H, NEXTA
CLR P2.0; (VILLKORLIG... OM LAGT EXTRA FUNKTIONER)
LCALL FÖRDRÖJNING
LCALL FÖRDRÖJNING
MOV, #0C0H; STARTADRESSEN FÖR LINJE 2
AKALLAR KOMMANDO
MOV DPTR, #DATA12
LCALL LINE_DISPLAY
LCALL CHECK_KEY_RELEASE
LJMP HERE1; LOOP HÄR EFTER VISNING
NEXTA:
LJMP HERE1; LOOP HÄR EFTER VISNING
LINE_DISPLAY:
CLR A
MOVC EN,
INC DPTR
CJNE A, #' $', DISPLAY1
RET
DISPLAY1: AKALLAR DISPLAY
AJMP LINE_DISPLAY
LINE_DISPLAY_ROLL:
LCALL FÖRDRÖJNING
CLR A
MOVC EN,
INC DPTR
CJNE A, #' $', DISPLAY11
RET
DISPLAY11: AKALLAR DISPLAY
AJMP LINE_DISPLAY_ROLL
FÖRSENING: MOV R7, #0FFH
LOOP1: MOV R6, #0FFH
SLINGA: DJNZ R6, LOOP
DJNZ R7, LOOP1
RET
;************************************************************************************************
; LCD-STROBE KOMMANDO
KOMMANDO: AKALLAR REDO; SKRIVA NÄR DISPLAYEN INTE ÄR UPPTAGEN
MOV P1, A; KOMMANDOT TECKEN I PORT P1
CLR P3.2; KOMMANDOT REGISTER SOM VALTS
CLR P3.3; SKRIV AKTIVERA
SETB P3.4; STROBE KARAKTÄR ATT VISAS
CLR P3.4
RET; RETURNERA
;************************************************************************************************
DISPLAY: AKALLAR REDO
MOV P1, A; TA DATA SOM SKA VISAS
SETB P3.2; PS = P3.2 = 1 TILL VÄLJ DATAREGISTER
CLR P3.3; SKRIV AKTIVERA
SETB P3.4; STROBE KARAKTÄR ATT VISAS
CLR P3.4
RET; RETURNERA
;************************************************************************************************
KLAR: CLR P3.4; STROBE UPPVISNING
MOV P1, #0FFH; KONFIGURERA P1 FÖR INPUT
CLR P3.2; VÄLJ KOMMANDOT REGISTER
SETB P3.3; LÄS AKTIVERA
VÄNTA: CLR P3.4; STROBE UPPVISNING
SETB P3.4
JB P1.7, VÄNTA; LÄS UPPTAGEN STATUS (BF = 0)
CLR P3.4; SLUTET DISPLAY STROBE.
RET; RETURNERA
; ************************************************************************************************
COMM1: DB 3CH, 0EH, 06, 01H, '$'
DATA1: DB "BEBIL'S-ROBOT, $"
DATA2: DB "INSTRUCTABLES, $"
UPPGIFTER3: DB "FRAMÅT $"
DATA4: DB "BAKÅT $"
DATA5: DB 'VÄNSTER $'
DATA6: DB "RÄTT $"
DATA7: DB "KAMERA VÄNSTER $"
DATA8: DB "KAMERAN RÄTT $"
DATA9: DB "KAMERA UPP $"
DATA10: DB "KAMERA NER$"
DATA11: DB 'VALFRIA $'
DATA12: DB 'VALFRIA $'
CHECK_INPUT:
MOV P2, #0F0H
SETB P2.3
JB P2.3, READ_INPUT
NOP
SJMP CHECK_INPUT
READ_INPUT:
MOV P0, #00 H
LCALL FÖRDRÖJNING
MOV, P2
ANL A, #0F0H
SWAP A
RET
CHECK_KEY_RELEASE:
SETB P2.3
NOP
JB P2.3, CHECK_KEY_RELEASE
SETB P2.3
MOV P0, #00 H
RET