You are on page 1of 9

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

You might also like