hello sarang,
thank u for the help u provided.
i still have few doubts
1. if i am using 15v,1A Xmer folloed by 7805 and 7812 regulator ic do i need to connect current booster transister?(from same Xmer i am giving secondary to bith ic's)
2.i am sending the program . I am expecting this program rufly to first ask for password then take no of step from user then move by that angle and then if user wants to go back then go back to original position . assembler i am using is mide-51
it will be great if can go through the program and tell me if there are any problems as soon as possible as u have the prctical experience what works better.
3. if u know what are denger signs that we students are most likely to make mistakes then let us know.
thank you
prachi
DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.7
RS EQU P3.6
RW EQU P3.5
DAT EQU P1
n1 EQU 04h
n2 EQU 04h
n3 EQU 04h
n4 EQU 04h
DIRN EQU 00H
FULL EQU R2
STEPS EQU R3
HALF EQU 01H
ROW0 EQU P2.4
ROW1 EQU P2.5
ROW2 EQU P2.6
start code 0000h
org start
LCALL INIT_LCD
PASS: LCALL CLEAR_LCD
MOV A,#'E' ;Display "Enter Password"
LCALL WRITE_TEXT
MOV A,#'n'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'e'
LCALL WRITE_TEXT
MOV A,#'r'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
MOV A,#'a'
LCALL WRITE_TEXT
MOV A,#'s'
LCALL WRITE_TEXT
MOV A,#'s'
LCALL WRITE_TEXT
MOV A,#'w'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#'r'
LCALL WRITE_TEXT
MOV A,#'d'
LCALL WRITE_TEXT
LCALL READ ;Read 4-digit password and go ahead when password is correct
CJNE A,#n1,PASS
LCALL READ
CJNE A,#n2,PASS
LCALL READ
CJNE A,#n3,PASS
LCALL READ
CJNE A,#n4,PASS
LCALL CLEAR_LCD ;Display "Enter Direction"
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'n'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'e'
LCALL WRITE_TEXT
MOV A,#'r'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'i'
LCALL WRITE_TEXT
MOV A,#'r'
LCALL WRITE_TEXT
MOV A,#'e'
LCALL WRITE_TEXT
MOV A,#'c'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'i'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#'n'
LCALL WRITE_TEXT ;0 FOR ANTI-CLOCKWISE,ANY OTHER KEY CLOCKWISE
LCALL READ
SETB DIRN
CJNE A,#00H,AHEADD
CLR DIRN
MOV B,A
AHEADD: ;Display direction L= left & R= Right
CLR RS ;Positioning Cursor
MOV DAT,#0C0H
SETB EN
CLR EN
LCALL WAIT_LCD
ORL A,#00H ;?? aSK KOMI
MOV A,#'R'
JNZ RIGHT
MOV A,#'L'
RIGHT:
LCALL WRITE_TEXT
LCALL CLEAR_LCD ;Display Full Rotation
MOV A,#'F'
LCALL WRITE_TEXT
MOV A,#'u'
LCALL WRITE_TEXT
MOV A,#'l'
LCALL WRITE_TEXT
MOV A,#'l'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'a'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'i'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#'n'
LCALL READ ;Read data - 1 digit,(0-9)
MOV FULL,A
ADD A,#30H
LCALL WRITE_TEXT
LCALL CLEAR_LCD ;Display No.of Steps
MOV A,#'N'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#'f'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'S'
LCALL WRITE_TEXT
MOV A,#'t'
LCALL WRITE_TEXT
MOV A,#'e'
LCALL WRITE_TEXT
MOV A,#'p'
LCALL WRITE_TEXT
MOV A,#'s'
LCALL WRITE_TEXT
CLR RS
MOV DAT,#0C0H
SETB EN
CLR EN
LCALL WAIT_LCD
;Input no. of steps (0-99)
LCALL READ ;Input first digit
MOV B,A
ADD A,#30H
LCALL WRITE_TEXT
MOV A,B
SWAP A
MOV B,A
LCALL READ ;Input second digit
MOV R4,A ;Read digit in R4
ADD A,B
MOV R5,A
MOV A,R4
ADD A,#30H
LCALL WRITE_TEXT
MOV A,R5 ;Convert to HEX and store in steps
MOV B,#16H
DIV AB
SWAP A
ADD A,B
MOV STEPS,A ;?????
MOV A,#'.' ;Display '.'
LCALL WRITE_TEXT
LCALL READ ;Input whether half-step or no half step
ADD A,#30H
LCALL WRITE_TEXT
CLR C
SUBB A,#30H
SETB HALF
CJNE A,#00H,CALC_ANG
CLR HALF
CALC_ANG: MOV B,#46H ;B <-- 75 (Decimal)
MOV R6,#00H ;lower
MOV R7,#00H ;higher
CONVERT: MOV R0,#00H ;carry
MOV A,R6
ADD A,R5
JNC NOCARRY
MOV R0,#01H
NOCARRY: DA A;??????
JNC NOCANS
MOV R0,#01H
NOCANS: MOV R6,A
MOV A,R7
ADD A,R0
DA A
MOV R7,A
DJNZ B,CONVERT
;R7-R6 contains ans, now full no. is in R7-R6
MOV RS,#00H
JB HALF,AHEADN
MOV R5,#05H
MOV A,R6
ADD A,#37H
JNC CONTINUE
MOV R0,#01H
CONTINUE:
DA A
JNC CONT2
MOV R0,#01H
CONT2:
MOV R6,A
MOV A,R7
ADD A,R0
DA A
MOV R7,A
AHEADN: MOV A,R7
ANL A,#0F0H
SWAP A
ADD A,#30H
LCALL WRITE_TEXT
MOV A,R7
ANL A,#0F0H
ADD A,#30H
LCALL WRITE_TEXT
MOV A,R6
ANL A,#0F0H
SWAP A
ADD A,#30H
LCALL WRITE_TEXT
MOV A,#'.'
LCALL WRITE_TEXT
MOV A,R6
ANL A,#0FH
ADD A,#30H
LCALL WRITE_TEXT
MOV A,R5
ADD A,#30H
LCALL WRITE_TEXT
;Stepper motor business
LCALL CLEAR_LCD
MOV A,#'G'
LCALL WRITE_TEXT
MOV A,#'o'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'B'
LCALL WRITE_TEXT
MOV A,#'a'
LCALL WRITE_TEXT
MOV A,#'c'
LCALL WRITE_TEXT
MOV A,#'k'
LCALL WRITE_TEXT
MOV A,#'?'
LCALL WRITE_TEXT
ORL A,#00H
MOV A,#'N'
JZ NO
MOV A,#'Y'
NO: LCALL WRITE_TEXT
here: sjmp here
;Stepper stuff
CALL MOTOR
INIT_LCD: ;Subroutine to initialize LCD
CLR RS
MOV DAT,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DAT,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DAT,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET
WAIT_LCD:
CLR EN ;Start LCD command
CLR RS ;It's a command
SETB RW ;It's a read command
MOV DAT,#0FFh ;Set all pins to FF initially
SETB EN ;Clock out command to LCD
MOV A,DAT ;Read the return value
JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR EN ;Finish the command
CLR RW ;Turn off RW for future commands
RET
CLEAR_LCD:
CLR RS
MOV DAT,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET
WRITE_TEXT:
SETB RS
MOV DAT,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET
READ: ;(0-3) OF PORT 2 IS INPUT AND (4-7) IS OUTPUT
MOV A,#0FH
MOV 0A0H,A
;Check if all keys are open
OPEN: CLR P2.4
CLR P2.5
CLR P2.6
MOV A,0A0H ;????
ANL A,#0FH
CJNE A,#0FH,OPEN ;If key key is not open, wait till open
CALL DBONCE ;Once all keys are open ,wait for sometime for bouncing to end
;Check for key closure (ROWS < 0FH)
;All columns are already low
SETB P2.7
ISPRESS:
MOV A,0A0H
ANL A,#0FH
CLR C
SUBB A,#0FH
JNC ISPRESS ;IF ROW=0FH,WAIT FOR KEY CLOSURE
;Now that a key has been pressed,identify the key
;Make one column low at a time
CLR P2.7 ;Make col 0 '0'
CLR P2.4
SETB P2.5
SETB P2.6
MOV A,0A0H
ANL A,#0FH
CLR C
SUBB A,#0FH
JZ COLONE
JB ROW0,FOUR
RET
FOUR: JB ROW1,SEVEN
MOV A,#04H
RET
SEVEN: MOV A,#07H
RET
;Make column1 '0'
COLONE: SETB P2.4
CLR P2.5
SETB P2.6
MOV A,0A0H
ANL A,#0FH
MOV 2FH,A
CLR C
SUBB A,#0FH
JZ COLTWO
JB ROW0,FIVE
MOV A,#02H
RET
FIVE: JB ROW1,EIGHT
MOV A,#05H
RET
EIGHT: JB ROW2,ZERO
MOV A,#08H
RET
ZERO: MOV A,#00H
RET
;Make column2 '0'
COLTWO:
SETB P2.4
SETB P2.5
CLR P2.6
MOV A,#0A0H
ANL A,#0FH
MOV 2FH,A
JB ROW0,SIX
MOV A,#03H
RET
SIX: JB ROW1,NINE
MOV A,#06H
RET
NINE: JB ROW2,POINT
MOV A,#09H
RET
POINT: MOV A,#0AH
RET
DBONCE:
CLR TR0
MOV TMOD,#01H
MOV TL0,#0F0H
MOV TH0,#0D8H
SETB TR0
SAME: JNB TF0,SAME
RET
;SUBROUTINE MOTOR
;``````````````````
MOTOR:
MSTART:
MOV R5,#88H
MOV B,R2
MOV A,B
JZ DOWN
MOV R4,B
UP:MOV B,#31H
LCALL STEP
DJNZ R4,UP
DOWN:
MOV B,R3
MOV A,B
JZ DOWN2
INC 0F0H
LCALL STEP
DOWN2:
JNB 01H,DOWN3
MOV A,80H
ANL A,#0FH
JB 00H,COUNTERCLOCK
CJNE A,#08H,NEXT1
MOV 80H,#0CH
LJMP TAIL
NEXT1: CJNE A,#04H,NEXT2
MOV 80H,#06H
LJMP TAIL
NEXT2: CJNE A,#02H,NEXT3
MOV 80H,#03H
LJMP TAIL
NEXT3:
MOV 80H,#09H
LJMP TAIL
COUNTERCLOCK:
CJNE A,#08H,NEXT5
MOV 80H,#09H
LJMP TAIL
NEXT5: CJNE A,#04H,NEXT6
MOV 80H,#0CH
LJMP TAIL
NEXT6: CJNE A,#02H,NEXT7
MOV 80H,#06H
LJMP TAIL
NEXT7:
MOV 80H,#03H
TAIL:
CALL DELAY
DOWN3:
JNB 02H,LAST
CPL 00H
LJMP MSTART
LAST:RET
;SUBROUTINE STEP
;``````````````````
STEP:
MOV R6,B
REPEAT: MOV A,R5
ANL A,#0FH
MOV 80H,A
CALL DELAY
JB 00H,ANTI
RR A
SJMP SKIP
ANTI: RL A
SKIP: DJNZ R6,REPEAT
RET
;SUBROUTINE DELAY
;````````````````````
DELAY:
CLR TR0
MOV TMOD,#01H
MOV TL0,#60H
MOV TH0,#0F0H
SETB TR0
HERE2: JNB TF0,HERE2
RET
END