⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_shift.c

📁 针对AVR单片机开发的嵌入式操作系统
💻 C
字号:
#ifndef _DEV_BOARD_SHIFT_C
#define _DEV_BOARD_SHIFT_C

/*
 * This code has been taken from the Charon Development Board
 * Toolkit and slightly modified.
 * Harald Kipp
 */

#include "db_shift.h"

/*
 * Send data to 8x shift LED shift interface.
 */
void DevBoardShiftLedOut( u_char val )
{ u_char i=8;

  sbi(SHIFT_DDR, SHIFT_LED_SET_DDR);  /* parallel write -> output pin */
  sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
  sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */

  cbi(SHIFT_PORT, SHIFT_LED_SET);
  cbi(SHIFT_PORT, SHIFT_CLK);

  while( i-- )
  { /* send data to 74595, MSB (most significant bit) first */
    if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
    else cbi(SHIFT_PORT, SHIFT_OUT);

    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    cbi(SHIFT_PORT, SHIFT_CLK);
  }

  sbi(SHIFT_PORT, SHIFT_LED_SET);       /* 0 -> 1 parallel write */
}

/*
 * Send data to 2x16 LCD shift interface.
 */
void DevBoardShiftLcdOut( u_char val )
{ u_char i=8;

  sbi(SHIFT_DDR, SHIFT_LCD_SET_DDR);  /* parallel write -> output pin */
  sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
  sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */

  cbi(SHIFT_PORT, SHIFT_LCD_SET);
  cbi(SHIFT_PORT, SHIFT_CLK);

  while( i-- )
  { /* send data to 74595, MSB (most significant bit) first */
    if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
    else cbi(SHIFT_PORT, SHIFT_OUT);

    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    cbi(SHIFT_PORT, SHIFT_CLK);
  }

  sbi(SHIFT_PORT, SHIFT_LCD_SET);       /* 0 -> 1 parallel write */
}

/*
 * OBSOLETE: Used on dev. board's version 2.8 to access shift io peripherials.
 */
void DevBoardShiftWordOut( u_int val )
{ u_char i=16;

  sbi(SHIFT_DDR, SHIFT_LED_SET_DDR);  /* parallel write -> output pin */
  sbi(SHIFT_DDR, SHIFT_CLK_DDR);      /* serial clock -> output pin */
  sbi(SHIFT_DDR, SHIFT_OUT_DDR);      /* serial data stream -> output pin */

  cbi(SHIFT_PORT, SHIFT_LED_SET);
  cbi(SHIFT_PORT, SHIFT_CLK);

  while( i-- )
  { /* send data to 74595, MSB (most significant bit) first */
    if( val & (1 << i) ) sbi(SHIFT_PORT, SHIFT_OUT);
    else cbi(SHIFT_PORT, SHIFT_OUT);

    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    sbi(SHIFT_PORT, SHIFT_CLK);           /* 0 -> 1 data valid */
    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    cbi(SHIFT_PORT, SHIFT_CLK);
  }

  sbi(SHIFT_PORT, SHIFT_LED_SET);       /* 0 -> 1 parallel write */
}

/*
 * Read data from 8x shift input interface.
 */
u_char DevBoardShiftByteIn( void )
{ u_char in_byte=0,
         i=7;

  sbi(SHIFT_DDR, SHIFT_IN_LOAD_DDR);    /* shift/!load set as output pin */
  sbi(SHIFT_DDR, SHIFT_CLK_DDR);        /* clock set as output pin */
  cbi(SHIFT_DDR, SHIFT_IN_DDR);         /* serial data set as input pin */

  cbi(SHIFT_PORT, SHIFT_CLK);           /* set clock low  */
  cbi(SHIFT_PORT, SHIFT_IN_LOAD);       /* set load low  -> parallel in */
  DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
  sbi(SHIFT_PORT, SHIFT_IN_LOAD);       /* set load high -> serial out */

                                        /* read bit, MSB(most significant bit) first */
  bit_is_set(SHIFT_PIN, SHIFT_IN) ? (in_byte |= 1) : (in_byte |= 0);

  while(i--)
  { sbi(SHIFT_PORT, SHIFT_CLK);         /* 0 -> 1 next databit on serial output is valid */

    DevBoardShiftDelay( SHIFT_IO_DELAY ); /* small delay between two I/O operations */
    in_byte <<= 1;                        /* shift one bit left */

    bit_is_set(SHIFT_PIN, SHIFT_IN) ? (in_byte |= 1) : (in_byte |= 0); /* read next bit */

    cbi(SHIFT_PORT, SHIFT_CLK);
    DevBoardShiftDelay( SHIFT_IO_DELAY );
  }

  return(in_byte);                       /* return received byte */
}


/*
 * Delay by executing a given number of NOPs.
 */
void DevBoardShiftDelay(long nops)
{
    long i;

    for (i = 0; i < nops; i++) {
        _NOP();
    }
}

#endif

/* ---------------------------- End Of File ------------------------------ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -