|
|

8051 I/O EXPANSION EXAMPLES
The following source code and schematic show how to expand the
8051 I/O using common shift register chips.
; -----------------------------------------------------------------------
; I/O EXPANSION ROUTINES FOR 8051 FAMILY MICROCONTROLLERS
; WRITTEN BY GARY PEEK
; -----------------------------------------------------------------------
; USE THE READINIT AND WRITEINIT ROUTINES DURING INITIALIZATION
; USE THE READ8 AND WRITE8 ROUTINES WHEN USING ONLY ONE CHIP (8 BITS)
; USE THE READ16 AND WRITE16 ROUTINES WHEN USING TWO CHIPS (16 BITS)
;SAMPLE PORT BIT EQUATES
CLOCK BIT P1.7 ;MICROCONTROLLER OUTPUT
STROBE BIT P1.6 ;MICROCONTROLLER OUTPUT
DATAOUT BIT P1.5 ;MICROCONTROLLER OUTPUT
LOADSHIFT BIT P1.4 ;MICROCONTROLLER OUTPUT
DATAIN BIT P1.3 ;MICROCONTROLLER INPUT
; 4094 SHIFT REGISTER OUTPUT ROUTINES
WRITEINIT: ;PINS USED FOR OUTPUT SHIFT REGISTER
CLR CLOCK ;INITIALIZE LOW FOR A HIGH GOING CLOCK
CLR STROBE ;INITIALIZE LOW FOR A HIGH GOING LATCH
RET ;DATAOUT DOES NOT NEED TO BE INITIALIZED
;ENTER WITH OUTPUT BYTE IN ACCUMULATOR
WRITE8: MOV B,#8 ;NUMBER OF BITS TO DO
WR8L: RLC A ;ROTATE BIT 7 INTO CARRY
MOV DATAOUT,C ;PUT CARRY INTO OUTPUT BIT
SETB CLOCK ;CLOCK DATA THROUGH CHIP
CLR CLOCK
DJNZ B,WR8L ;LOOP UNTIL ALL BITS DONE
SETB STROBE ;LATCH DATA INTO OUTPUT REGISTER
CLR STROBE
RET
;ENTER WITH HIGH BYTE IN REGISTER B
;ENTER WITH LOW BYTE IN ACCUMULATOR
WRITE16:PUSH ACC ;SAVE LOW BYTE FOR NOW
MOV A,B ;PUT HIGH BYTE IN ACC, SHIFT IT FIRST
CALL CLKOUT ;CLOCK BITS THROUGH THE CHIPS
POP ACC ;RESTORE THE LOW BYTE
CALL CLKOUT ;CLOCK BITS THROUGH THE CHIPS
RET
CLKOUT: MOV B,#8 ;NUMBER OF BITS TO DO
CLKOL: RLC A ;ROTATE BIT 7 INTO CARRY
MOV DOUT,C ;PUT CARRY INTO OUTPUT BIT
SETB CLOCK ;CLOCK DATA THROUGH CHIP
CLR CLOCK
DJNZ B,CLKOL ;LOOP UNTIL ALL BITS ARE DONE
SETB STROBE ;LATCH DATA INTO OUTPUT REGISTER
CLR STROBE
RET
; 74165 SHIFT REGISTER INPUT ROUTINES
READINIT: ;PINS USED FOR INPUT SHIFT REGISTER
CLR CLOCK ;INITIALIZE LOW FOR A HIGH GOING CLOCK
CLR LOADSHIFT ;INITIALIZE LOW FOR NORMAL "LOAD" FUNCTION
SETB DATAIN ;INITIALIZE HIGH SO IT CAN BE AN INPUT
RET
READ8: MOV B,#8 ;DO 8 BITS
SETB LOADSHIFT ;SET CHIP TO BEGIN SHIFTING DATA OUT
RD8L: SETB CLOCK ;CLOCK DATA TO THE OUTPUT PIN
CLR CLOCK
MOV C,DATAIN ;PUT INPUT BIT INTO CARY
RRC A ;ROTATE CARRY INTO BIT 7
DJNZ B,RD8L ;LOOP UNTIL ALL BITS ARE DONE
CLR LOADSHIFT ;SET CHIP TO LOAD DATA AGAIN
RET ;EXIT WITH INPUT BYTE IN ACCUMULATOR
READ16: SETB LOADSHIFT ;SET CHIPS TO BEGIN SHIFTING DATA OUT
CALL CLKIN ;CLOCK BITS THROUGH CHIPS
PUSH ACC ;SAVE LOW BYTE JUST READ FOR NOW
CALL CLKIN ;CLOCK BITS THROUGH CHIPS
MOV B,A ;STORE HIGH BYTE
POP ACC ;RESTORE LOW BYTE
CLR LOADSHIFT ;SET CHIP TO LOAD DATA AGAIN
RET ;EXIT WITH HIGH BYTE IN REGISTER B
;EXIT WITH LOW BYTE IN ACCUMULATOR
CLKIN: MOV B,#8 ;DO 8 BITS
CLKIL: SETB CLOCK ;CLOCK DATA TO THE OUTPUT PIN
CLR CLOCK
MOV C,DATAIN ;PUT INPUT BIT INTO CARY
RRC A ;ROTATE CARRY INTO BIT 7
DJNZ B,CLKIL ;LOOP UNTIL ALL BITS ARE DONE
RET ;EXIT WITH BYTE IN ACCUMULATOR
(C) Copyright 1997 - 2008 by Vault Information Services LLC. All Rights Reserved.
Information provided "as-is" without warranty. Please see details.
Contact us for usage and copy permission.
|
|