;-----------------------------------------
;--- 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