Click here to Skip to main content
15,896,912 members
Articles / Desktop Programming / Win32

Stepper Motor and 7 Segment Display Control with Parallel Port

Rate me:
Please Sign up or sign in to vote.
4.98/5 (32 votes)
31 Dec 2008GPL312 min read 305.4K   2K   68  
Stepper motor And seven-segment display control with parallel port using Assembly Language
;-----------------------------------------
;--- TERM PROJECT                      ---
;--- STEPPER MOTOR WITH 7 SEGMENT      ---
;--- LECTURE: MICROPROCESSORS          ---
;--- LECTURER: HOSSEIN MEHRABANI       ---
;--- CODED BY: SAMET KILICTAS          ---
;--- STUDENT NUMBER: 20040283          ---
;--- E-MAIL: SAMET@KILICTAS.COM        ---
;--- CYPRUS INTERNATIONAL UNIVERSITY   ---
;--- 26-05-2008                        ---
;-----------------------------------------
;THE REQUIRED MACROS FOR PROGRAM---------------------------
;----------------------------------------------------------
CURS_POSITION 	MACRO ROW,COLUMN
		MOV BH,00
		MOV AH,02
		MOV DH,ROW
		MOV DL,COLUMN
		INT 10H
		ENDM
;----------------------------------------------------------
CLS_SCREEN MACRO
	   MOV AX,0600H
	   mov bh,00                 
           mov bh,0ah  
	   MOV CX,0
	   MOV DX,184FH
	   INT 10H
	   ENDM
;----------------------------------------------------------
SHOW_INSCREEN MACRO STRING
	      MOV AH,09
	      MOV DX,OFFSET STRING
	      INT 21H
	      ENDM
;----------------------------------------------------------
PINS_OUT MACRO SEND
	MOV CX,SEND
	;AND CL,0fh
	;OR CL,CONSTANTBCD
	MOV DX,378H
	MOV AL,OFFSET SEND
	OUT DX,AL
	ENDM
;----------------------------------------------------------
;PROGRAM STARTS FROM THIS POINT
;----------------------------------------------------------
.MODEL HUGE
.STACK 2000
.DATA
	INSTMSG1 DB 'INTRUCTIONS:','$'
	INSTMSG2 DB 'SPEED UP: W','$'
	INSTMSG3 DB 'SPEED DOWN: S','$'
	INSTMSG4 DB 'FORWARD: D','$'
	INSTMSG5 DB 'BACKWARD: A','$'
	INSTMSG6 DB '7 SEGMENT TEST: T BUTTON','$'
	INSTMSG7 DB 'EXIT: E BUTTON','$'
	INSTMSG8 DB 'PRESS B BUTTON TO MAIN MENU','$'
	INSTMSG9 DB 'PAUSE: P','$'
	H_SYMBOL DB '---------------------------------------------','$'
	MSG1 DB 'PROJECT : STEPPER CONTROLLER WITH 7 SEGMENT DISPLAY','$'
	MSG2 DB 'LECTURE : MICROPROCESSORS [LECTURER : HOSSEIN MEHRABANI]','$'
	MSG3 DB 'CODING  : SAMET KILICTAS [NO -> 20040283] [CYPRUS INTERNATIONAL UNIVERSITY]','$'
	MSG4 DB 'MOTOR STATUS :','$'
	MSG5 DB 'PRESS H BUTTON FOR INSTRUCTIONS...','$'
	MSG6 DB 'DIRECTION :  ?','$'
	MSG7 DB 'SPEED  : ?','$'	
	MSG8 DB 'EMAIL   : samet@kilictas.com','$'	
	MSG9 DB 'Good Bye..! :)','$'
	MSG_DELETE DB '?                                 ','$'
	MSG10 DB '7 SEGMENT TEST MODE: ?','$'
	MSG11 DB 'ON ','$'
	MSG12 DB 'OFF','$'
	STARTED DB 'RUNNING, PLEASE WAIT!','$'
	STOPPED DB 'STOPPED!                ','$'
	DIRECTION_FORWARD DB 'Clockwise          ','$'
	DIRECTION_BACKWARD DB 'Counter Clockwise','$'
	DIRECTION_SIDE DB 1  
	INTSCREEN_MODE DB 1				; Default is forward 
	COUNT DB 20 ; How many step u need ?????? :)
	CONSTANTBCD DB 00010000B
	SHOWSPEED DB 0
	zero DB	'1 -> 1000MS DELAY','$'
	one DB '2 -> 800MS DELAY ','$'
	two DB '3 -> 700MS DELAY ','$'
	three DB '4 -> 600MS DELAY ','$'
	four DB	'5 -> 500MS DELAY ','$'
	five DB	'6 -> 400MS DELAY ','$'
	six DB '7 -> 300MS DELAY ','$'
	seven DB '8 -> 200MS DELAY ','$'
	eight DB '9 -> 100MS DELAY ','$'
	;-----------------------
