0% found this document useful (0 votes)
230 views

Microcomputer Lab Manual

This document contains code for controlling a stepper motor using virtual I/O ports. It defines data for clockwise and counter-clockwise half-step and full-step rotation. The code waits for the motor to be ready, sends rotation data to the port, increments steps and direction, and loops continuously to rotate the motor.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
230 views

Microcomputer Lab Manual

This document contains code for controlling a stepper motor using virtual I/O ports. It defines data for clockwise and counter-clockwise half-step and full-step rotation. The code waits for the motor to be ready, sends rotation data to the port, increments steps and direction, and loops continuously to rotate the motor.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 6

this is an example of out instruction.

; it writes values to virtual i/o port


; that controls the stepper-motor.
; c:\emu8086\devices\stepper_motor.exe is on port 7
#start=stepper_motor.exe#
name "stepper"
#make_bin#
steps_before_direction_change = 20h ; 32 (decimal)
jmp start

; ========= data ===============

; bin data for clock-wise


; half-step rotation:
datcw db 0000_0110b
db 0000_0100b
db 0000_0011b
db 0000_0010b

; bin data for counter-clock-wise


; half-step rotation:
datccw db 0000_0011b
db 0000_0001b
db 0000_0110b
db 0000_0010b

; bin data for clock-wise


; full-step rotation:
datcw_fs db 0000_0001b
db 0000_0011b
db 0000_0110b
db 0000_0000b

; bin data for counter-clock-wise


; full-step rotation:
datccw_fs db 0000_0100b
db 0000_0110b
db 0000_0011b
db 0000_0000b

start:
mov bx, offset datcw ; start from clock-wise half-step.
mov si, 0
mov cx, 0 ; step counter

next_step:
; motor sets top bit when it's ready to accept new command
wait: in al, 7
test al, 10000000b
jz wait

mov al, [bx][si]


out 7, al

inc si

cmp si, 4
jb next_step
mov si, 0

inc cx
cmp cx, steps_before_direction_change
jb next_step

mov cx, 0
add bx, 4 ; next bin data

cmp bx, offset datccw_fs


jbe next_step

mov bx, offset datcw ; return to clock-wise half-step.

jmp next_step

; this example shows how to access virtual ports (0 to 65535).


; these ports are emulated in this file: c:\emu8086.io

; this technology allows to make external add-on devices


; for emu8086, such as led displays, robots, thermometers, stepper-motors, etc... etc...

; anyone can create an animated virtual device.

#start=led_display.exe#

#make_bin#

name "led"

mov ax, 1234


out 199, ax

mov ax, -5678


out 199, ax

; Eternal loop to write


; values to port:
mov ax, 0
x1:
out 199, ax
inc ax
jmp x1

hlt

; this sample checks if string is a palindrome or not.


; palindrome is a text that can be read backwards
; and give the same meaning as if it was read forward.
; for example: "abba" is polindrome.
; note: this program is case sensitive, "abba" is not "abba".

name "pali"

org 100h

jmp start

m1:
s db 'SARAVVARAS'
s_size = $ - m1
db 0Dh,0Ah,'$'

start:

; first let's print it:


mov ah, 9
mov dx, offset s
int 21h

lea di, s
mov si, di
add si, s_size
dec si ; point to last char!

mov cx, s_size


cmp cx, 1
je is_palindrome ; single char is always palindrome!

shr cx, 1 ; divide by 2!


next_char:
mov al, [di]
mov bl, [si]
cmp al, bl
jne not_palindrome
inc di
dec si
loop next_char

is_palindrome:
; the string is "palindrome!"
mov ah, 9
mov dx, offset msg1
int 21h
jmp stop

not_palindrome:
; the string is "not palindrome!"
mov ah, 9
mov dx, offset msg2
int 21h
stop:

; wait for any key press:


mov ah, 0
int 16h

ret

name "flags"
org 100h
; this sample shows how cmp instruction sets the flags.
; usually cmp instruction is followed by any relative
; jump instruction such as: je, ja, jl, jae...
; it is recommended to click "flags" and "analyze"
; for better visual expirience before stepping through this code.
; (signed/unsigned)
; 4 is equal to 4
mov ah, 4
mov al, 4
cmp ah, al
nop
; (signed/unsigned)
; 4 is above and greater then 3
mov ah, 4
mov al, 3
cmp ah, al
nop
; -5 = 251 = 0fbh

; (signed)
; 1 is greater then -5
mov ah, 1
mov al, -5
cmp ah, al
nop

; (unsigned)
; 1 is below 251
mov ah, 1
mov al, 251
cmp ah, al
nop

; (signed)
; -3 is less then -2
mov ah, -3
mov al, -2
cmp ah, al
nop

; (signed)
; -2 is greater then -3
mov ah, -2
mov al, -3
cmp ah, al
nop

; (unsigned)
; 255 is above 1
mov ah, 255
mov al, 1
cmp ah, al
nop

; now a little game:


game: mov dx, offset msg1
mov ah, 9
int 21h

; read character in al:


mov ah, 1
int 21h
cmp al, '0'
jb stop

cmp al, '9'


ja stop

cmp al, '5'


jb below
ja above
mov dx, offset equal_5
jmp print
below: mov dx, offset below_5
jmp print
above: mov dx, offset above_5
print: mov ah, 9
int 21h
jmp game ; loop.
stop: ret ; stop
msg1 db "enter a number or any other character to exit: $"
equal_5 db " is five! (equal)", 0Dh,0Ah, "$"
below_5 db " is below five!" , 0Dh,0Ah, "$"
above_5 db " is above five!" , 0Dh,0Ah, "$"

You might also like