Professional Documents
Culture Documents
Please Note:
• This document contains all lab programs of microprocessors and peripherals along with
the output of all software programs.
• Programs are taken from official manual MP(16CS405) Lab Manual_2018
(Prepared by : Anisha P Rodrigues, Assistant Professor-II, Computer Science and
Engineering, NMAMIT, Nitte). Only changes made in the text formatting.
• This document is unofficial and only for the purpose of reference.
Prepared by:
Shawn Linton Miranda
4NM17CS164
Index
Software Programs:
S.No Program Title Page No
1 Binary search 1-2
2 Reading and Displaying string using procedures 2-3
3 Bubble sort 4-5
4 Display ASCII value of read alphanumeric character 5-6
5 Reverse and check whether string is palindrome 6-8
6 Comparison of two strings 8-10
7 Read and display name at specified location on the screen 10-11
8 Factorial of positive integer n 11-13
9 Generate first n Fibonacci numbers 13-14
10 Read and display current system time 14-16
11 Decimal up counter 00-99 16-17
12 Move cursor to specified location of screen 17-19
Hardware Programs:
S.No Program Title Page No
1 Check for parity of input using logic controller 20-20
2 BCD up-down counter using logic controller 21-22
3 Ring counter using logic controller 22-23
4 Multiplication of 2 8-bit numbers using logic controller 23-23
5 Display FIRE and HELP on 7-segment display 24-25
6 Display scrolling message on 7-segment display 25-27
7 Display current system time on 7-segment display 27-29
8 Drive stepper motor in clockwise direction 29-30
9 Drive stepper motor in anticlockwise direction 30-31
10 Drive stepper motor in clockwise & anticlockwise direction 31-32
11 Scan a key of 3x8 keypad interface and display its properties 32-35
12 Perform addition using 3x8 keypad 35-38
Software Programs :
Commands used:
EDIT file_name.ASM - To create a file and type assembly code
MASM file_name.ASM; - To assemble the code using masm assembler
LINK file_name.OBJ; - To link object file with code in order to create executable file
file_name.EXE - To run the assembly code
1.Binary search
Search a key element in a list of ‘n’ 8-bit numbers using the Binary search algorithm.
Program:
DATA SEGMENT
ARR DB 10H,20H,30H,40H,50H,60H
LEN DB $-ARR
MID DB ? ;Variable to hold position of mid element
KEY DB 50H
MSG1 DB 10,13,'Key not found.$'
MSG2 DB 10,13,'Key found at position $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;store address of data segment in DS register
MOV DS,AX
MOV DL,00H ;Lower limit in array
MOV DH,LEN ;Upper limit in array
DEC DH
MOV BX,0000H
MOV CL,KEY
UP:
CMP DL,DH ;while low<=high
JG NOTFOUND
MOV BL,DL
ADD BL,DH
SHR BL,01H ;get mid position
MOV MID,BL
CMP CL,ARR[BX] ;compare key with mid element
JZ FOUND
JB FIRSTHALF ;If key<mid element consider first half of array
INC MID
MOV DL,MID ;Otherwise consider second half
JMP UP
FIRSTHALF:
DEC MID
MOV DH,MID
JMP UP
NOTFOUND:
LEA DX,MSG1 ;If key not found
MOV AH,09H
INT 21H
JMP EXIT
~1~
FOUND:
LEA DX,MSG2
MOV AH,09H
INT 21H
MOV BL,MID
INC BL
CALL DISPHEXA ;Display the position
EXIT:
MOV AH,4CH ; end of program
INT 21H
Program:
~2~
DATA SEGMENT
S DB 50 DUP(?) ;Create empty array with 50 locations
LEN DB ?
MSG1 DB 10,13,'ENTER A STRING:',10,13,'$'
MSG2 DB 10,13,'ENTERED STRING IS:',10,13,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,09H
INT 21H
CALL READSTRING ;read a string
LEA DX,MSG2
MOV AH,09H
INT 21H
CALL DISPSTRING ;display read string
MOV AH,4CH
INT 21H
Program:
DATA SEGMENT
A DB 61H,38H,05H,91H,82H,03H
LEN DB $-A
NL DB 10,13,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
DEC LEN
MOV CL,00H
UP2: ;outer loop
CMP CL,LEN
JZ DISPLAY
MOV BX,0000H
MOV DL,LEN
SUB DL,CL
UP1: ;inner loop
CMP BL,DL
JZ D1
MOV AL,A[BX]
CMP AL,A[BX+1]
JBE NOSWAP
MOV AH,A[BX+1] ;swap if left operand is greater
MOV A[BX],AH
MOV A[BX+1],AL
NOSWAP:
INC BL
JMP UP1
D1:
INC CL
JMP UP2
DISPLAY:
MOV CL,00H
LEA SI,A
UP3:
CMP CL,LEN
JA EXIT
MOV BL,[SI]
CALL DISPHEXA
CALL NEWLINE ;Display next number in a new line
INC SI
INC CL
JMP UP3
EXIT:
MOV AH,4CH
INT 21H
~4~
DISPHEXA PROC NEAR
PUSH CX
MOV DL,BL
MOV CL,04H
SHR DL,CL
CMP DL,09H
JBE L1
ADD DL,07H
L1:
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL
AND DL,0FH
CMP DL,09H
JBE L2
ADD DL,07H
L2:
ADD DL,30H
MOV AH,02H
INT 21H
POP CX
RET Output:
DISPHEXA ENDP
Program:
F3.MAC (In different file) F4.MAC (In different file)
CLRSCR MACRO SETCURSOR MACRO ROW,COL
MOV AH,00H ;function number to clear screen MOV DL,COL
MOV AL,02H ;Video display mode 25x80 MOV DH,ROW
INT 10H ;Interrupt number MOV AL,02H
ENDM MOV BH,00H ;current screen
MOV AH,02H ;function number
INT 10H
INCLUDE F3.MAC ENDM
INCLUDE F4.MAC
DATA SEGMENT
MSG1 DB 10,13,'Enter a character : $'
N DB ?
DATA ENDS
~5~
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV N,AL
CLRSCR ;Invoke macro to clear the screen
SETCURSOR 12,40 ; Sets the cursor at position 12,40
MOV BL,N
CALL DISPHEXA
MOV AH,01H
INT 21H
MOV AH,4CH
INT 21H
Output:
DISPHEXA PROC NEAR
MOV DL,BL
MOV CL,04H
SHR DL,CL
CMP DL,09H
JBE L1
ADD DL,07H
L1:ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL
AND DL,0FH
CMP DL,09H
JBE L2
ADD DL,07H
L2:ADD DL,30H
MOV AH,02H
INT 21H
RET
DISPHEXA ENDP
CODE ENDS
END START
5.Palindrome
Reverse a given string and check whether it is a palindrome or not.
Program:
DATA SEGMENT
STR1 DB 20 DUP(?)
STR2 DB 20 DUP(?)
N DB ?
M1 DB 10,13,'Enter the string : $'
~6~
M2 DB 10,13,'String is a palindrome. $'
M3 DB 10,13,'String is not a palindrome. $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,STR1
LEA DI,STR2
LEA DX,M1
MOV AH,09H
INT 21H
CALL READSTRING
MOV N,CL
MOV CL,00H
DEC SI
UP1: ;Reverse the string
CMP CL,N
JZ CHECK
MOV AL,[SI]
MOV [DI],AL
DEC SI
INC CL
INC DI
JMP UP1
CHECK:
LEA SI,STR1
LEA DI,STR2
MOV CL,00H
UP2: ;Compare each characters of original and reversed string
CMP CL,N
JZ PAL
MOV AL,[SI]
CMP AL,[DI]
JNZ NOTPAL ;If any character is not matching then display not palindrome
INC SI
INC DI
INC CL
JMP UP2
NOTPAL:
LEA DX,M3
MOV AH,09H
INT 21H
JMP EXIT
PAL:
LEA DX,M2
MOV AH,09H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
~7~
READSTRING PROC NEAR
Output:
MOV CL,00
UP:
MOV AH,01H
INT 21H
CMP AL,0DH
JZ L1
MOV [SI],AL
INC SI
INC CL
JMP UP
L1:
RET
READSTRING ENDP
CODE ENDS
END START
Program:
DATA SEGMENT
STR1 DB 20 DUP(?)
STR2 DB 20 DUP(?)
N1 DB ?
N2 DB ?
M1 DB 10,13,'Strings are equal.$'
M2 DB 10,13,'Strings are not equal.$'
M3 DB 10,13,'Enter string-1 : $'
M4 DB 10,13,'Enter string-2 : $'
M5 DB 10,13,'Length of string-1 : $'
M6 DB 10,13,'Length of string-2 : $'
M7
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,M3
MOV AH,09H
INT 21H
LEA SI,STR1
CALL READSTRING ;Read string-1
MOV N1,CL
LEA DX,M4
MOV AH,09H
INT 21H
LEA SI,STR2
CALL READSTRING ;Read string-2
~8~
MOV N2,CL
CMP N1,CL ;If length of string is not same then ther are not equal
JNZ NOTEQ
LEA SI,STR1
LEA DI,STR2
MOV CL,00
UP1: ;Compare correspoding characters of two strings
CMP CL,N1
JZ STREQ
MOV AL,[SI]
CMP AL,[DI]
JNZ NOTEQ
INC SI
INC DI
INC CL
JMP UP1
NOTEQ:
LEA DX,M2
MOV AH,09H
INT 21H
JMP DISPLEN
STREQ:
LEA DX,M1
MOV AH,09H
INT 21H
DISPLEN:
LEA DX,M5
MOV AH,09H
INT 21H
MOV BL,N1
CALL DISPHEXA
LEA DX,M6
MOV AH,09H
INT 21H
MOV BL,N2
CALL DISPHEXA
MOV AH,4CH
INT 21H
~ 10 ~
SETCURSOR 10,30
LEA DX,MSG2
MOV AH,09H
INT 21H
LEA SI,STR
MOV CL,N
CALL DISPSTRING
MOV AH,01H
INT 21H
MOV AH,4CH
INT 21H
Program:
DATA SEGMENT
N DB 06H
FACT DW ?
MSG2 DB 10,13,'FACTORIAL(06) = $'
DATA ENDS
~ 11 ~
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV BL,AH
LEA DX,MSG2
MOV AH,09H
INT 21H
CALL DISPHEXA ;Display MSB 2 digits
MOV BX,FACT
CALL DISPHEXA ;Display LSB 2 digits
MOV AH,4CH
INT 21H
9.Fibonacci numbers
Generate the first ‘n’ Fibonacci numbers.
Program:
DATA SEGMENT
F1 DB 00H ;First fibonacci number is 00
F2 DB 01H ;Second fibonacci number is 01
F3 DB ?
N DB 10
MSG DB 10,13,'The fibonacci sequence is:',10,13,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG
MOV AH,09H
INT 21H
MOV CL,00
MOV BL,F1
CALL DISPHEXA ;Display 00
INC CL
SPACE ;print a blank space
MOV BL,F2
CALL DISPHEXA ;Display 01
INC CL
SPACE
UP:
CMP CL,N
JZ EXIT
MOV AL,F1
ADD AL,F2 ;Add first and second number to get third number
MOV F3,AL
~ 13 ~
MOV BL,AL
CALL DISPHEXA
SPACE
MOV AL,F2
MOV F1,AL ;Replace 1st with second
MOV AL,F3
MOV F2,AL ;Replace 2nd with third
INC CL
JMP UP
EXIT:
MOV AH,4CH
INT 21H
MOV DL,BL
AND DL,0FH
CMP DL,09H
JBE L2
ADD DL,07H Output:
L2:
ADD DL,30H
MOV AH,02H
INT 21H
POP CX
RET
DISPHEXA ENDP
CODE ENDS
END START
Program:
DATA SEGMENT
HR DB ?
MIN DB ?
SEC DB ?
MSEC DB ?
MSG DB 'CURRENT SYSTEM TIME - $'
DATA ENDS
~ 14 ~
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG
MOV AH,09H
INT 21H
MOV AL,HR
AAM ;Convert packed to unpacked BCD
MOV BX,AX
CALL DISPUNPACKEDBCD
COLON
MOV AL,MIN
AAM
MOV BX,AX
CALL DISPUNPACKEDBCD
COLON
MOV AL,SEC
AAM
MOV BX,AX
CALL DISPUNPACKEDBCD
COLON
MOV AL,MSEC
AAM
MOV BX,AX
CALL DISPUNPACKEDBCD
MOV AH,4CH
INT 21H
Program:
CLRSCR MACRO
MOV AH,00H
MOV AL,02H
INT 10H
ENDM
CODE SEGMENT
ASSUME CS:CODE
START:
CLRSCR
MOV AL,00H
UP: ;Display 0-98
CMP AL,99H
JZ DISP99
CALL CENTER
MOV BL,AL
CALL DISPLAY
CALL DELAY
ADD AL,01H
DAA ;decimal adjust accumulator after addition
JMP UP
DISP99: ;display 99
CALL CENTER
MOV BL,AL
CALL DISPLAY
CALL DELAY
MOV AH,01H
INT 21H
MOV AH,4CH
INT 21H
CENTER PROC
PUSH AX
MOV DL,39
MOV DH,12
MOV BH,00H
MOV AH,02H
INT 10H
POP AX
~ 16 ~
RET
CENTER ENDP
Output:
DISPLAY PROC
PUSH AX
MOV DL,BL
MOV CL,04H
SHR DL,CL
CMP DL,09H
JBE DOWN1
ADD DL,07H
DOWN1:
ADD DL,30H
MOV AH,02H
INT 21H .
MOV DL,BL .
AND DL,0FH
.
CMP DL,09H
JBE DOWN2
ADD DL,07H
DOWN2:
ADD DL,30H
MOV AH,02H
INT 21H
POP AX
RET
DISPLAY ENDP
Program:
CLRSCR MACRO
MOV AH,00
MOV AL,02
INT 10H
ENDM
~ 17 ~
SETCURSOR MACRO R,C
MOV DH,R
MOV DL,C
MOV AL,02H
MOV BH,00H
MOV AH,02H
INT 10H
ENDM
DATA SEGMENT
BCD_R DB ?
BCD_C DB ?
BIN_R DB ?
BIN_C DB ?
MSG1 DB 'ENTER THE ROW : $'
MSG2 DB 10,13,'ENTER THE COLUMN : $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,09H
INT 21H
CALL READBCD ;Read row
MOV BCD_R,BL
LEA DX,msg2
MOV AH,09H
INT 21H
CALL READBCD ;Read column
MOV BCD_C,BL
MOV BL,BCD_R
CALL BCD_TO_BIN ;Convert row
MOV BIN_R,BL
MOV BL,BCD_C
CALL BCD_TO_BIN ; convert column
MOV BIN_C,BL
CLRSCR
SETCURSOR BIN_R,BIN_C
MOV AH,4CH
INT 21H
~ 18 ~
READBCD PROC NEAR //To read the row and column values
MOV AH,01H
INT 21H
MOV BL, AL
MOV CL,04H
SHL BL,CL
MOV AH,01H
INT 21H
AND AL,0FH
ADD BL,AL
RET
READBCD ENDP
CODE ENDS
END START
Output:
~ 19 ~
Hardware Programs :
Commands used:
iopm filename.exe 0x40a0 - Grant permission for peripheral devices (address can be 0x40b0 also)
Program:
PA equ 40A0H ;Port address of defined to named constant PA. This port address is machine dependent. If 40B0 is
;written on the edges of monitor please write PA as 40B0. If nothing is written then its 40A0
PB equ PA+1 ;PB is next to PA
PC equ PB+1 ;PC is next to PB
PCW equ PC+1 ;PCW is next to PC
CW equ 82h
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,CW ;INITIALIZE 8255 with control word
MOV DX,PCW
OUT DX,AL
~ 20 ~
2.BCD up-down counter
Perform the BCD up-down Counter function using the Logic Controller Interface.
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 82H
N EQU 15H ;counter maximum limit 15
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,CW
MOV DX,PCW
OUT DX,AL
~ 21 ~
MOV CX,5FFFH
L3:
MOV BX,0000H
L2:
CMP BX,2FFFH
JZ L1
INC BX
JMP L2
L1:
LOOP L3
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
CODE ENDS
END START
3.Ring counter
Perform the Ring Counter function using the Logic Controller Interface.
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 82H
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV AL, 01 ;Set LSB bit as 1
MOV DX,PA
UP:
OUT DX,AL
ROL AL,01 ;shift bit to left
CALL DELAY
PUSH AX
MOV AH, 01 ;check for key press
INT 16H
POP AX
JZ UP
EXIT :
MOV AH, 4CH
INT 21H
~ 22 ~
MOV BX,0000H
L2:
CMP BX,2FFFH
JZ L1
INC BX
JMP L2
L1:
LOOP L3
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
CODE ENDS
END START
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 82H
DATA SEGMENT
X DB ?
Y DB ?
PROD DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL,CW
MOV DX,PCW
OUT DX, AL
MOV DX, PB
IN AL,DX ;Read operand-1
MOV X,AL
MOV AH,01H ;Wait for keypress
INT 21H
MOV DX,PB
IN AL,DX ;Read operand-2
MOV Y,AL
MOV AL,X
MUL Y
MOV PROD,AL
MOV DX,PA
OUT DX, AL ;display product (Maximum 8 bits can be displayed)
MOV AH, 4CH
INT 21H
CODE ENDS
END START
~ 23 ~
5.Display messages on 7-segment display
Display messages FIRE and HELP alternately with flickering effects on a 7-segment display interface for a
suitable period of time. Ensure a flashing rate that makes it easy to read both the messages.
Program:
PA EQU 40A0H 7-segment display circuit diagram is given in page no-25
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
SSFIRE DB 8EH, 0F9H, 0AFH, 86H ;7-segment code for FIRE
SSHELP DB 89H, 86H, 0C7H, 8CH ;7-segment code for HELP
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
UP: LEA SI, SSFIRE
CALL SSDISPLAY ;Display FIRE
CALL DELAY
LEA SI, SSHELP
CALL SSDISPLAY ;Display HELP
CALL DELAY
MOV AH, 01H ;stop flickering when keypress is found
INT 16H
JZ UP
MOV AH, 4CH
INT 21H
~ 24 ~
POP AX
DEC BL
JNZ M1
DEC DI ;for new device INC DI
LOOP UP1
RET
SSDISPLAY ENDP
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
SSCODE DB 0FFH, 0FFH, 0FFH, 0FFH ;----
DB 08EH, 0CFH, 0AFH, 86H ; FIRE
DB 89H, 86H, 0C7H, 8CH ;HELP
DB 0AFH, 0CFH, 0C8H, 90H ;RING
DB 0FFH, 0FFH, 0FFH ;---
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
~ 25 ~
START:
MOV AX, DATA
MOV DS, AX
MOV AL, CW
MOV DX, PCW
OUT DX, AL
L16:
MOV CX, 16 ;16 combination of 4 characters each
LEA SI, SSCODE
UP:
CALL SSDISPLAY
CALL DELAY
INC SI ;mov to next combination
LOOP UP
MOV AH, 01H
INT 16H
JZ L16
MOV AH, 4CH
INT 21H
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
SSTABLE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,83H,0F8H,80H,98H ;code of 7-segment to display 0-9 numbers
SSCODE DB 00H,00H,00H,00H ;store time in7-segment format
HOUR DB ?
MIN DB ?
AINDEX DB 4 DUP(?) ;store system time
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV AH,2CH ;get system time
INT 21H
MOV HOUR,CH
MOV MIN,CL
LEA SI,AINDEX
MOV AL,HOUR
AAM ;convert packed BCD to unpacked
MOV [SI],AH
MOV[SI+1],AL
MOV AL,MIN
~ 27 ~
AAM
MOV[SI+2],AH
MOV[SI+3],AL
MOV CX,04H
LEA SI,AINDEX
LEA DI,SSCODE
LEA BX,SSTABLE
UP:MOV AL,[SI]
XLAT ; convert BCD format time to 7-segment format (AL [AL + BX])
MOV [DI],AL
INC SI
INC DI
LOOP UP
LEA SI,SSCODE
CALL SSDISPLAY ;display time on 7 segment display
MOV AH,4CH
INT 21H
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
N DB 100 ;Number of steps. Each step is 1.8*
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV BL, N
MOV AX,9911H ;AL=current position (PA0), AH = Next position of stepper motor(PA0 and PA3)
MOV DX,PA
OUT DX,AL
CALL DELAY
UP:
ROR AL,1 ;rotate clockwise to get next position
XCHG AL,AH ;AH was holding next position, so put it in AL
OUT DX,AL
CALL DELAY
ROR AL,1
XCHG AL,AH
OUT DX, AL
CALL DELAY
~ 29 ~
DEC BL
JNZ UP
EXIT:
MOV AH,4CH
INT 21H
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
N DB 100 ;Number of steps. Each step is 1.8*
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV BL, N
MOV AX,3311H ;AL=current position (PA0), AH = Next position of stepper motor(PA0 and PA1)
MOV DX,PA
OUT DX,AL
CALL DELAY
UP:
ROL AL,1 ;rotate anticlockwise to get next position
XCHG AL,AH ;AH was holding next position, so put it in AL
OUT DX,AL
~ 30 ~
CALL DELAY
ROL AL,1
XCHG AL,AH
OUT DX, AL
CALL DELAY
DEC BL
JNZ UP
EXIT:MOV AH,4CH
INT 21H
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 80H
DATA SEGMENT
N DB 100 ;Number of steps. Each step is 1.8*
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV BL, N
MOV AX,3311H ;AL=current position (PA0), AH = Next position of stepper motor(PA0 and PA31)
MOV DX,PA
OUT DX,AL
CALL DELAY
~ 31 ~
UP1:ROL AL,1 ;rotate anticlockwise to get next position
XCHG AL,AH ;AH was holding next position, so put it in AL
OUT DX,AL
CALL DELAY
ROL AL,1
XCHG AL,AH
OUT DX, AL
CALL DELAY
DEC BL
JNZ UP1
MOV BL, N
MOV AX,9911H ;AL=current position (PA0), AH = Next position of stepper motor(PA0 and PA3)
MOV DX,PA
OUT DX,AL
CALL DELAY
UP2:ROR AL,1 ;rotate clockwise to get next position
XCHG AL,AH ;AH was holding next position, so put it in AL
OUT DX,AL
CALL DELAY
ROR AL,1
XCHG AL,AH
OUT DX, AL
CALL DELAY
DEC BL
JNZ UP2
EXIT:
MOV AH,4CH
INT 21H
Program:
PA EQU 40A0H
3x8 Keypad layout is given in page no-35
PB EQU PA+1
~ 32 ~
PC EQU PB+1
PCW EQU PC+1
CW EQU 90H
DATA SEGMENT
ROW DB ? ;to store row of pressed key
COL DB ? ;to store column of pressed key
VAL DB ? ;to store value of pressed key
MSG1 DB 10,13,'ROW : $'
MSG2 DB 10,13,'COLUMN : $'
MSG3 DB 10,13,'VALUE : $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV AL,04H
MOV DX,PC
OUT DX,AL ;Scan row-3 (PC2 is high)
MOV DX,PA
IN AL,DX
CMP AL,00H ;Check for keypress in row-3
JNZ THIRDROW
JMP UP ;scan continuously until key is pressed
FIRSTROW:
CALL DELAY ;delay between two key press
MOV BL,01H
MOV BH,01H
MOV CL,00H ;Initialize value of 1st key in row-1 with 0
UP1:
ROR AL,01H ;counting column number
JC L1
INC BH
INC CL
JMP UP1
SECONDROW:
CALL DELAY
MOV BL,02H
MOV BH,01H
MOV CL,08H ;Initialize value of 1st key in row-2 with 08H
UP2:
ROR AL,01H
JC L1
INC BH
INC CL
JMP UP2
THIRDROW:
CALL DELAY
MOV BL,03H
MOV BH,01H
MOV CL,10H ; Initialize value of 1st key in row-3 with 10H
UP3:
ROR AL,01H
JC L1
INC BH
INC CL
JMP UP3
L1:
RET
KEYPRESS ENDP
~ 34 ~
DELAY PROC NEAR
PUSH CX
PUSH BX
MOV CX,0FFFFH
L5:
MOV BX,04FFHH M+ M- MR MC = CHK CE AC
L4:
DEC BX
JNZ L4
LOOP L5 %
POP BX
POP CX
RET
DELAY ENDP
Program:
PA EQU 40A0H
PB EQU PA+1
PC EQU PB+1
PCW EQU PC+1
CW EQU 90H
DATA SEGMENT
OP1 DB ?
~ 35 ~
OP2 DB ?
RES DB ?
MSG1 DB 10,13,'SUM : $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CW
MOV DX,PCW
OUT DX,AL
MOV AL,OP1
ADD AL,OP2 ;compute the sum
MOV RES,AL
LEA DX,MSG1
MOV AH,09H
INT 21H
MOV BL,RES
CALL DISPHEXA ;display sum
MOV AH,4CH
INT 21H
MOV AL,02H
MOV DX,PC
OUT DX,AL ;Scan row-2
MOV DX,PA
~ 36 ~
IN AL,DX
CMP AL,00H ;Check for keypress in row-2
JNZ SECONDROW
MOV AL,04H
MOV DX,PC
OUT DX,AL ;Scan row-3
MOV DX,PA
IN AL,DX
CMP AL,00H ;Check for keypress in row-3
JNZ THIRDROW
JMP UP ;scan continuously until key is pressed
FIRSTROW:
CALL DELAY ;delay between two key press
MOV BL,01H
MOV BH,01H
MOV CL,00H ;Initialize value of 1st key in row-1 with 0
UP1:
ROR AL,01H ;counting column number
JC L1
INC BH
INC CL
JMP UP1
SECONDROW:
CALL DELAY
MOV BL,02H
MOV BH,01H
MOV CL,08H ;Initialize value of 1st key in row-2 with 08H
UP2:
ROR AL,01H
JC L1
INC BH
INC CL
JMP UP2
THIRDROW:
CALL DELAY
MOV BL,03H
MOV BH,01H
MOV CL,10H ; Initialize value of 1st key in row-3 with 10H
UP3:
ROR AL,01H
JC L1
INC BH
INC CL
JMP UP3
L1:
RET
KEYPRESS ENDP
***
~ 38 ~