.CODE
MAIN:	MOV AX,@DATA
	MOV DS,AX

;*********************************
; Show main screen	

MAINSCREEN: 
	CLS_SCREEN
	CURS_POSITION 2,2	
	SHOW_INSCREEN MSG1
	CURS_POSITION 3,2	
	SHOW_INSCREEN MSG2
	CURS_POSITION 4,2	
	SHOW_INSCREEN MSG3
	CURS_POSITION 5,2
	SHOW_INSCREEN MSG8
	CURS_POSITION 12,2	
	SHOW_INSCREEN MSG4
	CURS_POSITION 13,2
	SHOW_INSCREEN H_SYMBOL
	CURS_POSITION 14,2
	SHOW_INSCREEN MSG6
	CURS_POSITION 15,2
	SHOW_INSCREEN MSG7
	CURS_POSITION 16,2
	SHOW_INSCREEN MSG10
	CURS_POSITION 22,2
	SHOW_INSCREEN MSG5
	CURS_POSITION 30,2
	MOV INTSCREEN_MODE,1


;*****************************************************************
; Important jump point is here **********************************

CHECKPOINT:

; Get input from the keyboard
	MOV AH,07
	INT 21H	

; Save the input
	MOV BL,AL ; Save AL to BL (i.e. The Ascii value of the key hit)

; Check the input character ?????  What i should do ????
	CMP BL,'H'	;H Button
	JNE H1
	JMP INSTSCREEN
H1:	CMP BL,'h'
	JNE H2
	JMP INSTSCREEN
H2:	CMP BL,'P'	;P Button
	JNE P1
	JMP PAUSE
P1:	CMP BL,'p'
	JNE P2
	JMP PAUSE
P2:	CMP BL,'E'	;E Button
	JNE E1
	JMP GOODBYE
E1:	CMP BL,'e'
	JNE E2
	JMP GOODBYE
E2:	CMP BL,'B'	;B Button
	JNE B1
	JMP MAINSCREEN
B1:	CMP BL,'b'
	JNE B2
	JMP MAINSCREEN
B2:	CMP BL,'W'	;W Button
	JNE W1
	JMP SPEEDUP
W1:	CMP BL,'w'
	JNE W2
	JMP SPEEDUP
W2:	CMP BL,'S'	;S Button
	JNE S1
	JMP SPEEDDOWN
S1:	CMP BL,'s'
	JNE S2
	JMP SPEEDDOWN
S2:	CMP BL,'D'	;D Button
	JNE D1
	JMP FORWARD
D1:	CMP BL,'d'
	JNE D2
	JMP FORWARD
D2:	CMP BL,'A'	;A Button
	JNE A1
	JMP BACKWARD
A1:	CMP BL,'a'
	JNE A2
	JMP BACKWARD
A2:	CMP BL,'T'	;T Button
	JNE T1
	JMP SEGMENTTEST
T1:	CMP BL,'t'
	JNE M
	JMP SEGMENTTEST

; If no key exists jump to the mainscreen..!
M:	JMP CHECKPOINT

;*********************************
; Show instruction screen

INSTSCREEN:
	CLS_SCREEN
	CURS_POSITION 2,2	
	SHOW_INSCREEN INSTMSG1
	CURS_POSITION 3,2	
	SHOW_INSCREEN H_SYMBOL
	CURS_POSITION 4,2	
	SHOW_INSCREEN INSTMSG2
	CURS_POSITION 5,2	
	SHOW_INSCREEN INSTMSG3
	CURS_POSITION 6,2	
	SHOW_INSCREEN INSTMSG4
	CURS_POSITION 7,2	
	SHOW_INSCREEN INSTMSG5
	CURS_POSITION 8,2	
	SHOW_INSCREEN INSTMSG6
	CURS_POSITION 9,2	
	SHOW_INSCREEN INSTMSG7
	CURS_POSITION 10,2	
	SHOW_INSCREEN INSTMSG9
	CURS_POSITION 15,2	
	SHOW_INSCREEN INSTMSG8
	CURS_POSITION 50,50
	MOV INTSCREEN_MODE,2
	MOV AL,00
	JMP CHECKPOINT

