Lecture Programming Microcontroller
Lecture Programming Microcontroller
Lecture Programming Microcontroller
Assembly Language
8051 Instruction Set
• Data Transfer
– MOV instructions used to transfer data internal and external to the 8051
• Arithmetic
– Add, subtract, multiply, divide
• Logical
– AND, OR, XOR, NOT and rotate operations
• Boolean variable manipulation
– Operations on bit variables
• Program Branching
– Conditional and unconditional jump instructions
Some Useful Directives
• END
– Last line of code. Assembler will not compile after this line
• ORG
– Origin directive. Sets the location counter address for the following
instructions
– ORG 0000H
• EQU
– Equate directive. Used to equate a name with an address or a data value.
Useful for constant assignments.
– COUNT EQU 25
– MOV R3, #COUNT
• BIT
– Used to assign a symbol name to a bit in bit-addressable data memory
– DB (Define Byte)
– Used to define 8bit data
– DB 28, DB 45H, DB 01011101B, DB 23H, 45H, …
Data transfer Instructions
mov C, 67h
mov C, 2ch.7
8051 Arithmetic Operations
• All arithmetic operations are carried out in the ALU
• The 8051 has 4 arithmetic flags that are stored in the PSW register
1. C Carry Flag
Set if there is a carry out after addition or a borrow after subtraction. Used for unsigned
arithmetic.
3. OV Overflow Flag
Set if there is a carry from bit 6 XOR bit 7 Used for signed arithmetic
4. P Parity Flag
Contains the parity of the accumulator. 1 if odd, 0 if even. Useful for some serial port
operations.
Increment/Decrement Instructions
• INC Source
– Adds 1 to the source
• DEC Source
– Subtract 1 from the source
• MUL AB
– Note no comma between source and destination
– Multiplies the A register by the B register. The low order byte of the result is placed
in A, the high order byte in B.
– The OV flag is set if the result exceeds 255
• DIV AB
– Divides A register by B register.
– The integer part of the quotient is placed in A, the integer part of the remainder is
placed in B.
– OV flag is set if a divide by 0 is attempted
Addition
ADD A, SOURCE ;A = A + Source
• Affect on flags
– Carry bit C is set if there is a carry out of bit 7, cleared otherwise.
• Used for unsigned addition
– AC flag set if there is a carry from bit 3, cleared otherwise
• Used for BCD addition
– OV flag is set if C7 XOR C6, cleared otherwise
• Used for signed addition
Unsigned Addition
• The carry bit C should always be tested after an addition to see if the result has
exceeded 255 (FFH).
– JC Label ;jump if carry bit is set
– JNC Label ;jump if carry bit is clear
Examples: -
25 00011001
47 00101111
72 01001000 No carry (result <=255)
65 01000001
208 11010000
273 1 00010001 Carry (result > 255)
Unsigned Addition
• Write a program to add the contents of internal data memory locations 30H and 31H If
a carry occurs, set the pin P1.0
Examples: -
+25 00011001
-45 11010011
-20 11101100 ;OV = 0, take no action
+120 01111000
+48 00110000
+168 10101000 ;OV = 1, result is –88? Need to adjust result
Signed Addition
+120 01111000
+48 00110000
+168 10101000 ;OV = 1, result is –88? Need to adjust result
• For the above example, inverting the result bit 7 yields 00101000 (+40)
– Because of the overflow the real result is 40 +128 = 168.
Adding 2-Byte Numbers
• Write a program to add 2 integers.
– Integer 1 is stored at addresses 30H and 31H (low byte at address 30H)
– Integer 2 is stored at addresses 32H and 33H (low byte at address 32H)
– The result should be stored at addresses 34H to 36H (low byte at address 34H)
• Hint
– Use the ADDC instruction instead of ADD
BCD Addition
• The 8051 performs addition in pure binary – this may lead to errors when performing
BCD addition
Example
MOV A, #9
ADD A, #11 ;A = 1AH (expecting 20H if these are BCD numbers)
DA A ;A = 20H
Subtraction
• SUBB A, SOURCE
– Subtracts source and carry flags from A
– Result placed in A
• For unsigned subtraction the carry flag C is set if there is a borrow needed for bit 7
• For signed subtraction the OV flag is set if the subtraction of a negative number from a
positive number yields a negative result or if the subtraction of a positive number from
a negative number yields a positive result.
Arithmetic Instructions
Mnemonic Description
ADD A, byte add A to byte, put result in A
ADDC A, byte add with carry
SUBB A, byte subtract with borrow
INC A increment A
INC byte increment byte in memory
INC DPTR increment data pointer
DEC A decrement accumulator
DEC byte decrement byte
MUL AB multiply accumulator by b register
DIV AB divide accumulator by b register
DA A decimal adjust the accumulator
8051 Logical Operations
• All 4 addressing modes may be used for the 8051 logical instructions
• AND
– ANL A,SOURCE
– May be used to selectively clear bits in the destination operand
– e.g. ANL A, #11111100B ;will clear lower 2 bits of A register
• OR
– ORL A, SOURCE
– May be used to selectively set bits in the destination operand
– ORL A, #00000001B ;will set bit 0 of A register
• XOR
– XRL A, SOURCE
– May be used to selectively complement bits in the destination operand
– XRL P1, #00001111B ;will complement lower 4 bits of port 1
Bitwise Logic
Examples:
ANL AND 00001111
ORL OR ANL 10101100
00001100
XRL XOR
CPL Complement 00001111
ORL 10101100
10101111
00001111
XRL 10101100
10100011
CPL 10101100
01010011
8051 Logical Operations
• Complement
– CPL A
– Complements each bit of the A register
• Clear
– CLR A
– Clears each bit of the A register
Other Logic Instructions
CLR - clear
RL – rotate left
RLC – rotate left through Carry
RR – rotate right
RRC – rotate right through Carry
SWAP – swap accumulator nibbles
Rotate Operations
• All rotate operations are carried out on the accumulator
• RL A
– Rotate accumulator left, MSB becomes LSB
7 6 5 4 3 2 1 0
• RLC A
– Rotate accumulator left, MSB becomes carry, carry becomes LSB
C 7 6 5 4 3 2 1 0
• Example
SETB P1.0 ;P1.0 = ‘1’
CLR P1.0 ;P1.0 = ‘0’
or
• Internal registers A, R0 to R7 and DPTR may be used as the source or the destination.
MOV A, 20H ;copies contents of address 20H into the Accumulator MOV 30H,
40H ;copies contents of address 40H to address 30H MOV P1, A ;move the
• Only registers R0 and R1 may be used for moving data to/from internal data memory
when using indirect addressing
• Registers R0, R1 and DPTR may be used when indirectly addressing external memory
(more later)
Addressing Modes Exercise
• What are the contents of registers A, R0, R7 and memory locations 30H and 31H after
the following code runs: -
MOV A, #5 MOV R7, #40H MOV R0, #30H MOV 31H, #14H MOV @RO, A INC R0
MOV R7, @R0
• How long does the code take to execute if the 8051 is operating off a 12MHz crystal?
Unconditional Jumps
•If unsure which of the 3 instructions to use, simply use the JMP instruction and let the
assembler decide which instruction to use.
Conditional Jump
loop: mov a, P1
jz loop ; if a=0, goto loop,
; else goto next instruction
mov b, a
Mnemonic Description
CJNE A, #data <rel addr> Compare A and data, jump
if not equal
CJNE Rn, #data <rel addr> Compare Rn and data,
jump if not equal
CJNE @Rn, #data <rel addr> Compare Rn and memory,
jump if not equal
DJNZ Rn, <rel addr> Decrement Rn and then
jump if not zero
MOV DPL,#44H
MOV SP,#54H
PUSH DPL Finally the location 55H in Stack
memory will be loaded with contents of DPL, i.e. 44H.
Using Interrupts
• The maximum delay for a single loop occurs when the loop counter is initialised
to 0
– This will cause 256 loop iterations
– Delay = (256 * 24)/12000000 = 512usec
1. How long does the above code take to execute if the 8051 is operating off a 12MHz
crystal?
2. Repeat part 1 for a 16MHz crystal
3. Rewrite the code to generate a delay of 1 second accurate to 10usec (assume a
12MHz crystal)
Subroutines
• A subroutine is a block of code that can be used many times in the execution of a larger
program (similar to functions in higher level languages)
• Subroutines allow the program to branch to a section of code and to remember where it
branched from.
• When the subroutine is complete program execution will continue from the line of code
following the subroutine call.
ret ; PC stack
Look-Up Tables
• A look-up table is a table of constants stored in program memory
– Look-up tables can be used to speed up arithmetic operations
– The look-up table may be accessed using the DPTR or PC as a pointer to the start of
the table. The A register is used as an index to the table.
– Use a look-up table that stores the Farenheight equivalent of all possible Celsius
readings
• This would require more program memory – 1 byte for each temperature
• The code is much simpler to implement
Temperature Conversion Program
TABLE EQU 100H ORG 0
MAIN: MOV DPTR, #TABLE LOOP: MOV A, P1
MOVC A, @A+DPTR MOV P2, A
JMP LOOP
ORG 0000H
SJMP MAIN
MAIN: MOV 40H, #88H
MOV A,#0A9H
ADD A,40H
END
Some Examples of ALP
ORG 0000H
SJMP MAIN
MAIN: MOV A, #0FFH/ MOV A,#0XFF
SETB C/CLR C
ANL C,ACC.0
END
Some Examples of ALP
BCD Operation
ORG 0000H
SJMP MAIN
MAIN: MOV A, #28H
ADD A, #12H
DA A
END
Some Examples of ALP
ORG 0000H
SJMP MAIN
MAIN: MOV A, #07H
MOV B, #08H
MUL AB
END
Some Examples of ALP
ORG 0000H
SJMP MAIN
MAIN: MOV A, #38H
MOV B, #08H
DIV AB
END
Interfacing with
8051 Microcontroller
Images of 1) Push switch, 2) Relay, 3) Common Anode Type
7 Segment Display
Interfacing circuit for Push switch & LED
Glowing
Program to glow LEDs one by one in a sequence
continuously
END
What is Relay ?
A relay is an electromechanical switch.
which perform ON and OFF operations
without any human interaction.
ORG 0000H
ORG 0000H SJMP MAIN
SJMP MAIN MAIN: MOV A, 0FCH/ 0FFH
MAIN: SETB P1.5 MOV P1,A
MAIN_LOOP: MOV C, P1.5 END
MOV P1.1,C
SJMP MAIN_LOOP
END