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

ALP Programming of 8051

The document contains 15 code examples demonstrating arithmetic operations using 8-bit numbers on the 8051 microcontroller. The examples include addition, subtraction, multiplication, and division of 8-bit numbers; finding the largest/smallest number in an array; sorting arrays in ascending/descending order; counting odd/even/negative/positive numbers in an array; addition of BCD numbers; block transfer between internal memory; and summing an array of numbers with carry.

Uploaded by

avdhootpathak3
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
133 views

ALP Programming of 8051

The document contains 15 code examples demonstrating arithmetic operations using 8-bit numbers on the 8051 microcontroller. The examples include addition, subtraction, multiplication, and division of 8-bit numbers; finding the largest/smallest number in an array; sorting arrays in ascending/descending order; counting odd/even/negative/positive numbers in an array; addition of BCD numbers; block transfer between internal memory; and summing an array of numbers with carry.

Uploaded by

avdhootpathak3
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

1.

Addition of two 8-bit numbers

MOV DPTR, #3000H; //INITIALISE MEMORY POINTER TO EXTERNAL MEMORY

MOVX A, @DPTR; //LOAD 1ST NUMBER IN A

MOV R0, A; //LOAD 1ST NUMBER TO R0

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX A, @DPTR; //LOAD 2ND NUMBER IN A

ADD A, R0; //ADD 1ST NO.WITH 2ND NO.

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; // LOAD RESULT TO EXTERNAL MEMORY

END //END THE EXECUTION

2. Subtraction of two 8-bit numbers

MOV DPTR, #3000H; //INITIALISE MEMORY POINTER TO EXTERNAL MEMORY

MOVX A, @DPTR; //LOAD 1ST NUMBER IN A

MOV R0, A; //LOAD 1ST NUMBER TO R0

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX A, @DPTR; //LOAD 2ND NUMBER IN A

SUBB A, R0; //SUBTRACT 1ST NO.FROM 2ND NO.

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; // LOAD RESULT TO EXTERNAL MEMORY

END //END THE EXECUTION


3. Multiplication of two 8-bit numbers

MOV DPTR, #3000H; //INITIALISE MEMORY POINTER TO EXTERNAL MEMORY

MOVX A, @DPTR; //LOAD multiplicand IN A

MOV 0F0H, A; //LOAD MULTIPLICAND TO B

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX A, @DPTR; //LOAD multiplier IN A

MUL AB; //MULTIPLY MULTIPLICAND & MULTIPLIER

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; //LOAD LSB OF RESULT TO EXTERNAL MEMORY

MOV A, 0F0H; //LOAD MSB RESULT A

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; //LOAD MSB OF RESULT TO EXTERNAL MEMORY

END //END THE EXECUTION

4. Division of two 8-bit numbers

MOV DPTR, #3000H; //INITIALISE MEMORY POINTER TO EXTERNAL MEMORY

MOVX A, @DPTR; //LOAD divisor IN A

MOV 0F0H, A; //LOAD divisor TO B

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX A, @DPTR; //LOAD dividend IN A

DIV AB; //DIVIDE DIVIDEND BY DIVISOR

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; //LOAD QUOTIENT RESULT TO EXTERNAL MEMORY

MOV A, 0F0H; //LOAD REMAINDER RESULT A

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX @DPTR, A; //LOAD REMAINDER OF RESULT TO EXTERNAL MEMORY

END //END THE EXECUTION


5. Largest Number among the block/array

CLR PSW.3,

CLR PSW.4; //SELECT REGISTER BANK 0

MOV R1, 0AH; //INITIALISE BYTE COUNTER

MOV R0, #40H; //INITIALISE MEMORY POINTER

DEC R1; //DECREMENT BYTE COUNTER BY 1

MOV 60H, @R0; //LOAD NUMBER IN MEMORY LOCATION 60H

UP: INC R0; //INCREMENT MEMORY POINTER BY 1

MOV A, @R0; //LOAD NEXT NUMBER

CJNE A, 60H, DN; //IF NUMBER ≠ NEXT NUMBER, JUMP TO DN

AJMP NEXT; //ELSE GO TO NEXT

DN: JC NEXT; //IF NEXT NUMBER > NUMBER THEN JUMP TO NEXT

MOV 60H, A; //ELSE REPLACE NEXT NUMBER WITH NUMBER

NEXT: DJNZ R1, UP; //DECREMENT BYTE COUNTER BY 1, IF BYTE COUNTER ≠ 0 THEN JUMP TO UP

END

6. Smallest Number among the block/array

CLR PSW.3,

CLR PSW.4; //SELECT REGISTER BANK 0

MOV R1, 0AH; //INITIALISE BYTE COUNTER

MOV R0, #40H; //INITIALISE MEMORY POINTER

DEC R1; //DECREMENT BYTE COUNTER BY 1

MOV 60H, @R0; //LOAD NUMBER IN MEMORY LOCATION 60H

UP: INC R0; //INCREMENT MEMORY POINTER BY 1

MOV A, @R0; //LOAD NEXT NUMBER

CJNE A, 60H, DN; //IF NUMBER ≠ NEXT NUMBER, JUMP TO DN

AJMP NEXT; //ELSE GO TO NEXT


DN: JNC NEXT; //IF NEXT NUMBER > NUMBER THEN JUMP TO NEXT

MOV 60H, A; //ELSE REPLACE NEXT NUMBER WITH NUMBER

NEXT: DJNZ R1, UP; //DECREMENT BYTE COUNTER BY 1, IF BYTE COUNTER ≠ 0 THEN JUMP TO UP

END

7. Arrange Numbers in Descending order

MOV R0, #0AH; //INITIALISE PASS COUNTER

UP 1: MOV DPTR, #3000H; //INITIALISE MEMORY POINTER

MOV R1, #0AH; //INITIALISE BYTE COUNTER

UP: MOV R2, DPL; //SAVE LOWER BYTE ADDRESS

MOVX A, @DPTR; //READ NUMBER FROM ARRAY

MOV B, A; //LOAD NO TO B REGISTER

INC DPTR; //INCREMENT MEMORY POINTER

MOVX A, @DPTR; //READ NEXT NO FROM ARRAY

CJNE A, B, DN; //COMPARE NO WITH NEXT NO

AJMP SKIP;

DN: JC SKIP; //IF NO. < NEXT NO THEN JUMP TO SKIP

MOV DPL, R2; //ELSE EXCHANGE THE NO WITH NEXT NO

MOVX @DPTR, A;

INC DPTR;

MOV A, B;

MOVX @DPTR, A;

SKIP: DJNZ R1, UP; //DECREMENT BYTE COUNTER IF BYTE COUNTER ≠ 0 THEN JUMP TO UP

DJNZ R0, UP1; DECREMENT PASS COUNTER IF PASS COUNTER ≠ 0 THEN JUMP TO UP1

END
8. Arrange Numbers in ascending order

MOV R0, #0AH; //INITIALISE PASS COUNTER

UP 1: MOV DPTR, #3000H; //INITIALISE MEMORY POINTER

MOV R1, #0AH; //INITIALISE BYTE COUNTER

UP: MOV R2, DPL; //SAVE LOWER BYTE ADDRESS

MOVX A, @DPTR; //READ NUMBER FROM ARRAY

MOV B, A; //LOAD NO TO B REGISTER

INC DPTR; //INCREMENT MEMORY POINTER

MOVX A, @DPTR; //READ NEXT NO FROM ARRAY

CJNE A, B, DN; //COMPARE NO WITH NEXT NO

AJMP SKIP;

DN: JNC SKIP; //IF NO. < NEXT NO THEN JUMP TO SKIP

MOV DPL, R2; //ELSE EXCHANGE THE NO WITH NEXT NO

MOVX @DPTR, A;

INC DPTR;

MOV A, B;

MOVX @DPTR, A;

SKIP: DJNZ R1, UP; //DECREMENT BYTE COUNTER IF BYTE COUNTER ≠ 0 THEN JUMP TO UP

DJNZ R0, UP1; DECREMENT PASS COUNTER IF PASS COUNTER ≠ 0 THEN JUMP TO UP1

END
9. Count ODD numbers in Block of N numbers

MOV R0, #0AH; //INITIALISE BYTE COUNTER

MOV R1, #00H; //INITIALISE ODD COUNTER TO COUNT ODD NUMBERS

MOV R2, #30H; //INITIALISE MEMORY POINTER

UP: MOV A, @R2; //READ NO FROM ARRAY

RRC A; //ROTATE NUMBER TO RIGHT BY 1 BIT

JNC DN; //IF NUMBER ≠ ODD NUMBER THEN JUMP TO DN

INC R1; //ELSE INCREMENT ODD COUNTER BY 1

DN: INC R2; //INCREMENT MEMORY POINTER

DJNZ R0, UP; //DECREMENT BYTE COUNTER BY 1

END;

10. Count EVEN numbers in Block of N numbers

MOV R0, #0AH; INITIALISE BYTE COUNTER

MOV R1, #00H; //INITIALISE EVEN COUNTER TO COUNT ODD NUMBERS

MOV R2, #30H; //INITIALISE MEMORY POINTER

UP: MOV A, @R2; //READ NO FROM ARRAY

RRC A; //ROTATE NUMBER TO RIGHT BY 1 BIT

JC DN; //IF NUMBER ≠ EVEN NUMBER THEN JUMP TO DN

