0% found this document useful (0 votes)
142 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
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
142 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
We take content rights seriously. If you suspect this is your content, claim it here.
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