Home Automation, Networking, and Entertainment Lab
Chung-Ping Young
楊中平
ARI THMETI C & LOGI C
I NSTRUCTI ONS AND
PROGRAMS
The 8051 Microcontroller and Embedded
Systems: Using Assembly and C
ARI THMETI C
I NSTRUCTI ONS
Addition of
Unsigned
Numbers
ADD
A,source
;A = A + source
The instruction ADD is used to add two
operands
¾
Destination operand is always in register A
¾Source operand can be a register,
immediate data, or in memory
¾
Memory-to-memory arithmetic operations
are never allowed in 8051 Assembly
language
Show how the flag register is affected by the following instruction.
MOV A,#0F5H ;A=F5 hex ADD A,#0BH ;A=F5+0B=00
Solution:
F5H 1111 0101 + 0BH + 0000 1011 100H 0000 0000
CY =1, since there is a carry out from D7
PF =1, because the number of 1s is zero (an even
ARI THMETI C
I NSTRUCTI ONS
Addition of
I ndividual
Bytes
Assume that RAM locations 40 – 44H 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. 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 the byte ptr to by R0 JNC NEXT ;if CY=0 don’t add carry INC R7 ;keep track of carry
NEXT: INC R0 ;increment pointer
ARI THMETI C
I NSTRUCTI ONS
ADDC and
Addition of
16-Bit Numbers
When adding two 16-bit data operands,
the propagation of a carry from lower
byte to higher byte is concerned
Write a program to add two 16-bit numbers. Place the sum in R7 and R6; R6 should have the 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
MOV R6, A ;save the low byte sum in R6 MOV A, #3CH ;load the high byte
ADDC A, #3BH ;add with the carry
MOV R7, A ;save the high byte sum
When the first byte is added (E7+8D=74, CY=1).
The carry is propagated to the higher byte, which result in 3C + 3B + 1 =78 (all in hex)
ARI THMETI C
I NSTRUCTI ONS
BCD Number
System
The binary representation of the digits
0 to 9 is called BCD (Binary Coded
Decimal)
Digit BCD0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
¾
Unpacked BCD
I n unpacked BCD, the lower 4 bits of the number represent the BCD number, and the rest of the bits are 0
Ex. 00001001 and 00000101 are unpacked BCD for 9 and 5¾
Packed BCD
I n packed BCD, a single byte has two BCD number in it, one in the lower 4 bits, and one in theupper 4 bits
ARI THMETI C
I NSTRUCTI ONS
Unpacked and
Packed BCD
Adding two BCD numbers must give a
BCD result
MOV A, #17H ADD A, #28H
The result above should have been 17 + 28 = 45 (0100 0101). To correct this problem, the programmer must add 6 (0110) to the low digit: 3F + 06 = 45H.
Adding these two numbers gives
ARI THMETI C
I NSTRUCTI ONS
DA I nstruction
DA A ;decimal adjust for addition
The DA instruction is provided to
correct the aforementioned problem
associated with BCD addition
¾
The DA instruction will add 6 to the lower
nibble or higher nibble if need
Example:
MOV A,#47H ;A=47H first BCD operand MOV B,#25H ;B=25H second BCD operand ADD A,B ;hex(binary) addition(A=6CH) DA A ;adjust for BCD addition
(A=72H)
The “DA” instruction works only on A. In other word, while the source can be an operand of any addressing mode, the destination must be in register A in order for DA to work.
DA works only after an ADD, but not after INC
6CH
ARI THMETI C
I NSTRUCTI ONS
DA I nstruction
(cont’)
Summary of DA instruction
¾
After an ADD or ADDC instruction
1. I f the lower nibble (4 bits) is greater than 9, or if AC= 1, add 0110 to the lower 4 bits
2. I f the upper nibble is greater than 9, or if CY= 1, add 0110 to the upper 4 bits
Example:
HEX BCD
29 0010 1001
+ 18 + 0001 1000
41 0100 0001 AC=1
+ 6 + 0110
47 0100 0111
Since AC=1 after the
addition, ”DA A” will add 6 to the lower nibble.
ARI THMETI C
I NSTRUCTI ONS
DA I nstruction
(cont’)
Assume that 5 BCD data items are stored in RAM locations starting at 40H, as shown below. Write a program to find the sum of all the numbers. The result must be in BCD.
40=(71) 41=(11) 42=(65) 43=(59) 44=(37)
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 the byte pointer ;to by R0
DA A ;adjust for BCD JNC NEXT ;if CY=0 don’t
;accumulate carry
INC R7 ;keep track of carries NEXT: INC R0 ;increment pointer
ARI THMETI C
I NSTRUCTI ONS
Subtraction of
Unsigned
Numbers
I n many microprocessor there are two
different instructions for subtraction:
SUB and SUBB (subtract with borrow)
¾
I n the 8051 we have only SUBB
¾
The 8051 uses adder circuitry to perform
the subtraction
SUBB A,source ;A = A – source – CY
To make SUB out of SUBB, we have to
make CY= 0 prior to the execution of
the instruction
ARI THMETI C
I NSTRUCTI ONS
Subtraction of
Unsigned
Numbers
(cont’)
SUBB when CY = 0
1.
Take the 2’s complement of the
subtrahend (source operand)
2.
Add it to the minuend (A)
3.I nvert the carry
CLR C
MOV A,#4C ;load A with value 4CH SUBB A,#6EH ;subtract 6E from A JNC NEXT ;if CY=0 jump to NEXT CPL A ;if CY=1, take 1’s complement INC A ;and increment to get 2’s comp NEXT: MOV R1,A ;save A in R1
Solution:
4C 0100 1100 0100 1100 - 6E 0110 1110 1001 0010
-22 01101 1110
CY =1
d +
c 2’s
complement
e Invert carry CY=0, the result is positive;
ARI THMETI C
I NSTRUCTI ONS
Subtraction of
Unsigned
Numbers
(cont’)
SUBB when CY = 1
¾
This instruction is used for multi-byte
numbers and will take care of the borrow
of the lower operand
CLR C
MOV A,#62H ;A=62H
SUBB A,#96H ;62H-96H=CCH with CY=1 MOV R7,A ;save the result
MOV A,#27H ;A=27H
SUBB A,#12H ;27H-12H-1=14H MOV R6,A ;save the result
Solution:
We have 2762H - 1296H = 14CCH.
A = 62H – 96H – 0 = CCH CY = 1
ARI THMETI C
I NSTRUCTI ONS
Unsigned
Multiplication
The 8051 supports byte by byte
multiplication only
¾
The byte are assumed to be unsigned data
MUL AB ;AxB, 16-bit result in B, A
MOV A,#25H ;load 25H to reg. A MOV B,#65H ;load 65H to reg. B MUL AB ;25H * 65H = E99 where
;B = OEH and A = 99H
Multiplication Operand1 Operand2 Result
Byte x byte A B B = high byte A = low byte
ARI THMETI C
I NSTRUCTI ONS
Unsigned
Division
The 8051 supports byte over byte
division only
¾
The byte are assumed to be unsigned data
DIV AB
;divide A by B, A/B
MOV A,#95 ;load 95 to reg. A MOV B,#10 ;load 10 to reg. B MUL AB ;A = 09(quotient) and
;B = 05(remainder)
Division Numerator Denominator Quotient Remainder
Byte / byte A B A B
Unsigned Division Summary (DIV AB)
CY is always 0 If B ≠ 0, OV = 0
ARI THMETI C
I NSTRUCTI ONS
Application for
DI V
(a) Write a program to get hex data in the range of 00 – FFH from port 1 and convert it to decimal. Save it in R7, R6 and R5.
(b) Assuming that P1 has a value of FDH for data, analyze program.
Solution: (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
DIV AB ;divide by 10
MOV R7,B ;save lower digit MOV B,#10
DIV AB ;divide by 10 once more MOV R6,B ;save the next digit MOV R5,A ;save the last digit
(b) To convert a binary (hex) value to decimal, we divide it by 10 repeatedly until the quotient is less than 10. After each division the remainder is saves.
Q R
FD/0A = 19 3 (low digit) 19/0A = 2 5 (middle digit)
2 (high digit)
SI GNED
ARI THMETI C
I NSTRUCTI ONS
Signed 8-bit
Operands
D7 (MSB) is the sign and D0 to D6 are
the magnitude of the number
¾
I f D7= 0, the operand is positive, and if
D7= 1, it is negative
Positive numbers are 0 to + 127
Negative number representation (2’s
complement)
1.
Write the magnitude of the number in 8-bit
binary (no sign)
2.
I nvert each bit
3.
Add 1 to it
Sign Magnitude
SI GNED
ARI THMETI C
I NSTRUCTI ONS
Signed 8-bit
Operands
(cont’)
Show how the 8051 would represent -34H
Solution:
1. 0011 0100 34H given in binary
2. 1100 1011 invert each bit
3. 1100 1100 add 1 (which is CC in hex)
Signed number representation of -34 in 2’s complement is CCH
Decimal Binary Hex
SI GNED
ARI THMETI C
I NSTRUCTI ONS
Overflow
Problem
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 0110 and OV =1
According to the CPU, the result is -90, which is wrong. The CPU sets OV=1 to indicate the overflow
I f the result of an operation on signed
numbers is too large for the register
¾
An overflow has occurred and the
SI GNED
ARI THMETI C
I NSTRUCTI ONS
OV Flag
I n 8-bit signed number operations,
OV is set to 1 if either occurs:
1.
There is a carry from D6 to D7, but no
carry out of D7 (CY= 0)
2.
There is a carry from D7 out (CY= 1), but
no carry from D6 to D7
MOV A,#-128 ;A=1000 0000(A=80H)
MOV R4,#-2 ;R4=1111 1110(R4=FEH)
ADD A,R4 ;A=0111 1110(A=7EH=+126,INVALID)
-128 1000 0000
+ -2 1111 1110
-130 0111 1110 and OV=1
OV = 1
SI GNED
ARI THMETI C
I NSTRUCTI ONS
OV Flag
(cont’)
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, OV=0)
-2 1111 1110
+ -5 1111 1011
-7 1111 1001 and OV=0
OV = 0
The result -7 is correct
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,OV=0)
7 0000 0111
+ 18 0001 0010
25 0001 1001 and OV=0
OV = 0
SI GNED
ARI THMETI C
I NSTRUCTI ONS
OV Flag
(cont’)
I n unsigned number addition, we must
monitor the status of CY (carry)
¾
Use JNC or JC instructions
I n signed number addition, the OV
(overflow) flag must be monitored by
the programmer
SI GNED
ARI THMETI C
I NSTRUCTI ONS
2's
Complement
To make the 2
’
s complement of a
number
LOGI C AND
COMPARE
I NSTRUCTI ONS
AND
ANL destination,source
;dest = dest AND source
This instruction will perform a logic
AND on the two operands and place
the result in the destination
¾
The destination is normally the
accumulator
¾
The source operand can be a register, in
memory, or immediate
X Y X AND Y
0 0 0
0 1 0
1 0 0
1 1 1
Show the results of the following.
MOV A,#35H ;A = 35H
ANL A,#0FH ;A = A AND 0FH
35H 0 0 1 1 0 1 0 1 0FH 0 0 0 0 1 1 1 1 05H 0 0 0 0 0 1 0 1
LOGI C AND
COMPARE
I NSTRUCTI ONS
OR
ORL destination,source
;dest = dest OR source
The destination and source operands
are ORed and the result is placed in
the destination
¾
The destination is normally the
accumulator
¾
The source operand can be a register, in
memory, or immediate
X Y X OR Y
0 0 0
0 1 1
1 0 1
1 1 1
Show the results of the following.
MOV A,#04H ;A = 04 ORL A,#68H ;A = 6C
04H 0 0 0 0 0 1 0 0 68H 0 1 1 0 1 0 0 0 6CH 0 1 1 0 1 1 0 0
LOGI C AND
COMPARE
I NSTRUCTI ONS
XOR
XRL destination,source
;dest = dest XOR source
This instruction will perform XOR
operation on the two operands and
place the result in the destination
¾
The destination is normally the
accumulator
¾
The source operand can be a register, in
memory, or immediate
Show the results of the following.
MOV A,#54H XRL A,#78H
54H 0 1 0 1 0 1 0 0 78H 0 1 1 1 1 0 0 0 2CH 0 0 1 0 1 1 0 0
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
LOGI C AND
COMPARE
I NSTRUCTI ONS
XOR
(cont’)
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 AH = 45H.
45H 0 1 0 0 0 1 0 1 45H 0 1 0 0 0 1 0 1 00H 0 0 0 0 0 0 0 0
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 P2,#00 ;clear P2
MOV P1,#0FFH ;make P1 an input port MOV R3,#45H ;R3=45H
MOV A,P1 ;read P1 XRL A,R3
JNZ EXIT ;jump if A is not 0 MOV P2,#99H
EXIT: ...
XRL can be used to see if two registers have the same value
LOGI C AND
COMPARE
I NSTRUCTI ONS
Complement
Accumulator
CPL A ;complements the register A
This is called 1’s complement
To get the 2’s complement, all we
have to do is to to add 1 to the 1’s
complement
MOV A, #55H
CPL A ;now A=AAH
;0101 0101(55H)
LOGI C AND
COMPARE
I NSTRUCTI ONS
Compare
I nstruction
CJNE destination,source,rel. addr.
The actions of comparing and jumping
are combined into a single instruction
called
CJNE
(compare and jump if not
equal)
¾
The
CJNE
instruction compares two
operands, and jumps if they are not equal
¾The destination operand can be in the
accumulator or in one of the Rn registers
¾The source operand can be in a register, in
memory, or immediate
The operands themselves remain unchangedLOGI C AND
COMPARE
I NSTRUCTI ONS
Compare
I nstruction
(cont’)
Notice in the
CJNE
instruction that any
Rn register can be compared with an
immediate value
¾
There is no need for register A to be
involved
CJNE R5,#80,NOT_EQUAL ;check R5 for 80
... ;R5 = 80
NOT_EQUAL:
JNC NEXT ;jump if R5 > 80 ... ;R5 < 80
NEXT: ...
Compare Carry Flag
destination ≥ source CY = 0
destination < source CY = 1
LOGI C AND
COMPARE
I NSTRUCTI ONS
Compare
I nstruction
(cont’)
The compare instruction is really a
subtraction, except that the operands
remain unchanged
¾
Flags are changed according to the
execution of the
SUBB
instruction
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 then A = 75 If T < 75 then R1 = T If 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 A is not 75 SJMP EXIT ;A=75, exit
OVER: JNC NEXT ;if CY=0 then A>75
MOV R1,A ;CY=1, A<75, save in R1 SJMP EXIT ; and exit
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Rotating Right
and Left
RR A
;rotate right A
I n rotate right
¾
The 8 bits of the accumulator are rotated
right one bit, and
¾
Bit D0 exits from the LSB and enters into
MSB, D7
MSB LSB
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Rotating Right
and Left
(cont’)
RL A
;rotate left A
I n rotate left
¾
The 8 bits of the accumulator are rotated
left one bit, and
¾
Bit D7 exits from the MSB and enters into
LSB, D0
MSB LSB
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Rotating
through Carry
RRC A ;rotate right through carry
I n RRC A
¾
Bits are rotated from left to right
¾
They exit the LSB to the carry flag, and
the carry flag enters the MSB
MSB
LSB
CLR C ;make CY = 0 MOV A,#26H ;A = 0010 0110
RRC A ;A = 0001 0011 CY = 0 RRC A ;A = 0000 1001 CY = 1 RRC A ;A = 1000 0100 CY = 1
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Rotating
through Carry
(cont’)
RLC A ;rotate left through carry
I n RLC A
¾
Bits are shifted from right to left
¾
They exit the MSB and enter the carry flag,
and the carry flag enters the LSB
MSB LSB
CY
Write a program that finds the number of 1s in a given byte.
MOV R1,#0
MOV R7,#8 ;count=08 MOV A,#97H
AGAIN: RLC A
JNC NEXT ;check for CY
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Serializing Data
Serializing data is a way of sending a
byte of data one bit at a time through
a single pin of microcontroller
¾
Using the serial port, discussed in Chapter
10
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Serializing Data
(cont’)
Transfer a byte of data serially by
¾
Moving CY to any pin of ports P0
–
P3
¾
Using rotate instruction
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 ;high SETB P2.1 ;high MOV R5,#8
AGAIN: RRC A
MOV P2.1,C ;send CY to P2.1 DJNZ R5,HERE
SETB P2.1 ;high SETB P2.1 ;high
P2.1
CY
Register A
D7 D0
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Serializing Data
(cont’)
Write a program to bring in a byte of data serially one bit 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
AGAIN: MOV C,P2.7 ;bring in bit
RRC A
DJNZ R5,HERE
MOV R2,A ;save it
P2.7
CY
Register A
D7 D0
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Single-bit
Operations with
CY
There are several instructions by which
the CY flag can be manipulated directly
Instruction Function
SETB C Make CY = 1
CLR C Clear carry bit (CY = 0) CPL C Complement carry bit
MOV b,C Copy carry status to bit location (CY = b) MOV C,b Copy bit location status to carry (b = CY) JNC target Jump to target if CY = 0
JC target Jump to target if CY = 1
ANL C,bit AND CY with bit and save it on CY
ANL C,/bit AND CY with inverted bit and save it on CY ORL C,bit OR CY with bit and save it on CY
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
Single-bit
Operations with
CY
(cont’)
Assume that bit P2.2 is used to control an outdoor light and bit P2.5 a light inside a building. Show how to turn on the outside light and turn off the inside one.
Solution:
SETB C ;CY = 1
ORL C,P2.2 ;CY = P2.2 ORed w/ CY MOV P2.2,C ;turn it on if not on
CLR C ;CY = 0
ANL C,P2.5 ;CY = P2.5 ANDed w/ CY MOV P2.5,C ;turn it off if not off
Write a program that finds the number of 1s in a given byte.
Solution:
MOV R1,#0 ;R1 keeps number of 1s MOV R7,#8 ;counter, rotate 8 times MOV A,#97H ;find number of 1s in 97H AGAIN: RLC A ;rotate it thru CY
JNC NEXT ;check CY
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
SWAP
SWAP A
I t swaps the lower nibble and the
higher nibble
¾
I n other words, the lower 4 bits are put
into the higher 4 bits and the higher 4 bits
are put into the lower 4 bits
SWAP works only on the accumulator
(A)
D7-D4
before :
after :
D3-D0
D3-D0
ROTATE
I NSTRUCTI ON
AND DATA
SERI ALI ZATI ON
SWAP
(cont’)
(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 ;A = 72H SWAP A ;A = 27H (b)
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Key ASCI I ( hex) Binary BCD ( unpacked)
0 30 011 0000 0000 0000
1 31 011 0001 0000 0001
2 32 011 0010 0000 0010
3 33 011 0011 0000 0011
4 34 011 0100 0000 0100
5 35 011 0101 0000 0101
6 36 011 0110 0000 0110
7 37 011 0111 0000 0111
8 38 011 1000 0000 1000
9 39 011 1001 0000 1001
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Packed BCD to
ACSI I
Conversion
The DS5000T microcontrollers have a
real-time clock (RTC)
¾
The RTC provides the time of day (hour,
minute, second) and the date (year,
month, day) continuously, regardless of
whether the power is on or off
However this data is provided in
packed BCD
¾
To be displayed on an LCD or printed by
the printer, it must be in ACSI I format
Packed BCD Unpacked BCD ASCII
29H 02H & 09H 32H & 39H 0010 1001 0000 0010 & 0011 0010 &
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
ASCI I to
Packed BCD
Conversion
To convert ASCI I to packed BCD
¾
I t is first converted to unpacked BCD (to
get rid of the 3)
¾
Combined to make packed BCD
key ASCII Unpacked BCD Packed BCD
4 34 0000 0100
7 37 0000 0111 0100 0111 or 47H
MOV A, #’4’ ;A=34H, hex for ‘4’ MOV R1,#’7’ ;R1=37H,hex for ‘7’
ANL A, #0FH ;mask upper nibble (A=04) ANL R1,#0FH ;mask upper nibble (R1=07) SWAP A ;A=40H
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
ASCI I to
Packed BCD
Conversion
(cont’)
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.
MOV A,#29H ;A=29H, packed BCD
MOV R2,A ;keep a copy of BCD data
ANL A,#0FH ;mask the upper nibble (A=09) ORL A,#30H ;make it an ASCII, A=39H(‘9’) MOV R6,A ;save it
MOV A,R2 ;A=29H, get the original data
ANL A,#0F0H ;mask the lower nibble
RR A ;rotate right
RR A ;rotate right
RR A ;rotate right
RR A ;rotate right
ORL A,#30H ;A=32H, ASCII char. ’2’ MOV R2,A ;save ASCII char in R2
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Using a
Look-up Table for
ASCI I
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’
101 ‘5’
110 ‘6’
111 ‘7’
Solution:
MOV DPTR,#MYTABLE
MOV A,P1 ;get SW status
ANL A,#07H ;mask all but lower 3 MOVC A,@A+DPTR ;get data from table MOV P2,A ;display value
SJMP $ ;stay here
;---ORG 400H
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Checksum Byte
in ROM
To ensure the integrity of the ROM
contents, every system must perform
the checksum calculation
¾
The process of checksum will detect any
corruption of the contents of ROM
¾
The checksum process uses what is called
a
checksum byte
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Checksum Byte
in ROM
(cont’)
To calculate the checksum byte of a
series of bytes of data
¾
Add the bytes together and drop the
carries
¾
Take the 2’s complement of the total sum,
and it becomes the last byte of the series
To perform the checksum operation,
add all the bytes, including the
checksum byte
¾
The result must be zero
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Checksum Byte
in ROM
(cont’)
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 The checksum is calculated by first adding the + 62H bytes. The sum is 118H, and dropping the carry, + 3FH we get 18H. The checksum byte is the 2’s
+ 52H complement of 18H, which is E8H 118H
(b) Perform the checksum operation to ensure data integrity. 25H
+ 62H Adding the series of bytes including the checksum + 3FH byte must result in zero. This indicates that all the + 52H bytes are unchanged and no byte is corrupted. + E8H
200H (dropping the carries)
(c) If the second byte 62H has been changed to 22H, show how checksum detects the error.
25H
+ 22H Adding the series of bytes including the checksum + 3FH byte shows that the result is not zero, which indicates + 52H that one or more bytes have been corrupted.
+ E8H
BCD AND ASCI I
APPLI CATI ON
PROGRAMS
Binary (Hex)
to ASCI I
Conversion
Many ADC (analog-to-digital converter)
chips provide output data in binary
(hex)
¾
To display the data on an LCD or PC
screen, we need to convert it to ASCI I
Convert 8-bit binary (hex) data to decimal digits, 000–
255