;*********************************
;All system paused

PAUSE:
	PINS_OUT 11110000B
	CURS_POSITION 16,25
	SHOW_INSCREEN MSG12
	CURS_POSITION 50,50
	JMP CHECKPOINT
	

;*********************************
; Speed up
	
SPEEDUP:
	CMP SHOWSPEED,8
	JE NOG
	ADD SHOWSPEED,1
NOG:	CMP SHOWSPEED,0
	JNE aaaa
	CURS_POSITION 15,11
	SHOW_INSCREEN zero
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00010000B
	PINS_OUT 00010000B
	JMP NOU
aaaa:	CMP SHOWSPEED,1
	JNE qqq
	CURS_POSITION 15,11
	SHOW_INSCREEN one
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00100000B
	PINS_OUT 00100000B
	JMP NOU
qqq:	CMP SHOWSPEED,2
	JNE www
	CURS_POSITION 15,11
	SHOW_INSCREEN two
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00110000B
	PINS_OUT 00110000B
	JMP NOU
www:	CMP SHOWSPEED,3
	JNE eee
	CURS_POSITION 15,11
	SHOW_INSCREEN three
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01000000B
	PINS_OUT 01000000B
	JMP NOU
eee:	CMP SHOWSPEED,4
	JNE rrr
	CURS_POSITION 15,11
	SHOW_INSCREEN four
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01010000B
	PINS_OUT 01010000B
	JMP NOU
rrr:	CMP SHOWSPEED,5
	JNE ttt
	CURS_POSITION 15,11
	SHOW_INSCREEN five
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01100000B
	PINS_OUT 01100000B
	JMP NOU
ttt:	CMP SHOWSPEED,6
	JNE yyy
	CURS_POSITION 15,11
	SHOW_INSCREEN six
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01110000B
	PINS_OUT 01110000B
	JMP NOU
yyy:	CMP SHOWSPEED,7
	JNE uuu
	CURS_POSITION 15,11
	SHOW_INSCREEN seven
	CURS_POSITION 50,50
	MOV CONSTANTBCD,10000000B
	PINS_OUT 10000000B
	JMP NOU
uuu:	CMP SHOWSPEED,8
	CURS_POSITION 15,11
	SHOW_INSCREEN eight
	CURS_POSITION 50,50
	MOV CONSTANTBCD,10010000B
	PINS_OUT 10010000B
NOU:
	JMP CHECKPOINT

;*********************************
; Speed down

SPEEDDOWN:
	CMP SHOWSPEED,0
	JE NOGG
	SUB SHOWSPEED,1
NOGG:	CMP SHOWSPEED,0
	JNE aaaaa
	CURS_POSITION 15,11
	SHOW_INSCREEN zero
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00010000B
	PINS_OUT 00010000B
	JMP NOUU
aaaaa:	CMP SHOWSPEED,1
	JNE qqqq
	CURS_POSITION 15,11
	SHOW_INSCREEN one
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00100000B
	PINS_OUT 00100000B
	JMP NOUU
qqqq:	CMP SHOWSPEED,2
	JNE wwww
	CURS_POSITION 15,11
	SHOW_INSCREEN two
	CURS_POSITION 50,50
	MOV CONSTANTBCD,00110000B
	PINS_OUT 00110000B
	JMP NOUU
wwww:	CMP SHOWSPEED,3
	JNE eeee
	CURS_POSITION 15,11
	SHOW_INSCREEN three
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01000000B
	PINS_OUT 01000000B
	JMP NOUU
eeee:	CMP SHOWSPEED,4
	JNE rrrr
	CURS_POSITION 15,11
	SHOW_INSCREEN four
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01010000B
	PINS_OUT 01010000B
	JMP NOUU
rrrr:	CMP SHOWSPEED,5
	JNE tttt
	CURS_POSITION 15,11
	SHOW_INSCREEN five
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01100000B
	PINS_OUT 01100000B
	JMP NOUU
tttt:	CMP SHOWSPEED,6
	JNE yyyy
	CURS_POSITION 15,11
	SHOW_INSCREEN six
	CURS_POSITION 50,50
	MOV CONSTANTBCD,01110000B
	PINS_OUT 01110000B
	JMP NOUU
