Code:
; " Micro-Bot "
; Intel 8749H Micro Program For Programmable Mobile Robot
org 0 ; Start at 0.
sel rb0 ; Select register bank 0
mov r0,#18h ; Set DIRECTION ram location pointer.
mov r1,#19h ; Set TIME ram location pointer.
begin: mov a,#0ffh ; Load clear display bits
outl bus,a ; Clear Display.
mov a,#0f0h ; Bits to Halt all motors ( CLR P1.0 )
outl p1,a ; Halt Motors.
clr a ; Clear Accumulator.
in a,p2 ; Get user keyPad input.
cpl a ; Invert keypad entry 0 = 1.
jb0 fwd ; If Acc Bit 0 = 1 goto fwd
jb1 rvs ; If Acc Bit 1 = 1 goto rvs
jb2 left ; If Acc Bit 2 = 1 goto left
jb3 right ; If Acc Bit 3 = 1 goto right
jb4 clear ; If Acc Bit 4 = 1 goto clear / clear ram
jb5 run ; If Acc Bit 7 = 1 goto run / execute pgm
jb6 time ; If Acc Bit 6 = 1 goto time / set time
jb7 pause ; Pause / Stop routine.
jmp begin ; Recycle until Keypress detected.
clear: mov r0,#18h ; TIME + DIRECTION Ram Clearing routine.
mov r3,#68h ; 18H = Ram location #24d
mov a,#0 ; Zero's for ram locations.
incrt: mov @r0,a ;
inc r0 ;
djnz r3,incrt ; Loop until all ram locations
mov r0,#18h ; have been cleared, then goto begin.
jmp begin ;
fwd: mov @r0,#0f1h ; Move to the address indicated in R0
inc r0 ; the output bits for FORWARD motion
inc r0 ; then increment R0 to next available
mov a,#1 ; direction ram location.
outl bus,a ; Output a # 1 to display
fwd1: jt0 $ ; Loop here until the T0 input = 0
clr a ; 0 indicates user pressed ENTER Key.
jmp begin ; Goto routine BEGIN, wait for more input.
rvs: mov @r0,#0f7h ;
inc r0 ; Same as FWD routine for REVERSE direction.
inc r0 ;
mov a,#2 ; Load # 2 into ACC.
outl bus,a ; Output # 2 to display.
rvs1: jt0 $ ; Stay here until user presses enter key.
clr a ; Clear ACC.
jmp begin ; Go wait for input.
left: mov @r0,#0f5h ; Left Direction.
inc r0 ; DITTO.
inc r0 ;
mov a,#3
outl bus,a
left1: jt0 $ ; DITTO.
clr a
jmp begin
right: mov @r0,#0f3h ;
inc r0 ; DITTO.
inc r0 ;
mov a,#4 ; Load # 4
outl bus,a ; Display # 4
right1: jt0 $ ; DITTO.
clr a
jmp begin
pause: mov @r0,#0f0h ; Output bits to stop motors
inc r0
inc r0
mov a,#00 ; Show 0's on display for Pause indication.
outl bus,a
pause1: jt0 $ ; DITTO.
clr a ;
jmp begin
run: mov r0,#18h ; Load DIRECTION Ram address.
mov r1,#19h ; Load TIME Ram address.
run1: mov a,@r0 ; Move DIRECTION bits to ACC.
jz begin ; If ACC = 0 ( END RUN ) goto begin.
outl p1,a ; Output DIRECTION bits to motors on P1.
inc r0 ; Increment DIRECTION ram address
inc r0 ; to next DIRECTION location.
call speed ; Go get time to proceed in selected
jmp run1 ; direction, then return if finished.
speed: clr a ; Start here / Clear Acc.
mov a,@r1 ; Get selected TIME bits from ram.
call timer ; Goto Routine for time delay.
inc r1 ; Increment too next TIME ram address.
inc r1 ;
ret ; Return to calling routine.
time: inc @r1 ; Make sure r1 isnt = 0 at first, and
mov a,@r1 ; then increment for next numbers.
add a,#display ; Add Lookup table address to ACC.
movp a,@a ; Move page to A addressed by A.
outl bus,a ; Output the selected TIME to the display.
call delay ; Delay between display digit updates.
jz reload ; If A=0 goto subroutine Reload, else continue.
jnt0 done ; If enter key pressed goto done.
jt0 time ; If enter key not pressed recycle
; And keep updating the display.
reload: mov @r1,#00H ; Reload TIME ram address with 00's
jmp time ; and start over from # 1.
done: inc r1 ; If user pressed ENTER we come here
inc r1 ; increment to next TIME ram location
jmp begin ; then go get more input.
delay: mov r5,#2 ; Routine to establish about .5 seconds
; between display updates.
delay1: djnz r5,delay2 ;
ret ;
delay2: mov r6,#0ffh ;
delay3: mov r7,#0ffh ;
djnz r7,$ ;
djnz r6,delay3 ;
jmp delay1 ;
timer: mov r7,#30 ; Timer routine for approx 1 second.
mov r6,#0ffh ;
dis tcnti ; Dissable Timer/Counter interupt.
add a,#1 ; Will cycle through until R5 = 0.
mov r5,a ; Move user selected TIME data to R5.
timer1: clr a ;
mov t,a ; 3.57 Mhz crystal must be used
strt t ; for this routine to be effective.
djnz r5,timer2 ; Decrement R5 then if not = 0 goto timer2.
stop tcnt ; Stop timer/counter.
ret ; Return to calling routine.
timer2: jtf timer3 ; Jump on timer overflow to timer3 routine.
timer3: djnz r6,timer2 ;
jmp timer4 ;
timer4: mov r6,#0ffh ;
djnz r7,timer2 ; Loop until R7 = 0
jmp timer1 ;
display: nop ; Define bytes for display.
db 1 ; 1 To 60 Seconds.
db 2 ;
db 3 ;
db 4 ;
db 5 ;
db 6 ;
db 7 ;
db 8 ;
db 9 ;
db 10h ;
db 11h ;
db 12h ;
db 13h ;
db 14h ;
db 15h ;
db 16h ; At 60 seconds the display will reset
db 17h ; To 00 and start counting again from
db 18h ; 1.
db 19h ;
db 20h ; More time may be added to the Code,
db 21h ; by user if needed.
db 22h ;
db 23h ;
db 24h ;
db 25h ;
db 26h ;
db 27h ;
db 28h ;
db 29h ;
db 30h ;
db 31h ;
db 32h ;
db 33h ;
db 34h ;
db 35h ;
db 36h ;
db 37h ;
db 38h ;
db 39h ;
db 40h ;
db 41h ;
db 42h ;
db 43h ;
db 44h ;
db 45h ;
db 46h ;
db 47h ;
db 48h ;
db 49h ;
db 50h ;
db 51h ;
db 52h ;
db 53h ;
db 54h ;
db 55h ;
db 56h ;
db 57h ;
db 58h ;
db 59h ;
db 60h ; Output a number 60 to display
db 0 ; If count over 60 seconds start over at 0.
End ; That's All Folk's
Yikes...;o)
Bookmarks