Upload
shivaspy
View
213
Download
0
Embed Size (px)
Citation preview
8/12/2019 8051-CH6-ArithLigic instructns
1/114
1
Chapter 6Arithmetic, Logic Instructions, and
Programs
8/12/2019 8051-CH6-ArithLigic instructns
2/114
2
Sections
6.1 Arithmetic instructions6.2 Signed number concepts and arithmetic
operations6.3 Logic and compare instructions6.4 Rotate instructions and data serialization
6.5 BCD, ASCII, and other application programs
8/12/2019 8051-CH6-ArithLigic instructns
3/114
3
Section 6.1Arithmetic Instructions
8/12/2019 8051-CH6-ArithLigic instructns
4/114
4
Unsigned Numbers
Unsigned numbers are defined as data in which allthe bits are used to represent data, and no bits are
set aside for the positive or negative sign. For a 8-bit data, the operand can be between 00
and FFH.
8/12/2019 8051-CH6-ArithLigic instructns
5/114
5
Unsigned Addition and Subtraction
8/12/2019 8051-CH6-ArithLigic instructns
6/114
6
Addition of Unsigned Numbers
Add the source operand to register A and put theresult in A.
ADD A, source A + source A
MOV A,#25H ;load 25H into A ADD A,#34H ;add 34H to A, now A=59H
The destination operand is always in A. The instruction could change CY,AC,OV
and P.
8/12/2019 8051-CH6-ArithLigic instructns
7/114
Addition
ADD A, #N ADD A, Rr
ADD A, add ADD A, @Rp
7
8/12/2019 8051-CH6-ArithLigic instructns
8/114
8
Show how the flag register is affected by the following instructions.
MOV A,#0F5H ;A=F5 hex ADD A,#0BH ;A=F5+0B=00
Solution:F5H 1111 0101
+0BH +0000 1011100H 0000 0000
After the addition, register A (destination) contains 00 and the flagsare as follows:
CY = 1 since there is a carry out from D7.P = 0 because the number of 1s is 0 (an even number), P is set to 0.AC = 1 since there is a carry from D3 to D4.
Example 6-1
8/12/2019 8051-CH6-ArithLigic instructns
9/114
8/12/2019 8051-CH6-ArithLigic instructns
10/114
10
Example 6-2Assume that RAM locations 40-44 have the following values.Write a program to find the sum of the values. At the end of the
program, register A should contain the low byte and R7 the high byte. All values are in hex.
40=(7D) 41=(EB) 42=(C5)43=(5B) 44=(30)
Solution: MOV R0,#40H ;load pointer MOV R2,#5 ;load counter
CLR A ;A=0 MOV R7,A ;clear R7
AGAIN:ADD A,@R0 ;add (R0)JNC NEXT ;jump to carryINC R7 ;keep track of carries
NEXT : INC R0 ;increment pointerDJNZ R2,AGAIN ;repeat until R2 is zero
8/12/2019 8051-CH6-ArithLigic instructns
11/114
11
ADDC
ADD with carry To add two 16-bit data operands, Add the source
operand to register A and put the result in A. ADDC A, source MOV A,#E7H 3C E7 ADD A,#8DH + 3B 8D MOV R6,A 78 74 MOV A,#3CH CY=1 ADDC A,#3BH ; A=A+operand+CY
MOV R7,A ; R7=78H R6=74H
8/12/2019 8051-CH6-ArithLigic instructns
12/114
ADDC
ADDC A, #n ADDC A, add
ADDC A, Rr ADDC A, @Rp
12
8/12/2019 8051-CH6-ArithLigic instructns
13/114
EXAMPLE
MOV A, #1Ch MOV R5, #0A1h
ADD A, R5 ADD A,R5 ADDC A, #10h
ADDC A, #10h
13
8/12/2019 8051-CH6-ArithLigic instructns
14/114
EXAMPLE
MOV A, #1Ch MOV R5, #0A1h
ADD A, R5 ADD A,R5 ADDC A, #10h
ADDC A, #10h
A = 1Ch R5 = A1h
A = BDh; C = 0, OV = 0 A = 5Eh; C=1, OV= 1 A = 6Fh; C = 0, OV=0
A = 7Fh; C=0; OV=0
14
8/12/2019 8051-CH6-ArithLigic instructns
15/114
EXAMPLE
MOV A, #1Ch MOV R5, #0A1h
ADD A, R5 ADD A,R5 ADDC A, #10h
ADDC A, #10h
A = 1Ch R5 = A1h
A = BDh; C = 0, OV = 0 A = 5Eh; C=1, OV= 1 A = 6Fh; C = 0, OV=0
A = 7Fh; C=0; OV=0
15
8/12/2019 8051-CH6-ArithLigic instructns
16/114
16
Example 6-3
Write a program to add two 16-bit numbers. The numbers are
3CE7H and 3B8DH. Place that sum in R7 and R6; R6 should havethe lower byte.
Solution:CLR C ;make CY=0
MOV A,#0E7H ;load the low byte now A=E7H ADD A,#8DH ;add the low byte,A=74H and CY=1
MOV R6,A ;save the low byte in R6 MOV A,#3CH ;load the high byte ADDC A,#3BH ;add with the carry MOV R7,A ;save the high byte of the sum
8/12/2019 8051-CH6-ArithLigic instructns
17/114
17
SUBB
Subtraction with borrowSUBB A, source ; A = A source CY
CLR C MOV A,#3FH 3 F MOV R3,#23H - 2 3
SUBB A,R3 1 C
If CY=0, it is A=A-source.
We discuss unsigned number here.
8/12/2019 8051-CH6-ArithLigic instructns
18/114
18
Subtraction of Unsigned Numbers (1/2)
The 8051 use adder circuitry to perform thesubtraction command.
In subtraction, the 8051 use the 2s complementmethod. A-B = A+(100H-B)- 100H = A+(2s complement of B) -
100H = A + (2s complement of B) + (toggle CY)
There are two cases for the SUBB: 1 byte subtraction ( CLR C is used) Used for multi-byte numbers and will take care of the
borrow of the lower operand. (Example 6-7)
8/12/2019 8051-CH6-ArithLigic instructns
19/114
19
Subtraction of Unsigned Numbers (2/2)
The steps of the hardwareof the CPU in executing
the SUBB instruction:1. A minus the CY value.2. Take the 2s complement
of the subtrahend.
3. Add it to the minuend (A).4. Invert the carry.
After the subtraction, CY=0: positive result CY=1: negative result
3FH23H=1CH1. A=A-CY=3FH2. 23H -> DDH
(2s complement) 3. 3FH+DDH=11CH,
where CY=1,A=1CH.4. Toggle & get
CY=0
8/12/2019 8051-CH6-ArithLigic instructns
20/114
20
Example 6-5Show the steps involved in the following.
CLR C ;make CY=0 MOV A,#3FH ;load 3FH into A (A=3FH) MOV R3,#23H ;load 23H into R3 (R3=23H)
SUBB A,R3 ;A = A R3
Solution:
A = 3F 0011 1111 0011 1111 (A=A-CY)R3= 23 0010 0011 + 1101 1101 (2s complement)
1C 1 0001 1100CY=0 (after Toggle CY)The flags would be set as follows: CY = 0, AC = 0The programmer must look at the carry flag to determine if the
result is positive or negative.
8/12/2019 8051-CH6-ArithLigic instructns
21/114
21
Example 6-6Analyze the following program:
CLR C MOV A,#4CH ;load A =4CH
SUBB A,#6EH ;subtract 6E from AJNC NEXT ;jump not carry (CY=0)CPL A ;get 2s complement by
INC A ; yourself NEXT: MOV R1,A ;save A in R1
Solution:
4C 0100 1100 0100 1100- 6E 0110 1110 + 1001 0010
-22 0 1101 1110(A)CY=1, the result is negative.We borrow 100H and get positive result DEH.Get the 2s complement of A =0010 0010=22.
8/12/2019 8051-CH6-ArithLigic instructns
22/114
22
Example 6-7Analyze the following program:
CLR CMOV A,#62H 27 62 0110 0010 62HSUBB A,#96H - 12 96 + 0110 1010MOV R7,A 14 CC 0 1100 1100
MOV A,#27HSUBB A,#12H 0010 0110MOV R6,A + 1110 1110
Solution: 1 0001 0100
After the SUBB, A = 62H-96H = CCH and CY=1indicating there isa borrow.
Since CY = 1, when SUBB is executed the second time A = 27H-12H-1 =14H. Therefore, we have 2762H-1296H =14CCH.
96H s 2 s
CY=1 aftertoggle
12H s 2 s
27H-CY
CY=0 after
toggle
8/12/2019 8051-CH6-ArithLigic instructns
23/114
23
Unsigned Multiplication and Division
8/12/2019 8051-CH6-ArithLigic instructns
24/114
24
MUL AB
The 8051 supports byte by byte multiplicationonly.
Multiple A * B, result: B=high byte, A=low byte.MUL AB
MOV A,#25H 25 MOV B,#65H 65 MUL AB 0E 99
B=0EH: upper byte; A=99H: lower byte
8/12/2019 8051-CH6-ArithLigic instructns
25/114
25
Table 6-1: Unsigned MultiplicationSummary (MUL AB)
Multiplication Operand 1 Operand 2 Result
byte byte A B A = low byteB = high byte
8/12/2019 8051-CH6-ArithLigic instructns
26/114
26
DIV AB
The 8051 supports byte by byte division only. Divide A by B, result: B=remainder, A=quotient.
DIV AB
MOV A,#95H MOV B,#10H
DIV AB ;A=09H (quotient);B=05H (remainder)
IF the numerator=B=0, then OV=1
indicates an error and CY=0.
8/12/2019 8051-CH6-ArithLigic instructns
27/114
27
Table 6-2: Unsigned Division Summary
(DIV AB)
Division Numerator Denominator Quotient Remainder
byte/byte A B A B
8/12/2019 8051-CH6-ArithLigic instructns
28/114
28
An Application for DIV
There are times when an analog-to-digitalconverter is connected to a port.
The ADC represents some quantity such astemperature or pressure.
The 8-bit ADC provides data in hex. This hex data must be converted to decimal for
display. We divide it by 10 repeatedly until thequotient is less than 10.
See Example 6-8.
8/12/2019 8051-CH6-ArithLigic instructns
29/114
29
Example 6-8Write a program to get hex data in the range of 00 FFH from port
1 and convert it to decimal. Save the digits in R7, R6 and R5,where the least significant digit is in R7.Solution of (a):
MOV A,#0FFH
MOV P1,A ;make P1 an input port MOV A,P1 ;read data from P1 MOV B,#10 ;B=0A hex (10 dec)
DIV AB ;divide by 10
MOV R7,B ; MOV B,#10 ;P1 has max value 255DIV AB ;3 bytes to save 3 decimals
MOV R6,B ;Twice DIV are used
MOV R5,A ;
8/12/2019 8051-CH6-ArithLigic instructns
30/114
30
Example 6-9
Analyze the program, assuming that P1 has a value of FDH fordata.
Solution of (b): In the case of an 8-bit binary = FDH = 253 in decimal.
Q(A) R(B)FD / 0A= 19 3 (low digit R7=3)
19 / 0A= 2 5 (middle digit R6=5)(high digit R5=2)
Therefore, we have FDH = 253. In order to display this data it must be converted to ASCII, which is described in the next chapter.
8/12/2019 8051-CH6-ArithLigic instructns
31/114
31
Binary Coded Decimal
8/12/2019 8051-CH6-ArithLigic instructns
32/114
32
BCD Number System
Binary Coded Decimal :use binary to represent 0-
9 only. See Table 6.1 BCD Code Two terms for BCD
number: Unpacked BCD Packed BCD
Digit BCD
0
123456789
0000
000100100011010001010110011110001001
8/12/2019 8051-CH6-ArithLigic instructns
33/114
33
Unpacked / Packed BCD Numbers
In Unpacked BCD, a byte is used to contain aBCD number.
0000 0101 is unpacked BCD for 5 0000 1001 is unpacked BCD for 9
In Packed BCD, a byte has two BCD numbers. 0101 1001 is unpacked BCD for 59.
It is twice as efficient in storing data.
8/12/2019 8051-CH6-ArithLigic instructns
34/114
34
Addition of BCD Numbers
ADD and ADDC are just forhexadecimal!
To calculate 17+18=35. MOV A,#17H ADD A,#28H
The programmer must add 6to the low digital such that acarry occurs.
1 7+ 1 8
2 F
2 F+ 0 6
3 5
If lower nibble>9 or AC=1, add 6 to lower nibble.
If higher nibble>9 or CY=1, add 6 to higher nibble.
8/12/2019 8051-CH6-ArithLigic instructns
35/114
35
DA
Decimal adjust for addition DA instruction will add 6 to the lower nibble or
higher nibble if needed.DA A
MOV A,#47H 4 7 MOV B,#55H + 5 5 ADD A,B 9 C
DA A A 2 CY=1 0 2
1. Lower nibble
2. Upper nibble
8/12/2019 8051-CH6-ArithLigic instructns
36/114
36
Section 6.2Signed Number Concepts andArithmetic Operations
8/12/2019 8051-CH6-ArithLigic instructns
37/114
37
Signed Numbers
In everyday life, numbers are used that could be positive or negative.
Usually, 2s complement is used for signednumbers.
8/12/2019 8051-CH6-ArithLigic instructns
38/114
38
Figure 6-2. 8-Bit Signed Operand
D7 D6 D5 D4 D3 D2 D1 D0
sign magnitude
The most significant bit (MSB) is used forthe sign.
The rest is used for themagnitude which is representedin its 2 s complement.
For 2 s complement representation
8/12/2019 8051-CH6-ArithLigic instructns
39/114
39
The Range of Sign Number for a Single Byte
Decimal Binary Hexadecimal-128 1000 0000 80H = 100H-80H
-127 1000 0001 81H = 100H-7FH:
-2 1111 1110 FEH = 100H 2H-1 1111 1111 FFH = 100H 1H
0 0000 0000 00H+1 0000 0001 01H+2 0000 0010 02H
:+127 0111 1111 7FH
2 scomplement
8/12/2019 8051-CH6-ArithLigic instructns
40/114
40
Example 6-10
Show how the 8051 would represent -5.
Solution:
Observe the following steps:1. 0000 0101 5 in 8-bit binary2. 1111 1010 invert each bit3. 1111 1011 add 1 (which becomes FB in hex)
Therefore - 5 = FBH, the signed number representation in 2s complement for -5.We can get FBH=100H-05H=FBH, too.
8/12/2019 8051-CH6-ArithLigic instructns
41/114
41
Example 6-11
Show how the 8051 would represent -34H.
Solution:
Observe the following steps.1. 0011 0100 128 in 8-bit binary2. 1100 1011 invert each bit3. 1100 1100 add 1 (which becomes CC in hex)
Therefore - 34 = CCH, the signed number representation in 2s complement for -34H.We can get FBH=100H-34H=CCH, too.
8/12/2019 8051-CH6-ArithLigic instructns
42/114
42
Example 6-12
Show how the 8051 would represent 128.
Solution:
Observe the following steps.1. 1000 0000 128 in 8-bit binary 80H2. 0111 1111 invert each bit3. 1000 0000 add 1 (which becomes 80 in hex)
Therefore - 128 = 80H, the signed number representation in 2s complement for -128.We can get FBH=100H-80H=FBH, too.
8/12/2019 8051-CH6-ArithLigic instructns
43/114
43
Overflow Problem
The CPU understands only 0s and 1s and ignoresthe human convention of positive and negative
numbers. The overflow flag (OV) is designed to indicate anoverflow of the operations for the signed numbers.
When is an overflow? If the result of an operation on signed numbers is too
large for the 8-bit register, an overflow has occurredand the programmer must be notified.
The range 128 to 127 in decimal.
8/12/2019 8051-CH6-ArithLigic instructns
44/114
44
Example 6-13
Examine the following code and analyze the result.
MOV A,#+96 ;A=0110 0000(A=60H) MOV R1,#+70 ;R1=0100 0110(R1=46H) ADD A,R1 ;A=1010 0110
;A=A6H=-90, INVALID!!
Solution:
96 0110 0000+ 70 0100 0110
+ 166 1010 0110The signed value in the register A=A6H=-90 is wrong.
Programmer must check it by themselves. Note: There is a carry from D6 to D7 but no carry out of D7
8/12/2019 8051-CH6-ArithLigic instructns
45/114
45
When is an Overflow?
In 8-bit signed number operations, OV is set to 1if either of the following two conditions occurs:
1. There is a carry from D6 to D7 but no carry out of D7.2. There is a carry from D7 out but no carry from D6 to
D7.
In both above cases, the overflow flag is set to 1.
8/12/2019 8051-CH6-ArithLigic instructns
46/114
46
Example 6-14
Observe the following, noting the role of the OV flag.
MOV A,#-128 ;A=1000 0000(A=80H) MOV R4,#-2 ;R1=1111 1110(R4=FEH) ADD A,R4 ;A=0111 1110(A=7EH=126)
Solution:
-128 1000 0000+ -2 1111 1110- 130 0111 1110 (CY=1,AC=0,OV=1)
There is a carry from D7 out but no carry from D6 to D7. According to the CPU, there is an overflow (OV = 1).The sign number is wrong.
8/12/2019 8051-CH6-ArithLigic instructns
47/114
47
Example 6-15
Observe the following, noting the OV flag.
MOV A,#-2 ;A=1111 1110 (A=FEH) MOV R1,#-5 ;R1=1111 1011(R1=FBH) ADD A,R1 ;A=1111 1001 (A=F9H=-7,correct)
Solution:
-2 1111 1110+ -5 1111 1011
- 7 1111 1001 (CY=1,AC=1,OV=0)There are carries from D7 out and from D6 to D7.According to the CPU, the result is -7, which is correct (OV = 0).
8/12/2019 8051-CH6-ArithLigic instructns
48/114
Programming Actions
Flags Action
C OV
0 0 None
0 1 Complement the sign1 0 None
1 1 Complement the sign
48
8/12/2019 8051-CH6-ArithLigic instructns
49/114
49
XRL
XRL destination-byte,source-byte MOV A,#35H ;0011 0101
XRL A,#0FH ;0000 1111 => A=0011 1010 No effect on any of the flags. XRL is often used (1) to clear a register, (2) to see if two
registers have the same value or (3) to toggle bits of an
operands.X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
XOR 2 bits Xand Y
unchanged toggled
8/12/2019 8051-CH6-ArithLigic instructns
50/114
50
ANL
ANL destination-byte,source-byte MOV A,#35H ;0011 0101
ANL A,#0FH ;0000 1111 => A=0000 0101 No effect on any of the flags. ANL is often used to mask (set to 0) certain bits of an
operands.X Y X AND Y
0 0 0
0 1 0
1 0 0
1 1 1
AND 2 bits Xand Y
8/12/2019 8051-CH6-ArithLigic instructns
51/114
51
Example 6-17
Show the results of the following.
MOV A,#35H ;A = 35H ANL A,#0FH ;A = A AND 0FH (now A = 05)
Solution:
35H 0 0 1 1 0 1 0 1
0FH 0 0 0 0 1 1 1 105H 0 0 0 0 0 1 0 1 35H AND 0FH = 05H
8/12/2019 8051-CH6-ArithLigic instructns
52/114
52
ORL
ORL destination-byte,source-byte MOV A,#35H ;0011 0101
ORL A,#0FH ;0000 1111 => A=0011 1111 No effect on any of the flags. ORL is often used to set certain bits of an operands to 1.
X Y X OR Y
0 0 0
0 1 1
1 0 1
1 1 1
OR 2 bits Xand Y
8/12/2019 8051-CH6-ArithLigic instructns
53/114
53
Example 6-19
Show the results of the following.
MOV A,#54HXRL A,#78H
Solution:
54H 0 1 0 1 0 1 0 0
78H 0 1 1 1 1 0 0 02CH 0 0 1 0 1 1 0 0 54H XOR 78H = 2CH
8/12/2019 8051-CH6-ArithLigic instructns
54/114
54
Example 6-20
The XRL instruction can be used to clear the contents of a register by XORing it with itself. Show how XRL A,A clears A,
assuming that A = 45H.
Solution:
45H 0100010145H 01000101
00 00000000 XOR a number with itself = 0
8/12/2019 8051-CH6-ArithLigic instructns
55/114
55
Example 6-21
Read and test P1 to see whether it has the value 45H. If it does,send 99H to P2; otherwise, it stays cleared.Solution:
MOV P1,#0FFH ;make P1 an input port MOV P2,#00 ;clear P2 MOV R3,#45H ;R3 = 45H MOV A,P1 ;read p1
XRL A,R3JNZ EXIT ;jump if A 0
MOV P2,#99HEXIT: ...
8/12/2019 8051-CH6-ArithLigic instructns
56/114
56
CPL (Complement Accumulator)
CPL A MOV A,#55H ;0101 0101
CPL A;1010 1010
No effect on any of the flags. This is also called 1s complement.
8/12/2019 8051-CH6-ArithLigic instructns
57/114
57
Example 6-16
Examine the following, noting the role of OV.
MOV A,#+7 ;A=0000 0111 (A=07H) MOV R1,#+18 ;R1=0001 0010(R1=12H) ADD A,R1 ;A=0001 1001 (A=19H=+25,correct)
Solution:
7 0000 0111+ 18 0001 0010
25 0001 1001 CY=0,AC=0 and 0V = 0No carry occurs.According to the CPU, the result is +25, which is correct (OV = 0).
8/12/2019 8051-CH6-ArithLigic instructns
58/114
58
Instructions to Create 2s Complement
There is no special instruction to make the 2scomplement of a number.
However, we can do itCPL A ;1s complement ADD A,#1 ;add 1 to make 2s
complement
8/12/2019 8051-CH6-ArithLigic instructns
59/114
59
Section 6.3Logic and Compare Instructions
8/12/2019 8051-CH6-ArithLigic instructns
60/114
60
Example 6-18
Show the results of the following.
MOV A,#04 ;A = 04ORL A,#30H ;A = 34H
Solution:
04H 0000 0100
30H 0011 000034H 0011 0100 04 OR 30 = 34H
8/12/2019 8051-CH6-ArithLigic instructns
61/114
61
Example 6-22
Find the 2s complement of the value 85H.
Solution:
MOV A,#85H 85H = 1000 0101CPL A ;1s comp. 1s = 0111 1010
ADD A,#1 ;2s comp. + 10111 1011 = 7BH
8/12/2019 8051-CH6-ArithLigic instructns
62/114
62
CJNE (1/2)
Compare and Jump if Not EqualCJNE destination, source, relative address
MOV A,#55H CJNE A,#99H,NEXT... ;do here if A=99H
NEXT: ... ;jump here if A 99H
The compare instructions really a subtraction, exceptthat the operands themselves remain unchanged.
Flags are changed according to the execution of theSUBB instruction.
8/12/2019 8051-CH6-ArithLigic instructns
63/114
63
CJNE (2/2)
This instruction affects the carry flag only. CJNE R5,#80,NEXT... ;do here if R5=80
NEXT: JNC LAR... ;do here if R580
Compare Carry Flag
destination > source CY = 0
destination < source CY = 1Table 7-1
E l 6 23
8/12/2019 8051-CH6-ArithLigic instructns
64/114
64
Example 6-23
Examine the following code, then answer the following questions.
(a) Will it jump to NEXT?(b) What is in A after the CJNE instruction is executed?
MOV A,#55HCJNE A,#99H,NEXT
... NEXT: ...
Solution:(a) Yes, it jumps because 55H and 99H are not equal.(b) A = 55H, its original value before the comparison.
8/12/2019 8051-CH6-ArithLigic instructns
65/114
65
Example 6-24
Write code to determine if register A contains the value 99H. If so,make R1 = FFH; otherwise, make R1 = 0.
Solution:
MOV R1,#0 ;clear R1CJNE A,#99H,NEXT ;if A99, then jump
MOV R1,#0FFH ;if A 99, R1=FFH
NEXT:... ;if A99, R1=0 OVER:...
Example 6-25
8/12/2019 8051-CH6-ArithLigic instructns
66/114
66
pAssume that P1 is an input port connected to a temperature sensor.Write a program to read the temperature and test it for the value 75.According to the test results, place the temperature value into theregisters indicated by the following.
If T = 75 then A = 75If T < 75 then R1 = TIf T > 75 then R2 = T
Solution: MOV P1,#0FFH ;make P1 an input port MOV A,P1 ;read P1 port
CJNE A,#75,OVER ;jump if A75 SJMP EXIT ;A=75
OVER: JNC NEXT ; MOV R1,A ;A75, save A in R2
EXIT: ...
8/12/2019 8051-CH6-ArithLigic instructns
67/114
67
Example 6-26
Write a program to monitor P1 continuously for the value 63H. Itshould get out of the monitoring only if P1 = 63H.
Solution:
MOV P1,#0FFH ;make P1 an input portHERE:MOV A,P1 ;get P1
CJNE A,#63,HERE ;keep monitoring unless; P1=63H
Example 6-27
8/12/2019 8051-CH6-ArithLigic instructns
68/114
68
Example 6-27Assume internal RAM memory locations 40H 44H contain thedaily temperature for five days, as shown below. Search to see if anyof the values equals 65. If value 65 does exist in the table, give itslocation to R4; otherwise, make R4 = 0.40H= 76 41H= 79 42H= 69 43H= 65 44H= 62 Solution:
MOV R4,#0 ;R4=0 MOV R0,#40H ;load pointer MOV R2,#05 ;load counter MOV A,#65 ;A=65, value searched for
BACK:CJNE A,@R0 , NEXT ;compare RAM data with 65 MOV R4,R0 ;if 65, save addressSJMP EXIT ;and exit
NEXT:INC R0 ;increment pointerDJNZ R2,BACK ;keep check until count=0
EXIT: ...
8/12/2019 8051-CH6-ArithLigic instructns
69/114
69
Section 6.4
Rotate Instructions and DataSerialization
8/12/2019 8051-CH6-ArithLigic instructns
70/114
70
RR (Rotate A Right)
RR A MOV A,#36H ;A=0011 0110
RR A ;A=0001 1011RR A ;A=1000 1101RR A ;A=1100 0110RR A ;A=0110 0011
MSB LSB
8/12/2019 8051-CH6-ArithLigic instructns
71/114
71
RL (Rotate A Left)
RL A MOV A,#36H ;A=0011 0110
RL A ;A=0110 1100RL A ;A=1101 1000RL A ;A=1011 0001RL A ;A=0110 0011
MSB LSB
8/12/2019 8051-CH6-ArithLigic instructns
72/114
72
RRC (Rotate A Right Through Carry)
RRC A MOV A,#36H ;A=0011 0110, CY=0
RRC A ;A=0001 1011, CY=0RRC A ;A=0000 1101, CY=1RRC A ;A=1000 0110, CY=1RRC A ;A=1100 0011, CY=0
MSB LSB CY
8/12/2019 8051-CH6-ArithLigic instructns
73/114
73
RLC (Rotate A Left Through Carry)
RLC A MOV A,#36H ;A=0011 0110, CY=1
RLC A ;A=0110 1101, CY=0RLC A ;A=1101 1010, CY=0RLC A ;A=1011 0100, CY=1RLC A ;A=1001 1001, CY=1
CY MSB LSB
8/12/2019 8051-CH6-ArithLigic instructns
74/114
74
Serializing Data
One application of rotate operations is serializingdata.
Serializing data is a way of sending a byte of dataone bit at a time through a single pin ofmicrocontroller. Way 1: using the serial port
The programmers have very limited control over the sequenceof data transfer. See Chapter 10.
Way 2: serializing data Transfer data one bit at a time and control the sequence of data
and spaces in between them Take less space on printed circuit
Fig 10 1 S i l P ll l D t
8/12/2019 8051-CH6-ArithLigic instructns
75/114
75
Figure 10-1. Serial versus Parallel DataTransfer
Sender Receiver Sender Receiver
Serial Transfer Parallel Transfer
D0
D7
8/12/2019 8051-CH6-ArithLigic instructns
76/114
76
Serializing a Byte of Data
Transfer a byte of data seriallyRRC A ;Move the bit to CY
MOV P1.3,C ;output CY as data bit
Ex 6-28, 6-29
Example 6-28
8/12/2019 8051-CH6-ArithLigic instructns
77/114
77
Write a program to transfer value 41H serially (one bit at a time) via pin P2.1. Put two highs at the start and end of the data. Send the byte LSB first.
Solution: MOV A,#41H
SETB P2.1 ;first high at startSETB P2.1 ;second high at start
MOV R5,#8 ;counterHERE: RRC A ;
MOV P2.1,C ;send CY to P2.1DJNZ R5,HERE ;SETB P2.1 ;first high at end
SETB P2.1 ;second high at end
1101000001 11
A
CYA 1D0
P2.11
D71
Example 6-29
8/12/2019 8051-CH6-ArithLigic instructns
78/114
78
Write a program to bring in a byte of data serially one at a time via pin P2.7 and save it in register R2. The byte comes in with theLSB first.
Solution: MOV R5,#8 ;counter
HERE: MOV C,P2.7 ;bring a bitRRC A ;DJNZ R5,HERE ;
MOV R2, A ;save it
01000001
A
CY A1D0
P2.11
D71
8/12/2019 8051-CH6-ArithLigic instructns
79/114
79
Single-bit Operations
Instructions that are used for single-bit operationsare given in Table 8-1. These instructions can be used for any bit. Some instructions that allow single-bit operations, but
only along with the carry flag (CY).
In 8051, there are several instructions by which
the CY flag can be manipulated directly.
8/12/2019 8051-CH6-ArithLigic instructns
80/114
80
Table 4-6: Single-Bit Instructions
Instruction Function
SETB bit Set the bit (bit = 1)
CLR bit Clear the bit (bit = 0)
CPL bit Complement the bit (bit = NOT bit)
JB bit,target Jump to target if bit = 1 (jump if bit)
JNB bit,target Jump to target if bit = 0 (jump if no bit)
JBC bit,target Jump to target if bit = 1, clear bit (jump if bit, then clear)
Table 6 4: Carry Bit Related Instructions
8/12/2019 8051-CH6-ArithLigic instructns
81/114
81
Table 6-4: Carry Bit-Related Instructions
Instruction Function
SETB C make CY = 1CLR C clear carry bit (CY = 0)CPL C complement carry bitMOV b,C copy carry status to bit location (b=CY)MOV C,b copy bit location status to carry (CY=b)JNC target jump to target if CY = 0JC target jump to target if CY = 1ANL C,bit AND CY with bit and save it on CYANL C,/bit AND CY with inverted bit and save it on CY
ORL C,bit OR CY with bit and save it on CYORL C,/bit OR CY with inverted bit and save it on CY
8/12/2019 8051-CH6-ArithLigic instructns
82/114
82
Example 6-30
Write a program to save the status of bits P1.2 and P1.3 on RAM bit locations 6 and 7, respectively.
Solution:CY is used as a bit buffer.
MOV C,P1.2 ; save status of P1.2 on CY
MOV 06 , C ;save in RAM bit location 06 MOV C,P1.3 ;save status of P1.3 on CY MOV 07,C ;save in RAM bit location 07
E l 6 31
8/12/2019 8051-CH6-ArithLigic instructns
83/114
83
Example 6-31
Assume that the bit P2.2 is used to control the outdoor light and bit
P2.5 to control the light inside a building. Show how to turn on theoutside light and turn off the inside one.
Solution:
STEB C ;CY=1ORL C,P2.2 ;CY = P2.2 ORed with CY
MOV P2.2,C ;turn it on CLR C ;CY=0
ANL C,P2.5 ;CY=P2.5 ANDed with CY MOV P2.5,C ;turn it off
8/12/2019 8051-CH6-ArithLigic instructns
84/114
84
Example 6-32
Write a program that finds the number of 1s in a given byte.
Solution:
MOV R1,#0 ;R1 keeps the number of 1s MOV R7,#8 ;counter=08 rotate 8 times MOV A,#97H ;A=10010111H
AGAIN: RLC A ;rotate it through CY onceJNC NEXT ;check for CY INC R1 ;if CY=1 then R1++
NEXT: DJNZ R7,AGAIN
8/12/2019 8051-CH6-ArithLigic instructns
85/114
85
SWAP A
SWAP A MOV A,#72H ;A=72H
SWAP A ;A=27H
0111 0010
0010 0111
before:
after:
D7 D4 D3 D0
D3 D0 D7 D4
before:
after :
Example 6-33
8/12/2019 8051-CH6-ArithLigic instructns
86/114
86
(a) Find the contents of register A in the following code.(b) In the absence of a SWAP instruction, how would youexchange the nibbles? Write a simple program to show the process.
Solution:
(a)
MOV A,#72H ;A = 72HSWAP A ;A = 27H
(b) MOV A,#72H ;A=0111 0010
RL A ;A=1110 0100RL A ;A=1100 1001RL A ;A=1001 0011RL A ;A=0010 0111
E l Of S i l C i i
8/12/2019 8051-CH6-ArithLigic instructns
87/114
87
Example Of Serial Communication
Write a program to transfer data to serial memories such as serialEEPROMs.
Solution:...
RLC A ;first bit to carryMOV P1.3,C ;output carry as data bit RLC A ;second bit to carryMOV P1.3,C ;output carry as data bit RLC A ;first bit to carryMOV P1.3,C ;third carry as data bit...
8/12/2019 8051-CH6-ArithLigic instructns
88/114
88
Section 6.5
BCD, ASCII, and Other ApplicationPrograms
8/12/2019 8051-CH6-ArithLigic instructns
89/114
89
Conversion of BCD and ASCII
There is a real time clock (RTC) in many newmicrocontrollers. Ex: DS5000T has RTC
RTC keep the time (hour, minute, second) anddate (year, month, day) when the power is off.
This data is provided in packed BCD.
For this data to be displayed (ex: on an LCD), itmust be in ASCII format.
We show above instructions in the conversion of
BCD and ASCII
T bl 6 5 ASCII C d f Di it 0 9
8/12/2019 8051-CH6-ArithLigic instructns
90/114
90
Table 6-5. ASCII Code for Digits 0 9
Key ASCII (hex) Binary BCD (unpacked)0 30 011 0000 0000 00001 31 011 0001 0000 00012 32 011 0010 0000 00103 33 011 0011 0000 00114 34 011 0100 0000 01005 35 011 0101 0000 01016 36 011 0110 0000 01107 37 011 0111 0000 01118 38 011 1000 0000 10009 39 011 1001 0000 1001
8/12/2019 8051-CH6-ArithLigic instructns
91/114
91
Packed BCD to ASCII Conversion
To convert packed BCD to ASCIIStep 1. It must be converted to unpacked BCD first.
MOV A,#29H ;It means 29 10 ANL A,#0FH ;get the lower nibble
Step 2. The unpacked BCD is tagged with 30HORL A,#30H ;make it an ASCII,A=39H 9
8/12/2019 8051-CH6-ArithLigic instructns
92/114
92
ASCII to packed BCD Conversion
To convert ASCII to packed BCDStep 1. It must be converted to unpacked BCD first.
MOV A,#2 ;A=32H ANL A,#0FH ;get the lower nibble MOV R1,#9 ;R1=39H ANL R1,#0FH ;get the lower nibble
Step 2. Combined them to the packed BCD.SWAP A ;become upper nibble A=20HORL A,R1 ;packed BCD,A=29H
Example 6-34 (modified)
8/12/2019 8051-CH6-ArithLigic instructns
93/114
93
Assume that register A has packed BCD, write a program to convert packed BCD to two ASCII numbers and place them in R2 and R6.Solution:
MOV A,#29H ;packed BCD ANL A,#0FH ;Lower nibble: A=09H
ORL A,#30H ;make it an ASCII, A=39H (9) MOV R6,A ;R6=39H ASCII char MOV A,#29H ; ANL A,#0F0H ;upper nibble: A=20H
SWAP A ;A=02H, equals to RR A 4 timesORL A,#30H ;A=32H,ASCII char.2
MOV R2,A ;R2=32H ASCII char
8/12/2019 8051-CH6-ArithLigic instructns
94/114
94
Using a Look-up Table for ASCII
Its much easier to use a look -up table to getASCII character than mathematical computation.
See Example 6-35.
Example 6-35 (1/2)
8/12/2019 8051-CH6-ArithLigic instructns
95/114
95
Assume that the lower three bits of P1 are connected to threeswitches. Write a program to send the following ASCII charactersto P2 based on the status of the switches.
000 0
001 1
010 2 011 3
100 4
101 5 110 6
111 7
P1.0P1.1P1.2 P2
8
switches
Example 6-35 (2/2)
8/12/2019 8051-CH6-ArithLigic instructns
96/114
96
Solution:
MOV DPTR,#MYTABLE MOV A,P1 ANL A,#07H ;only last 3 bits needed MOVC A,@A+DPTR ;get data form table
MOV P2,ASJMP $
;--------------------------------------------ORG 400H
MYTABLE DB 0,1,2,3,4,5,6,7 END
8/12/2019 8051-CH6-ArithLigic instructns
97/114
97
Create Checksum Byte in ROM
To ensure the integrity of the ROM contents,every system perform the checksum calculation.
The checksum byte is an extra byte that is taggedto the end of a series of bytes of data.
To calculate the checksum byte:1. Add the bytes together and drop the carries.
25H+62H+3FH+52H=118H sum=18H 2. Take the 2s complement of the sum. This is checksum
byte, attached as the last byte of the series.2s complement of 18H = E8H The series becomes 25H-62H-3FH-52H-E8H
8/12/2019 8051-CH6-ArithLigic instructns
98/114
98
Checksum Operation
To perform the checksum operations:1. add all the bytes, including the checksum byte2. The result must be zero. If the result is not zero, there is
some error occurred.
See Example 6-36
Example 6-36 (1/2)
8/12/2019 8051-CH6-ArithLigic instructns
99/114
99
Assume that we have 4 bytes of hexadecimal data: 25H, 62H, 3FH,and 52H.
(a) Find the checksum byte,(b) perform the checksum operation to ensure data integrity, and(c) if the second byte 62H has been changed to 22H, show how
checksum detects the error.
Solution:
(a) Find the checksum byte
25H+62H+3FH+52H=118H sum=18H Dropping the carry of 1, we have 18H.
The 2s complement of 18H is E8H. The checksum byte = E8H
Example 6-36 (2/2)
8/12/2019 8051-CH6-ArithLigic instructns
100/114
100
(b) Perform the checksum operation to ensure data integrity
25H+62H+3FH+52H+E8H=200H sum=00H Dropping the carries, we have 00H.Data is correct!
(c) If the second byte 62H has been changed to 22H, show howchecksum detects the error.
25H+22H+3FH+52H+E8H=1C0H sum=C0H
Dropping the carries, we have C0H, which is not 00H.The ROM data is corrupted
8/12/2019 8051-CH6-ArithLigic instructns
101/114
101
Binary to ASCII Conversion
Many ADC (Analog-to-Digital Converter) chips provide output data in binary.
To display the data on an LCD or PC screen, weneed to convert it to ASCII.
8/12/2019 8051-CH6-ArithLigic instructns
102/114
102
Binary-to-ASCII Conversion Program (1/3)
;Converting binary (hexadecimal) to ASCII;---------- Initialization -----------RAM_ADDR EQU 40H
DASCI_RSULT EQU 50HCOUNT EQU 3;---------- main program -----------
ORG 0 ACALL BIN_DEC_CONVRT ACALL DEC_ASCI_CONVRT
SJMP $
8/12/2019 8051-CH6-ArithLigic instructns
103/114
103
Binary-to-ASCII Conversion Program (2/3)
BIN_DEC_CONVRT: ; converting binary to decimal MOV R0,#RAM_ADDR MOV A,P1
MOV B,#10DIV AB MOV @R0,B ;save lower digit
INC R0 MOV B,#10
DIV AB MOV @R0,B ;save next digit
INC R0 MOV @R0,A ;save last digit
RET
8/12/2019 8051-CH6-ArithLigic instructns
104/114
104
Binary-to-ASCII Conversion Program (3/3)
;-- converting decimal to displayable ASCII --DEC_ASCI_CONVRT:
MOV R0,#RAM_ADDR
MOV R1,#ASCI_RSULT MOV R2,#3BACK: ADD A,@R0 ;calculate the sum
ORL A,#30H MOV @R1,A
INC R0INC R1DJNZ R2,BACKRET
END
8/12/2019 8051-CH6-ArithLigic instructns
105/114
105
Checksum Program in Modules
The checksum generation and testing program isgiven in modular form.
Dividing a program into several modules allowsus to use tis modules in other applications.
See Checksum Program
8/12/2019 8051-CH6-ArithLigic instructns
106/114
106
Checksum Program (1/5)
;Calculation and testing checksum byte;---------- Initialization -----------DATA_ADDR EQU 400H
COUNT EQU 4RAM_ADDR EQU 30H
;---------- main program ----------- ORG 0
ACALL COPY_DATA ;copy data to RAM ACALL CAL_CHKSUM ;get checksum ACALL TEST_CHKSUM ;test checksum
SJMP $
8/12/2019 8051-CH6-ArithLigic instructns
107/114
107
Checksum Program (2/5)
;-- copy R2 bytes from ROM to RAM --COPY_DATA:
MOV DPTR,#DATA_ADDR
MOV R0,#RAM_ADDR MOV R2,#COUNTH1: CLR A
MOVC A,@A_DPTR MOV @R0,A
INC DPTRINC R0DJNZ R2,H1RET
8/12/2019 8051-CH6-ArithLigic instructns
108/114
108
Checksum Program (3/5)
;-- calculating checksum byte and save --;-- checksum in RAM location #RAM_ADDR+#COUNT --CAL_CHKSUM:
MOV R1,#RAM_ADDR MOV R2,#COUNT
CLR AH2: ADD A,@R1 ;calculate the sum
INC R1DJNZ R2,H2CPL A ;2s complement INC A
MOV @R1,A ;save checksum
RET
8/12/2019 8051-CH6-ArithLigic instructns
109/114
109
Checksum Program (2/5)
;-- testing checksum byte --TEST_CHKSUM:
MOV R1,#RAM_ADDR MOV R2, #COUNT+1
CLR AH3: ADD A,@R1 ;calculate the sum
INC R1DJNZ R2,H3JZ G_1 ;if A=0 jump to G_1
MOV P1,#B ;bad dataSJMP OVER
G_1: MOV P1,#G ;correct
OVER: RET
8/12/2019 8051-CH6-ArithLigic instructns
110/114
110
Checksum Program (2/5)
;-- my data in code ROM --ORG 400H
MYDATA: DB 25H,62H,3FH,52HCLR AEND
8/12/2019 8051-CH6-ArithLigic instructns
111/114
111
Conversions
Packed BCD to ASCII By mathematical computation Using look-up table
ASCII to packed BCD Binary to ASCII Calculate the checksum byte in ROM Perform checksum operation Checksum program in module
8/12/2019 8051-CH6-ArithLigic instructns
112/114
112
You are able to 1/2
Define the range of numbers possible in 8051unsigned data
Code addition and subtraction instructions forunsigned data
Perform addition of BCD data Code 8051 unsigned data multiplication and
division instructions Code 8051 Assembly language logic function
instructions AND, OR and EX-OR
8/12/2019 8051-CH6-ArithLigic instructns
113/114
113
You are able to 2/2
Use 8051 logic instructions for bit manipulation Use compare and jump instructions for program control
Code 8051 rotate instruction and data serialization Explain the BCD binary coded decimal system of
data representation Contrast and compare packed and unpacked BCD data Code 8051 programs for ASCII and BCD data
conversion Code 8051 program to create and test the checksum
byte
8/12/2019 8051-CH6-ArithLigic instructns
114/114
Homework
Problems1,3,4,11,13,15,26,27,32,33,36,37,40,42,46
Note: In the problem, please find the CY, AC and OV flags
for each the following. You can do it by the simulationtools.
Please write and compile the programs. Print the listfiles and paste them in your homework.