Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.
)
Course Instructor MSI (CPE342) Page 1 of 9
Implementation of 8088-based I/O system using 8255 PPI
Problem Statement:
An ADC0804 and a 44780 LCD are connected with 8088 CPU through
8255 PPI. PPI is interfaced with CPU at A0H and above. Develop an
8088 CPU assembly language program that reads a single conversion
from ADC and displays it in decimal on LCD in 3-digit format.
Solution:
System design assumptions:
LCD is connected with Group A of PPI. Consult following table for pin
connections.
44780 LCD Pins 8255 Pins
RS PortC.4
̅̅̅̅̅
RW PortC.5
̅̅̅̅
EN PortC.6
D7…D0 PortA.7…PortA.0
ADC is connected with Group B of PPI. Consult following table for pin
connections.
ADC0804 Pins 8255 Pins
̅̅̅
CS PortC.0
̅̅̅̅
RD PortC.1
̅̅̅̅̅
WR PortC.2
̅̅̅̅̅̅̅
INTR PortC.3
D7…D0 PortB.7…PortB.0
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 2 of 9
Program:
START:
;CONFIGURING PPI FOR BASIC I/O MODE
MOV AL, 80H
OUT 0A3H, AL
CALL LCD_CONFIG
;MAIN PROGRAM LOOP
MAIN:
CALL ADC0804
CALL SPLIT
CALL DISPLAY
JMP MAIN
HLT ;HALT IN CASE OF MALFUNCTION
;CONFIGURING LCD. COMMAND BYTE IN BH
LCD_CONFIG:
MOV BH, 38H
CALL LCD_COMM
MOV BH, 01H
CALL LCD_COMM
MOV BH, 0CH
CALL LCD_COMM
MOV BH, 06H
CALL LCD_COMM
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 3 of 9
MOV BH, 80H
CALL LCD_COMM
RET
;SENDING COMMAND TO LCD. BH HOLDS THE COMMAND BYTES
LCD_COMM:
MOV AL, BH
OUT 0A0H, AL
;SETTING EN = 1, RS = 0, RW = 0
MOV AL, 98H ;PORTC LINES ARE INPUT
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0FH ;CLEAR UPPER HALF OF PORTC
OR AL, 0C0H ;BYTE 1100XXXX TO PORTC, EN = 1
MOV BL, AL
MOV AL, 90H ;PORTC LINES ARE OUTPUT
OUT 0A3H, AL
MOV AL, BL
OUT 0A2H, AL ;OUTPUT BYTE TO PORTC
SETTING EN = 0, RS = 0, RW = 0
MOV AL, 98H ;PORTC LINES ARE INPUT
OUT 0A3H, AL
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 4 of 9
IN AL, 0A2H ;READ PORTC
AND AL, 0FH ;CLEAR UPPER HALF OF PORTC
OR AL, 80H ;BYTE 1000XXXX TO PORTC, EN = 0
MOV BL, AL
MOV AL, 90H ;PORTC LINES ARE OUTPUT
OUT 0A3H, AL
MOV AL, BL
OUT 0A2H, AL ;OUTPUT BYTE TO PORTC
RET
;SENDING DATA TO LCD. BH HOLDS THE ASCII OF CHARACTER
LCD_DATA:
MOV AL, BH
OUT 0A0H, AL
;SETTING EN = 1, RS = 1, RW = 0
MOV AL, 98H ;PORTC LINES ARE INPUT
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0FH ;CLEAR UPPER HALF OF PORTC
OR AL, 0D0H ;BYTE 1101XXXX TO PORTC, EN = 1
MOV BL, AL
MOV AL, 90H ;PORTC LINES ARE OUTPUT
OUT 0A3H, AL
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 5 of 9
MOV AL, BL
OUT 0A2H, AL ;OUTPUT BYTE TO PORTC
SETTING EN = 0, RS = 0, RW = 0
MOV AL, 98H ;PORTC LINES ARE INPUT
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0FH ;CLEAR UPPER HALF OF PORTC
OR AL, 90H ;BYTE 1000XXXX TO PORTC, EN = 0
MOV BL, AL
MOV AL, 90H ;PORTC LINES ARE OUTPUT
OUT 0A3H, AL
MOV AL, BL
OUT 0A2H, AL ;OUTPUT BYTE TO PORTC
RET
;ADC CONFIGURATION FOR SINGLE CONVERSION. RESULT IN DH
ADC0804:
;SETTING WR=1, RD=1, CS=0
MOV AL, 93H ;PORTB IS I/P. PORTC IS I/P
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0F8H ;CLEAR LOWER 3 BITS OF PORTC
OR AL, 06H ;SET WR=1, RD=1, CS=0
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 6 of 9
MOV BL, AL ;TEMPORARY COPY OF AL
MOV AL, 92H ;PORTB IS O/P. PORTC IS O/P
OUT 0A3H, AL
MOV AL, BL ;LOAD AL FOR OUTPUT
OUT 0A2H, AL ;WRITE BYET XXXXX110 TO PORTC
;SETTING WR=0, RD=1, CS=0
MOV AL, 93H ;PORTB IS I/P. PORTC IS I/P
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0F8H ;CLEAR LOWER 3 BITS OF PORTC
OR AL, 02H ;SET WR=0, RD=1, CS=0
MOV BL, AL ;TEMPORARY COPY OF AL
MOV AL, 92H ;PORTB IS O/P. PORTC IS O/P
OUT 0A3H, AL
MOV AL, BL ;LOAD AL FOR OUTPUT
OUT 0A2H, AL ;WRITE BYET XXXXX010 TO PORTC
;SETTING WR=1, RD=1, CS=0
MOV AL, 93H ;PORTB IS I/P. PORTC IS I/P
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0F8H ;CLEAR LOWER 3 BITS OF PORTC
OR AL, 06H ;SET WR=1, RD=1, CS=0
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 7 of 9
MOV BL, AL ;TEMPORARY COPY OF AL
MOV AL, 92H ;PORTB IS O/P. PORTC IS O/P
OUT 0A3H, AL
MOV AL, BL ;LOAD AL FOR OUTPUT
OUT 0A2H, AL ;WRITE BYET XXXXX110 TO PORTC
;WAIT FOR INTR = 0
MOV AL, 93H ;PORTB IS I/P. PORTC IS I/P
OUT 0A3H, AL
WAIT: IN AL, 0A2H ;READ PORTC
AND AL, 08H ;AL = 0000X000. X IS INTR PIN
CMP AL, 00H ;IF INTR = 0?
JNE WAIT
IN AL, 0A1 ;READ PORTB FOR RESULT
MOV DH, AL ;COPY RESULT IN DH
;LEAVE ADC IN DISABLED STATE BY SETTING CS = 1
;SETTING WR=1, RD=1, CS=1
MOV AL, 93H ;PORTB IS I/P. PORTC IS I/P
OUT 0A3H, AL
IN AL, 0A2H ;READ PORTC
AND AL, 0F8H ;CLEAR LOWER 3 BITS OF PORTC
OR AL, 07H ;SET WR=1, RD=1, CS=1
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 8 of 9
MOV BL, AL ;TEMPORARY COPY OF AL
MOV AL, 92H ;PORTB IS O/P. PORTC IS O/P
OUT 0A3H, AL
MOV AL, BL ;LOAD AL FOR OUTPUT
OUT 0A2H, AL ;WRITE BYET XXXXX111 TO PORTC
RET
;EXTRACTING INDIVIDUAL DIGITS X, Y AND Z FROM ADC RESULT
;XYZ DECIMAL. ASSUMING RESULT IS IN DH.
;0TH DIGIT (Z) IN CL, 10TH (Y) IN CH AND 100TH (X) IN DL.
SPLIT:
XOR AX, AX ;CLEAR AX FOR USING DIV
MOV AL, DH ;AX = ADC RESULT
MOV DH, 10 ;DIVISOR IS 10
DIV DH ;PERFORMS AX/DH
MOV CL, AH ;Z IS EXTRACTED, AL = XY
XOR AH, AH ;CLEAR AH. AX = XY
DIV DH ;PERFORMS AX/DH
MOV CH, AH ; Y IS EXTRACTED, AL = X
MOV DL, AL ; Z IS EXTRACTED, DL = X
RET
Problem designed by: Muhammad Usman Rafique (Assistant Professor, ECE Deptt.)
Course Instructor MSI (CPE342) Page 9 of 9
;NOW INDIVIDUAL DIGITS CAN BE DISPLAYED ON LCD.
;DISPLAY MUST BE CALLED AFTER CALLING SPLIT
DISPLAY:
MOV BH, 80H ;CURSOR AT LINE 0, COL 0
CALL LCD_COMM
;DISPLAY 100TH DIGIT (FOUND IN DL)
ADD DL, 48 ;ADD 48 TO GET THE ASCII
MOV BH, DL ;COPY IN BH FOR LCD_DATA CALL
CALL LCD_DATA
;DISPLAY 10TH DIGIT (FOUND IN CH)
ADD CH, 48 ;ADD 48 TO GET THE ASCII
MOV BH, CH ;COPY IN BH FOR LCD_DATA CALL
CALL LCD_DATA
;DISPLAY 0TH DIGIT (FOUND IN CL)
ADD CL, 48 ;ADD 48 TO GET THE ASCII
MOV BH, CH ;COPY IN BH FOR LCD_DATA CALL
CALL LCD_DATA
RET