Document

Chapter 6
Arithmetic, Logic Instructions, and
Programs
1
Objective (1/2)
• 首先介紹關於加減乘除的指令。
– 8051 內部運算都是以 byte 為單位,所以當資料量
會有機會超過 one byte 時,programmer 自己要小心。
– 由於 8051 內部運算其實是很簡單的,跟本就是單
純的binary 的運算。所以當我們想要做 signed
number 或 BCD 的運算時,就必需靠 programmer 自
己觀察 PSW 的變化與增加許多的檢查。
• 介紹關於邏輯運算的指令。如ANL、ORL、
XRL、CPL等指令。另外有執行 byte 旋轉的指
令。如RR、RL、SWAP,簡單可是很有用。
2
Objective (2/2)
• CY的operations指令是用於 bit manipulation,我
們關心的只是 byte 中的某幾個 bits 而已。
• 最後有一個範例是利用這些指令做 BCD 與
ASCII 之間的轉換。
• 我們將只是很簡單的介紹這些指令,如果你想
得到更多關於這些指令的用法與範例,如更多
的 addressing mode 的用法,請看 Appendix A.1。
3
Sections
6.1 Arithmetic instructions
6.2 Signed number concepts and arithmetic
operations
6.3 Logic and compare instructions
6.4 Rotate instructions and data serialization
6.5 BCD, ASCII, and other application programs
4
Section 6.1
Arithmetic Instructions
5
Unsigned Numbers
• Unsigned numbers are defined as data in which all
the 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.
6
Unsigned Addition and Subtraction
7
Addition of Unsigned Numbers
• Add the source operand to register A and put the
result 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
Example 6-1
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
+0BH
100H
1111 0101
+0000 1011
0000 0000
After the addition, register A (destination) contains 00 and the flags
are 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.
9
Addition of Individual Bytes
• To calculate the sum of any number of operands,
the carry flag should be checked after the addition
of each operation.
A
+ R0
0111 1101
1110 1011
1 0110 1000
CY=1
Add 1 to R7
Result :
0000 0001
0110 1000
R7
A
10
Example 6-2
Assume 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 carry
INC R7
;keep track of carries
NEXT: INC R0
;increment pointer
DJNZ R2,AGAIN ;repeat until R2 is zero
11
ADDC
• ADD with carry
ADDC A, source
• To add two 16-bit data operands, Add the source
operand to register A and put the result in A.
MOV
ADD
MOV
MOV
ADDC
MOV
A,#E7H
A,#8DH
R6,A
A,#3CH
A,#3BH
R7,A
3C
+ 3B
78
E7
8D
74
CY=1
; A=A+operand+CY
; R7=78H R6=74H
12
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 have
the lower byte.
Solution:
CLR C
MOV A,#0E7H
ADD A,#8DH
MOV R6,A
MOV A,#3CH
ADDC A,#3BH
MOV R7,A
;make CY=0
;load the low byte now A=E7H
;add the low byte,A=74H and CY=1
;save the low byte in R6
;load the high byte
;add with the carry
;save the high byte of the sum
13
SUBB
• Subtraction with borrow
SUBB A, source ; A = A – source – CY
CLR
MOV
MOV
SUBB
C
A,#3FH
R3,#23H
A,R3
3 F
- 2 3
1 C
– If CY=0, it is A=A-source.
14
Subtraction of Unsigned Numbers (1/2)
• The 8051 use adder circuitry to perform the
subtraction command.
• In subtraction, the 8051 use the 2’s complement
method.
– A-B = A+(100H-B)-100H = A+(2’s complement of B)100H = A + (2’s complement of B) + (toggle CY)
• There are two cases for the SUBB:
– 1 byte subtraction (CLR C is used to clear borrow CY)
– Used for multi-byte numbers and will take care of the
borrow (CY) of the lower operand. (Example 6-7)
15
Subtraction of Unsigned Numbers (2/2)
•
The steps of the hardware
• 3FH–23H=1CH &
of the CPU in executing
CY=0
the SUBB instruction:
1. A minus the CY value.
2. Take the 2’s complement
of the subtrahend.
3. Add it to the minuend (A).
4. Invert the carry.
1. A=A-CY=3FH
2. 23H  DDH
(2’s complement)
3. 3FH+DDH=11CH,
where CY=1,A=1CH.
4. Toggle & get CY=0
After the subtraction,
CY=0: A holds the positive result.
CY=1: a negative result and A is its 2’s complement
16
Example 6-5
Show 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
R3= 23 0010 0011 +
1C
1
CY=0
0011 1111 (A=A-CY)
1101 1101 (2’s complement)
0001 1100
(after Toggle CY)
The flags would be set as follows: CY = 0, AC = 0
The programmer must look at the carry flag to determine if the
result is positive or negative.
17
Example 6-6
Analyze the following program:
CLR C
MOV A,#4CH ;load A =4CH
SUBB A,#6EH ;subtract 6E from A
JNC NEXT
;jump not carry (CY=0)
CPL A
;get 2’s 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 2’s complement of A =0010 0010=22.
18
Example 6-7
Analyze the following program:
CLR C
MOV A,#62H
27 62
SUBB A,#96H
- 12 96
MOV R7,A
14 CC
MOV A,#27H
SUBB A,#12H
MOV R6,A
Solution:
0110 0010
+ 0110 1010
0 1100 1100
0010 0110
+ 1110 1110
1 0001 0100
62H
96H’s 2’s
CY=1 after
toggle
27H-CY
12H’s 2’s
CY=0 after
toggle
After the SUBB, A = 62H-96H = CCH and CY=1indicating there is a
borrow.
Since CY = 1, when SUBB is executed the second time A = 27H-12H1 =14H. Therefore, we have 2762H-1296H =14CCH.
19
Unsigned Multiplication and Division
20
MUL AB
• The 8051 supports byte by byte multiplication
only.
• Multiple A * B, result: B=high byte, A=low byte.
MUL AB
MOV
MOV
MUL
A,#25H
B,#65H
AB
25
× 65
0E 99
B=0EH: upper byte; A=99H: lower byte
21
Table 6-1: Unsigned Multiplication
Summary (MUL AB)
Multiplication Operand 1 Operand 2 Result
byte × byte
A
B
A = low byte
B = high byte
22
DIV AB
• The 8051 supports byte by byte division only.
• Divide A by B, result: B=remainder, A=quotient.
DIV AB
MOV
MOV
DIV
A,#95H
B,#10H
AB
;A=09H (quotient)
;B=05H (remainder)
– IF the numerator=B=0, then OV=1
indicates an error and CY=0.
23
Table 6-2: Unsigned Division Summary
(DIV AB)
Division
Numerator Denominator Quotient
Remainder
byte/byte
A
B
B
A
24
An Application for DIV
• There are times when an analog-to-digital
converter is connected to a port.
• The ADC represents some quantity such as
temperature 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 the
quotient is less than 10.
• See Example 6-8.
25
Example 6-8
Write 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 255
DIV AB
;3 bytes to save 3 decimals
MOV R6,B
;Twice DIV are used
MOV R5,A
;
26
Example 6-9
Analyze the program, assuming that P1 has a value of FDH for
data.
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.
27
Binary Coded Decimal
28
BCD Number System
• Binary Coded Decimal :
use binary to represent 09 only.
• See Table 6.1 BCD Code
• Two terms for BCD
number:
– Unpacked BCD
– Packed BCD
Digit
BCD
0
1
2
3
4
5
6
7
8
9
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
29
Unpacked / Packed BCD Numbers
• In Unpacked BCD, a byte is used to contain a
BCD 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.
30
Addition of BCD Numbers
• ADD and ADDC are just for
hexadecimal!
• To calculate 17+18=35.
MOV
ADD
A,#17H
A,#28H
• The programmer must add 6
to the low digital such that a
carry occurs.
1
+ 1
2
7
8
F
2
+ 0
3
F
6
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.
31
DA
• Decimal adjust for addition
• DA instruction will add 6 to the lower nibble or
higher nibble if needed.
DA A
MOV
MOV
ADD
DA
A,#47H
B,#55H
A,B
A
4
+ 5
9
A
CY=1 0
7
5
C
1. Lower nibble
2
2. Upper nibble
2
32
Section 6.2
Signed Number Concepts and
Arithmetic Operations
33
Signed Numbers
• In everyday life, numbers are used that could be
positive or negative.
• Usually, 2’s complement is used for signed
numbers.
34
Figure 6-2. 8-Bit Signed Operand
For 2’s complement representation
D7
D6
D5
sign
The most significant
bit (MSB) is used for
the sign.
D4
D3
D2
D1
D0
magnitude
The rest is used for the
magnitude which is represented
in its 2’s complement.
35
The Range of Sign Number for a Single Byte
• Decimal
-128
-127
-2
-1
0
+1
+2
+127
Binary
1000 0000
1000 0001
:
1111 1110
1111 1111
0000 0000
0000 0001
0000 0010
:
0111 1111
Hexadecimal
80H = 100H-80H
81H = 100H-7FH
FEH = 100H –2H
FFH = 100H –1H
00H
2‘s
complement
01H
02H
36
7FH
Example 6-10
Show how the 8051 would represent -5.
Solution:
Observe the following steps:
1. 0000 0101 5 in 8-bit binary
2. 1111 1010 invert each bit
3. 1111 1011 add 1 (which becomes FB in hex)
Therefore -5 = FBH, the signed number representation in 2’s
complement for -5.
We can get FBH=100H-05H=FBH, too.
37
Example 6-11
Show how the 8051 would represent -34H.
Solution:
Observe the following steps.
1. 0011 0100 128 in 8-bit binary
2. 1100 1011 invert each bit
3. 1100 1100 add 1 (which becomes CC in hex)
Therefore -34 = CCH, the signed number representation in 2’s
complement for -34H.
We can get FBH=100H-34H=CCH, too.
38
Example 6-12
Show how the 8051 would represent –128.
Solution:
Observe the following steps.
1. 1000 0000 128 in 8-bit binary 80H
2. 0111 1111 invert each bit
3. 1000 0000 add 1 (which becomes 80 in hex)
Therefore -128 = 80H, the signed number representation in 2’s
complement for -128.
We can get FBH=100H-80H=FBH, too.
39
Overflow Problem
• The CPU understands only 0s and 1s and ignores
the human convention of positive and negative
numbers.
• The overflow flag (OV) is designed to indicate an
overflow 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 occurred
and the programmer must be notified.
– The range –128 to 127 in decimal.
40
Example 6-13
Examine the following code and analyze the result.
MOV A,#+96
MOV R1,#+70
ADD A,R1
;A=0110 0000(A=60H)
;R1=0100 0110(R1=46H)
;A=1010 0110
;A=A6H=-90, INVALID!!
Solution:
96
+ 70
+ 166
0110 0000
0100 0110
1010 0110
The 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
41
When is an Overflow?
•
In 8-bit signed number operations, OV is set to 1
if 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.
42
Example 6-14
Observe the following, noting the role of the OV flag.
MOV A,#-128
MOV R4,#-2
ADD A,R4
;A=1000 0000(A=80H)
;R1=1111 1110(R4=FEH)
;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.
43
Example 6-15
Observe the following, noting the OV flag.
MOV A,#-2
MOV R1,#-5
ADD A,R1
;A=1111 1110 (A=FEH)
;R1=1111 1011(R1=FBH)
;A=1111 1001 (A=F9H=-7,correct)
Solution:
-2
+ -5
- 7
1111 1110
1111 1011
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).
44
XRL
XRL destination-byte,source-byte
MOV
XRL
A,#35H
A,#0FH
;0011 0101
;0000 1111
unchanged toggled
=> 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
X
Y
X XOR Y
operands.
0
0
0
0
1
1
XOR 2 bits X
and Y
1
0
1
1
1
0
45
ANL
ANL destination-byte,source-byte
MOV
ANL
A,#35H
A,#0FH
;0011 0101
;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
AND 2 bits X
and Y
1
0
0
1
1
1
46
Example 6-17
Show the results of the following.
MOV
ANL
A,#35H
A,#0FH
;A = 35H
;A = A AND 0FH (now A = 05)
Solution:
35H
0FH
05H
0 0 1 1 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 0 0 1 0 1
35H AND 0FH = 05H
47
ORL
ORL destination-byte,source-byte
MOV
ORL
A,#35H
A,#0FH
;0011 0101
;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.
OR 2 bits X
and Y
X
0
Y
0
X OR Y
0
0
1
1
1
0
1
1
1
1
48
Example 6-19
Show the results of the following.
MOV
XRL
A,#54H
A,#78H
Solution:
54H
78H
2CH
0 1 0 1 0 1 0 0
0 1 1 1 1 0 0 0
0 0 1 0 1 1 0 0
54H XOR 78H = 2CH
49
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
45H
00
01000101
01000101
00000000 XOR a number with itself = 0
50
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
MOV P2,#00
MOV R3,#45H
MOV A,P1
XRL A,R3
JNZ EXIT
MOV P2,#99H
EXIT: ...
;make P1 an input port
;clear P2
;R3 = 45H
;read p1
;jump if A ≠ 0
51
CPL (Complement Accumulator)
CPL A
MOV
CPL
A,#55H
A
;0101 0101
;1010 1010
– No effect on any of the flags.
– This is also called 1’s complement.
52
Example 6-16
Examine the following, noting the role of OV.
MOV A,#+7
MOV R1,#+18
ADD A,R1
;A=0000 0111 (A=07H)
;R1=0001 0010(R1=12H)
;A=0001 1001 (A=19H=+25,correct)
Solution:
7
0000 0111
+ 18
0001 0010
25
0001 1001
No carry occurs.
CY=0,AC=0 and 0V = 0
According to the CPU, the result is +25, which is correct (OV = 0).
53
Instructions to Create 2’s Complement
• There is no special instruction to make the 2’s
complement of a number.
• However, we can do it
CPL
ADD
A
A,#1
;1’s complement
;add 1 to make 2’s
complement
54
Section 6.3
Logic and Compare Instructions
55
Example 6-18
Show the results of the following.
MOV A,#04
ORL A,#30H
;A = 04
;A = 34H
Solution:
04H
30H
34H
0000 0100
0011 0000
0011 0100
04 OR 30 = 34H
56
Example 6-22
Find the 2’s complement of the value 85H.
Solution:
MOV A,#85H
85H = 1000 0101
CPL A
;1’s comp. 1’s = 0111 1010
ADD A,#1
;2’s comp.
+ 1
0111 1011 = 7BH
57
CJNE (1/2)
• Compare and Jump if Not Equal
CJNE 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, except
that the operands themselves remain unchanged.
– Flags are changed according to the execution of the
SUBB instruction.
58
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 R5<80
LAR: ...
;do here if R5>80
Table 7-1
Compare
Carry Flag
destination > source
CY = 0
destination < source
CY = 1
59
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,#55H
CJNE 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.
60
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
CJNE A,#99H,NEXT
MOV R1,#0FFH
NEXT:...
OVER:...
;clear R1
;if A≠99, then jump
;if A=99, R1=FFH
;if A≠99, R1=0
61
Example 6-25
Assume 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 the
registers indicated by the following.
If T = 75
If T < 75
If T > 75
Solution:
MOV
MOV
CJNE
SJMP
OVER: JNC
MOV
SJMP
NEXT: MOV
EXIT: ...
then A = 75
then R1 = T
then R2 = T
P1,#0FFH
A,P1
A,#75,OVER
EXIT
NEXT
R1,A
EXIT
R2,A
;make P1 an input port
;read P1 port
;jump if A≠75
;A=75
;
;A<75, save A R1
;
;A>75, save A in R2
62
Example 6-26
Write a program to monitor P1 continuously for the value 63H. It
should get out of the monitoring only if P1 = 63H.
Solution:
MOV P1,#0FFH
;make P1 an input port
HERE:MOV A,P1
;get P1
CJNE A,#63,HERE ;keep monitoring unless
;
P1=63H
63
Example 6-27
Assume internal RAM memory locations 40H – 44H contain the
daily temperature for five days, as shown below. Search to see if any
of the values equals 65. If value 65 does exist in the table, give its
location 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 address
SJMP EXIT
;and exit
NEXT:INC R0
;increment pointer
DJNZ R2,BACK
;keep check until count=0
64
EXIT: ...
Section 6.4
Rotate Instructions and Data
Serialization
65
RR (Rotate A Right)
RR
A
MOV
RR
RR
RR
RR
A,#36H
A
A
A
A
;A=0011
;A=0001
;A=1000
;A=1100
;A=0110
MSB
0110
1011
1101
0110
0011
LSB
66
RL (Rotate A Left)
RL
A
MOV
RL
RL
RL
RL
A,#36H
A
A
A
A
;A=0011
;A=0110
;A=1101
;A=1011
;A=0110
MSB
0110
1100
1000
0001
0011
LSB
67
RRC (Rotate A Right Through Carry)
RRC
MOV
RRC
RRC
RRC
RRC
A
A,#36H
A
A
A
A
;A=0011
;A=0001
;A=0000
;A=1000
;A=1100
MSB
0110,
1011,
1101,
0110,
0011,
LSB
CY=0
CY=0
CY=1
CY=1
CY=0
CY
68
RLC (Rotate A Left Through Carry)
RLC
MOV
RLC
RLC
RLC
RLC
A
A,#36H
A
A
A
A
CY
;A=0011
;A=0110
;A=1101
;A=1011
;A=1001
MSB
0110,
1101,
1010,
0100,
1001,
CY=1
CY=0
CY=0
CY=1
CY=1
LSB
69
Serializing Data
• One application of rotate operations is serializing
data.
• Serializing data is a way of sending a byte of data
one bit at a time through a single pin of
microcontroller.
– Way 1: using the serial port
• The programmers have very limited control over the sequence
of 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
70
Figure 10-1. Serial versus Parallel Data
Transfer
Serial Transfer
Sender
Receiver
Parallel Transfer
Sender
D0
Receiver
D7
71
Serializing a Byte of Data
• Transfer a byte of data serially
RRC
MOV
A
P1.3,C
;Move the bit to CY
;output CY as data bit
• Ex 6-28, 6-29
72
Example 6-28
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 start
SETB P2.1
;second high at start
MOV R5,#8
;counter
HERE: RRC A
;
MOV P2.1,C
;send CY to P2.1
DJNZ R5,HERE
;
SETB P2.1
;first high at end
SETB P2.1
;second high at end
A
D7
1
D0
CY
1
P2.1
110100000111
1
‘A’
73
Example 6-29
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 the
LSB first.
Solution:
MOV R5,#8
;counter
HERE: MOV C,P2.7
;bring a bit
RRC A
;
DJNZ R5,HERE
;
MOV R2, A
;save it
01000001
1
‘A’
P2.1
1
CY
A
1
D7
D0
74
Single-bit Operations
• Instructions that are used for single-bit operations
are 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.
75
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)