INC R1; //ELSE INCREMENT EVEN COUNTER BY 1

DN: INC R2; //INCREMENT MEMORY POINTER

DJNZ R0, UP; //DECREMENT BYTE COUNTER BY 1 IF BYTE COUNTER ≠ 0 THEN JIMP TO DN

END;
11. Count NEGATIVE numbers in Block of N numbers

MOV R0, #0AH; //INITIALISE BYTE COUNTER

MOV R1, #00H; //INITIALISE NEGATIVE COUNTER TO COUNT ODD NUMBERS

MOV R2, #30H; //INITIALISE MEMORY POINTER

UP: MOV A, @R2; //READ NO FROM ARRAY

RLC A; //ROTATE NUMBER TO LEFT BY 1 BIT

JNC DN; //IF NUMBER ≠ NEGATIVE NUMBER THEN JUMP TO DN

INC R1; //ELSE INCREMENT NEGATIVE COUNTER BY 1

DN: INC R2; //INCREMENT MEMORY POINTER

DJNZ R0, UP; //DECREMENT BYTE COUNTER BY 1 IF BYTE COUNTER ≠ 0 THEN JIMP TO DN

END;

12. Count POSITIVE numbers in Block of N numbers

MOV R0, #0AH; //INITIALISE BYTE COUNTER

MOV R1, #00H; //INITIALISE POSITIVE COUNTER TO COUNT ODD NUMBERS

MOV R2, #30H; //INITIALISE MEMORY POINTER

UP: MOV A, @R2; //READ NO FROM ARRAY

RLC A; //ROTATE NUMBER TO LEFT BY 1 BIT

JC DN; //IF NUMBER ≠ POSITIVE NUMBER THEN JUMP TO DN

INC R1; //ELSE INCREMENT POSITIVE COUNTER BY 1

DN: INC R2; //INCREMENT MEMORY POINTER

DJNZ R0, UP; //DECREMENT BYTE COUNTER BY 1 IF BYTE COUNTER ≠ 0 THEN JIMP TO DN

END;
13. Addition of two BCD numbers

MOV DPTR, #4000H; //INITIALISE MEMORY POINTER TO EXTERNAL MEMORY

MOVX A, @DPTER; //READ 1ST NUMBER IN A REGISTER

MOV R0, A; //STORE 1ST NUMBER IN R0 REGISTER

INC DPTR; //INCREMENT MEMORY POINTER BY 1

MOVX A, @DPTR; //LOAD 2ND NUMBER IN A REGISTER

ADD A, R0; //ADD 1ST NUMBER WITH 2ND NUMBER

DAA; //ADJUST RESULT TO BCD

INC DPTR //INCREMENT EXTERNAL MEMORY POINTER BY 1

MOVX @DPTR, A; //STORE RESULT TO EXTERNAL MEMORY

END

14. Block Transfer in Internal Memory

MOV R3, #0AH; //INITIALISE BYTE COUNTER

MOV R0, #40H; //INITIALISE MEMORY POINTER FOR SOURCE ARRAY

MOV R1, #50H; //INITIALISE MEMORY POINTER FOR DESTINATION ARRAY

MOV A, @R0; //READ NO FROM SOURCE ARRAY

MOV @R1, A; //WRITE NO TO DESTINATION ARRAY

INC R0; //INCREMENT SOURCE MEMORY POINTER BY 1

INC R1; //INCREMENT DESTINATION MEMORY POINTER BY 1

DJNZ R3, UP; //DECREMENT BYTE COUNTER BY 1, IF BYTE COUNTER ≠ 0

THEN JUMP TO UP

END
15. Sum of series of 8 bit numbers

CLR PSW.7; //CLEAR CARRY FLAG

MOV R3, #00H; //INITIALISE CARRY COUNTER WITH 00

MOV R0, #0AH; //INITIALISE BYTE COUNTER

MOV R1, #20H; //INITIALISE MEMORY POINTER

MOV A, #00H; //CLEAR ACCUMULATOR

ADDC A, @R1; //ADD A WITH NUMBER FROM ARRAY WITH CARRY

JNC DN; //IF CY=0 THEN JUMP TO DN

INC R3; //INCREMENT CARRY COUNTER

INC R1; //INCREMENT MEMORY POINTER

DJNZ R0, UP; //DECREMENT BYTE COUNTER BY 1, IF R0 ≠ 0 THEN JUMP TO UP

MOV @R1, A; //STORE LSB RESULT TO INTERNAL MEMORY

INC R1; //INCREMENT MEMORY POINTER

MOV A, R3; //STORE MSB RESULT TO A

MOV @R1, A; //STORE MSB RESULT TO INTERNAL MEMORY

END

You might also like