yyyy:	CMP SHOWSPEED,7
	JNE uuuu
	CURS_POSITION 15,11
	SHOW_INSCREEN seven
	CURS_POSITION 50,50
	MOV CONSTANTBCD,10000000B
	PINS_OUT 10000000B
	JMP NOUU
uuuu:	CMP SHOWSPEED,8
	CURS_POSITION 15,11
	SHOW_INSCREEN eight
	CURS_POSITION 50,50
	MOV CONSTANTBCD,10010000B
	PINS_OUT 10010000B
NOUU:
	JMP CHECKPOINT

;*********************************
; Show me the step pleasee....

;Forward ---
STF:	MOV COUNT,20
STEPSF:	CALL DELAY
	PINS_OUT 10100011B
	CALL DELAY
	PINS_OUT 11110110B
	CALL DELAY
	PINS_OUT 10101100B
	CALL DELAY
	PINS_OUT 11111001B
	DEC COUNT
	CMP COUNT,0
	JE F
        LOOP STEPSF
F:	CURS_POSITION 12,18
	SHOW_INSCREEN STOPPED
	CURS_POSITION 14,15
	SHOW_INSCREEN MSG_DELETE
	CURS_POSITION 50,50
	JMP CHECKPOINT
	RET

;Backward ---
	
STB:	MOV COUNT,20
STEPSB:	CALL DELAY
	PINS_OUT 10111001B
	CALL DELAY
	PINS_OUT 11111100B
	CALL DELAY
	PINS_OUT 10110110B
	CALL DELAY
	PINS_OUT 11110011B
	DEC COUNT
	CMP COUNT,0
	JE B
        LOOP STEPSB
B:	CURS_POSITION 12,18
	SHOW_INSCREEN STOPPED
	CURS_POSITION 14,15
	SHOW_INSCREEN MSG_DELETE
	CURS_POSITION 50,50
	JMP CHECKPOINT
	RET

;*********************************
; System little forward please

FORWARD:
	MOV DIRECTION_SIDE,1
	CURS_POSITION 14,15
	SHOW_INSCREEN DIRECTION_FORWARD
	CURS_POSITION 12,18
	SHOW_INSCREEN STARTED
	CURS_POSITION 50,50
	CALL STF
	JMP CHECKPOINT

;*********************************
; System little backward please

BACKWARD:
	MOV DIRECTION_SIDE,2
	CURS_POSITION 14,15
	SHOW_INSCREEN DIRECTION_BACKWARD
	CURS_POSITION 12,18
	SHOW_INSCREEN STARTED
	CURS_POSITION 50,50
	CALL STB
	JMP CHECKPOINT

;*********************************
; Test the 7 segment display

SEGMENTTEST:
	PINS_OUT 10000000B
	CURS_POSITION 16,25
	SHOW_INSCREEN MSG11
	CURS_POSITION 50,50
	JMP CHECKPOINT

;*********************************
; Delay routines .... which u need it fot stepper motor steps

DELAY:	CMP SHOWSPEED,0
	JNE aa
	MOV CX,65535
	JMP NO
aa:	CMP SHOWSPEED,1
	JNE qq
	MOV CX,53032
	JMP NO
qq:	CMP SHOWSPEED,2
	JNE ww
	MOV CX,46403
	JMP NO
ww:	CMP SHOWSPEED,3
	JNE ee
	MOV CX,39774
	JMP NO
ee:	CMP SHOWSPEED,4
	JNE rr
	MOV CX,33145
	JMP NO
rr:	CMP SHOWSPEED,5
	JNE tt
	MOV CX,26516
	JMP NO
tt:	CMP SHOWSPEED,6
	JNE yy
	MOV CX,19887
	JMP NO
yy:	CMP SHOWSPEED,7
	JNE uu
	MOV CX,13258
	JMP NO
uu:	CMP SHOWSPEED,8
	MOV CX,6629

NO:
	CALL WAITF
	RET

WAITF:	PUSH AX
WAITF1:
	IN	AL,61H
	AND	AL,10H
	CMP	AL,AH
	JE	WAITF1
	MOV	AH,AL
	LOOP	WAITF1
	POP	AX
	RET
	SUB CX,CX
	RET

;*********************************
; Print the good bye message

GOODBYE:
	CLS_SCREEN
	CURS_POSITION 15,25
	SHOW_INSCREEN MSG9
	CURS_POSITION 30,25
	PINS_OUT 11110000B
	MOV AH,4CH
	INT 21H
	END MAIN

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer
Turkey Turkey
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions