Main Page | Modules | Directories | File List | Globals | Related Pages

db_shift.c

00001 #ifndef _DEV_BOARD_SHIFT_C
00002 #define _DEV_BOARD_SHIFT_C
00003 
00004 /*
00005  * This code has been taken from the Charon Development Board
00006  * Toolkit and slightly modified.
00007  * Harald Kipp
00008  */
00009 
00010 #include "db_shift.h"
00011 
00012 /*
00013  * Send data to 8x shift LED shift interface.
00014  */
00015 void DevBoardShiftLedOut( u_char val )
00016 { u_char i=8;
00017 
00018   sbi(SHIFT_DDR, SHIFT_LED_SET_DDR);  /* parallel write -> output pin */
00019   sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
00020   sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */
00021 
00022   cbi(SHIFT_PORT, SHIFT_LED_SET);
00023   cbi(SHIFT_PORT, SHIFT_CLK);
00024 
00025   while( i-- )
00026   { /* send data to 74595, MSB (most significant bit) first */
00027     if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
00028     else cbi(SHIFT_PORT, SHIFT_OUT);
00029 
00030     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00031     sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
00032     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00033     cbi(SHIFT_PORT, SHIFT_CLK);
00034   }
00035 
00036   sbi(SHIFT_PORT, SHIFT_LED_SET);       /* 0 -> 1 parallel write */
00037 }
00038 
00039 /*
00040  * Send data to 2x16 LCD shift interface.
00041  */
00042 void DevBoardShiftLcdOut( u_char val )
00043 { u_char i=8;
00044 
00045   sbi(SHIFT_DDR, SHIFT_LCD_SET_DDR);  /* parallel write -> output pin */
00046   sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
00047   sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */
00048 
00049   cbi(SHIFT_PORT, SHIFT_LCD_SET);
00050   cbi(SHIFT_PORT, SHIFT_CLK);
00051 
00052   while( i-- )
00053   { /* send data to 74595, MSB (most significant bit) first */
00054     if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
00055     else cbi(SHIFT_PORT, SHIFT_OUT);
00056 
00057     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00058     sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
00059     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00060     cbi(SHIFT_PORT, SHIFT_CLK);
00061   }
00062 
00063   sbi(SHIFT_PORT, SHIFT_LCD_SET);       /* 0 -> 1 parallel write */
00064 }
00065 
00066 /*
00067  * OBSOLETE: Used on dev. board's version 2.8 to access shift io peripherials.
00068  */
00069 void DevBoardShiftWordOut( u_int val )
00070 { u_char i=16;
00071 
00072   sbi(SHIFT_DDR, SHIFT_LED_SET_DDR);  /* parallel write -> output pin */
00073   sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
00074   sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */
00075 
00076   cbi(SHIFT_PORT, SHIFT_LED_SET);
00077   cbi(SHIFT_PORT, SHIFT_CLK);
00078 
00079   while( i-- )
00080   { /* send data to 74595, MSB (most significant bit) first */
00081     if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
00082     else cbi(SHIFT_PORT, SHIFT_OUT);
00083 
00084     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00085     sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
00086     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00087     cbi(SHIFT_PORT, SHIFT_CLK);
00088   }
00089 
00090   sbi(SHIFT_PORT, SHIFT_LED_SET);       /* 0 -> 1 parallel write */
00091 }
00092 
00093 /*
00094  * Read data from 8x shift input interface.
00095  */
00096 u_char DevBoardShiftByteIn( void )
00097 { u_char in_byte=0,
00098          i=7;
00099 
00100   sbi(SHIFT_DDR, SHIFT_IN_LOAD_DDR);    /* shift/!load set as output pin */
00101   sbi(SHIFT_DDR, SHIFT_CLK_DDR);        /* clock set as output pin */
00102   cbi(SHIFT_DDR, SHIFT_IN_DDR);         /* serial data set as input pin */
00103 
00104   cbi(SHIFT_PORT, SHIFT_CLK);           /* set clock low  */
00105   cbi(SHIFT_PORT, SHIFT_IN_LOAD);       /* set load low  -> parallel in */
00106   DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00107   sbi(SHIFT_PORT, SHIFT_IN_LOAD);       /* set load high -> serial out */
00108 
00109                                         /* read bit, MSB(most significant bit) first */
00110   bit_is_set(SHIFT_PIN, SHIFT_IN) ? (in_byte |= 1) : (in_byte |= 0);
00111 
00112   while(i--)
00113   { sbi(SHIFT_PORT, SHIFT_CLK);         /* 0 -> 1 next databit on serial output is valid */
00114 
00115     DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
00116     in_byte <<= 1;                        /* shift one bit left */
00117 
00118     bit_is_set(SHIFT_PIN, SHIFT_IN) ? (in_byte |= 1) : (in_byte |= 0); /* read next bit */
00119 
00120     cbi(SHIFT_PORT, SHIFT_CLK);
00121     DevBoardShiftDelay( SHIFT_IO_DELAY );
00122   }
00123 
00124   return(in_byte);                       /* return received byte */
00125 }
00126 
00127 
00128 /*
00129  * Delay by executing a given number of NOPs.
00130  */
00131 void DevBoardShiftDelay(long nops)
00132 {
00133     long i;
00134 
00135     for (i = 0; i < nops; i++) {
00136         _NOP();
00137     }
00138 }
00139 
00140 #endif
00141 
00142 /* ---------------------------- End Of File ------------------------------ */
00143 

© 2002-2004 by egnite Software GmbH - visit http://www.ethernut.de/