76
Table 6-4: Carry Bit-Related Instructions
Instruction
SETB C
CLR C
CPL C
MOV b,C
MOV C,b
JNC target
JC target
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
Function
make CY = 1
clear carry bit (CY = 0)
complement carry bit
copy carry status to bit location (b=CY)
copy bit location status to carry (CY=b)
jump to target if CY = 0
jump to target if CY = 1
AND CY with bit and save it on CY
AND CY with inverted bit and save it on CY
OR CY with bit and save it on CY
OR CY with inverted bit and save it on CY
77
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
MOV
MOV
MOV
C,P1.2
06,C
C,P1.3
07,C
;save
;save
;save
;save
status
in RAM
status
in RAM
of P1.2 on CY
bit location 06
of P1.3 on CY
bit location 07
78
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 the
outside light and turn off the inside one.
Solution:
STEB
ORL
MOV
CLR
ANL
MOV
C
C,P2.2
P2.2,C
C
C,P2.5
P2.5,C
;CY=1
;CY = P2.2 ORed with CY
;turn it “on”
;CY=0
;CY=P2.5 ANDed with CY
;turn it off
79
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 once
JNC NEXT
;check for CY
INC R1
;if CY=1 then R1++
NEXT: DJNZ R7,AGAIN
80
SWAP A
SWAP
A
MOV A,#72H
SWAP A
;A=72H
;A=27H
before: D7 – D4 D3 – D0
after:
D3 – D0
D7 – D4
before:
0111
0010
after:
0010
0111
81
Example 6-33
(a) Find the contents of register A in the following code.
(b) In the absence of a SWAP instruction, how would you
exchange the nibbles? Write a simple program to show the process.
Solution:
(a)
MOV A,#72H
SWAP A
;A = 72H
;A = 27H
MOV
RL
RL
RL
RL
;A=0111
;A=1110
;A=1100
;A=1001
;A=0010
(b)
A,#72H
A
A
A
A
0010
0100
1001
0011
0111
82
Example Of Serial Communication
Write a program to transfer data to serial memories such as serial
EEPROMs.
Solution:
...
RLC A
MOV P1.3,C
RLC A
MOV P1.3,C
RLC A
MOV P1.3,C
...
;first bit to carry
;output carry as data bit
;second bit to carry
;output carry as data bit
;first bit to carry
;third carry as data bit
83
Section 6.5
BCD, ASCII, and Other Application
Programs
84
Conversion of BCD and ASCII
• There is a real time clock (RTC) in many new
microcontrollers.
– Ex: DS5000T has RTC
• RTC keep the time (hour, minute, second) and date
(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), it
must be in ASCII format.
• We show above instructions in the conversion of
BCD and ASCII
85
Table 6-5. ASCII Code for Digits 0 – 9
Key
0
1
2
3
4
5
6
7
8
9
ASCII (hex)
30
31
32
33
34
35
36
37
38
39
Binary
011 0000
011 0001
011 0010
011 0011
011 0100
011 0101
011 0110
011 0111
011 1000
011 1001
BCD (unpacked)
0000 0000
0000 0001
0000 0010
0000 0011
0000 0100
0000 0101
0000 0110
0000 0111
0000 1000
0000 1001
86
Packed BCD to ASCII Conversion
• To convert packed BCD to ASCII
Step 1. It must be converted to unpacked BCD first.
MOV A,#29H ;It means 2910
ANL A,#0FH ;get the lower nibble
Step 2. The unpacked BCD is tagged with 30H
ORL A,#30H ;make it an ASCII,A=39H ‘9’
87
ASCII to packed BCD Conversion
• To convert ASCII to packed BCD
Step 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=20H
ORL A,R1
;packed BCD,A=29H
88
Example 6-34 (modified)
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
ANL A,#0FH
ORL A,#30H
MOV R6,A
MOV A,#29H
ANL A,#0F0H
SWAP A
ORL A,#30H
MOV R2,A
;packed BCD
;Lower nibble: A=09H
;make it an ASCII, A=39H (‘9’)
;R6=39H ASCII char
;
;upper nibble: A=20H
;A=02H, equals to ”RR A” 4 times
;A=32H,ASCII char.’2’
;R2=32H ASCII char
89
Using a Look-up Table for ASCII
• It’s much easier to use a look-up table to get
ASCII character than mathematical computation.
• See Example 6-35.
90
Example 6-35 (1/2)
Assume that the lower three bits of P1 are connected to three
switches. Write a program to send the following ASCII characters
to P2 based on the status of the switches.
000 ‘0’
001 ‘1’
010 ‘2’
011 ‘3’
100 ‘4’
switches
P1.0
P1.1
P1.2
P2
8
101 ‘5’
110 ‘6’
111 ‘7’
91
Example 6-35 (2/2)
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,A
SJMP $
;-------------------------------------------ORG 400H
MYTABLE DB ‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’
END
92
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 tagged
to 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 2’s complement of the sum. This is checksum
byte, attached as the last byte of the series.
2’s complement of 18H = E8H
The series becomes 25H-62H-3FH-52H-E8H
93
Checksum Operation
• To perform the checksum operations:
1. add all the bytes, including the checksum byte
2. The result must be zero. If the result is not zero, there is
some error occurred.
• See Example 6-36
94
Example 6-36 (1/2)
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 2’s complement of 18H is E8H.
The checksum byte = E8H
95
Example 6-36 (2/2)
(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 how
checksum 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
96
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, we
need to convert it to ASCII.
97
Binary-to-ASCII Conversion Program (1/3)
;Converting
;---------RAM_ADDR
DASCI_RSULT
COUNT
;----------
binary (hexadecimal) to ASCII
Initialization ----------EQU
40H
EQU
50H
EQU
3
main program ----------ORG
0
ACALL BIN_DEC_CONVRT
ACALL DEC_ASCI_CONVRT
SJMP
$
98
Binary-to-ASCII Conversion Program (2/3)
BIN_DEC_CONVRT:
MOV
MOV
MOV
DIV
MOV
INC
MOV
DIV
MOV
INC
MOV
RET
; converting binary to decimal
R0,#RAM_ADDR
A,P1
B,#10
AB
@R0,B
;save lower digit
R0
B,#10
AB
@R0,B
;save next digit
R0
@R0,A
;save last digit
99
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,#3
BACK:
ADD
A,@R0
;calculate the sum
ORL
A,#30H
MOV
@R1,A
INC
R0
INC
R1
DJNZ
R2,BACK
RET
END
100
Checksum Program in Modules
• The checksum generation and testing program is
given in modular form.
• Dividing a program into several modules allows
us to use tis modules in other applications.
• See “Checksum Program”
101
Checksum Program (1/5)
;Calculation and testing checksum byte
;---------- Initialization ----------DATA_ADDR
EQU
400H
COUNT
EQU
4
RAM_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
$
102
Checksum Program (2/5)
;-- copy R2 bytes from ROM to RAM -COPY_DATA:
MOV
DPTR,#DATA_ADDR
MOV
R0,#RAM_ADDR
MOV
R2,#COUNT
H1:
CLR
A
MOVC
A,@A_DPTR
MOV
@R0,A
INC
DPTR
INC
R0
DJNZ
R2,H1
RET
103
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
A
H2:
ADD
A,@R1
;calculate the sum
INC
R1
DJNZ
R2,H2
CPL
A
;2’s complement
INC
A
MOV
@R1,A
;save checksum
RET
104
Checksum Program (2/5)
;-- testing checksum
TEST_CHKSUM:
MOV
MOV
CLR
H3:
ADD
INC
DJNZ
JZ
MOV
SJMP
G_1:
MOV
OVER:
RET
byte -R1,#RAM_ADDR
R2,#COUNT+1
A
A,@R1
;calculate the sum
R1
R2,H3
G_1
;if A=0 jump to G_1
P1,#’B’ ;bad data
OVER
P1,#’G’ ;correct
105
Checksum Program (2/5)
;-- my data in code ROM -ORG
400H
MYDATA:
DB
25H,62H,3FH,52H
CLR
A
END
106
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
107
You are able to(1/2)
• Define the range of numbers possible in 8051
unsigned data
• Code addition and subtraction instructions for
unsigned 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
108
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 109
byte