亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eeprom.h

?? 在WinAVR下的ST7565圖形點陣的驅動程序
?? H
字號:
/* Copyright (c) 2002, 2003, 2004, 2007 Marek Michalkiewicz
   Copyright (c) 2005, 2006 Bjoern Haase
   Copyright (c) 2008 Atmel Corporation
   Copyright (c) 2008 Wouter van Gulik
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:

   * Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.
   * Neither the name of the copyright holders nor the names of
     contributors may be used to endorse or promote products derived
     from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE. */

/* $Id: eeprom.h,v 1.21.2.4 2008/04/09 11:01:28 dmix Exp $ */

#ifndef _AVR_EEPROM_H_
#define _AVR_EEPROM_H_ 1

#include <avr/io.h>
#include <stddef.h>	/* size_t */
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef	__ATTR_PURE__
# ifdef	 __DOXYGEN__
#  define __ATTR_PURE__
# else
#  define __ATTR_PURE__  __attribute__((__pure__))
# endif
#endif

uint16_t __eerd_word (const uint16_t *, uint8_t (*)(const uint8_t *))
    __ATTR_PURE__;
uint32_t __eerd_dword (const uint32_t *, uint8_t (*)(const uint8_t *))
    __ATTR_PURE__;
void __eerd_block (void *, const void *, size_t, uint8_t (*)(const uint8_t *));

void __eewr_word (uint16_t *, uint16_t, void (*)(uint8_t *, uint8_t));
void __eewr_dword (uint32_t *, uint32_t, void (*)(uint8_t *, uint8_t));
void __eewr_block (void *, const void *, size_t, void (*)(uint8_t *, uint8_t));

#if	!E2END && !defined(__DOXYGEN__)
# ifndef __COMPILING_AVR_LIBC__
#  warning "Device does not have EEPROM available."
# endif
  /* Omit below for chips without EEPROM.	*/

#else

/** \defgroup avr_eeprom <avr/eeprom.h>: EEPROM handling
    \code #include <avr/eeprom.h> \endcode

    This header file declares the interface to some simple library
    routines suitable for handling the data EEPROM contained in the
    AVR microcontrollers.  The implementation uses a simple polled
    mode interface.  Applications that require interrupt-controlled
    EEPROM access to ensure that no time will be wasted in spinloops
    will have to deploy their own implementation.

    \note All of the read/write functions first make sure the EEPROM
    is ready to be accessed.  Since this may cause long delays if a
    write operation is still pending, time-critical applications
    should first poll the EEPROM e. g. using eeprom_is_ready() before
    attempting any actual I/O.  But this functions are not wait until
    SELFPRGEN in SPMCSR becomes zero.  Do this manually, if your
    softwate contains the Flash burning.

    \note As these functions modify IO registers, they are known to be
    non-reentrant.  If any of these functions are used from both,
    standard and interrupt context, the applications must ensure
    proper protection (e.g. by disabling interrupts before accessing
    them).

    \note All write functions force erase_and_write programming mode.
 */

/** \def EEMEM
    \ingroup avr_eeprom
    Attribute expression causing a variable to be allocated within the
    .eeprom section.	*/
#define EEMEM __attribute__((section(".eeprom")))


/* Register definitions */

/* Check for aliases. */
#if	!defined(EEWE) && defined(EEPE)
# define EEWE EEPE
#endif

#if	!defined(EEMWE) && defined(EEMPE)
# define EEMWE EEMPE
#endif

#if	!defined(EECR) && defined(DEECR)
/* AT86RF401 */
# define EECR  DEECR
# define EEAR  DEEAR
# define EEARL DEEAR
# define EEDR  DEEDR
# define EERE  EER
# define EEWE  EEL
# define EEMWE EEU
#endif


#if	!defined(EECR) || !defined(EEDR) || !defined(EEARL)

# if	 !defined(__EEPROM_REG_LOCATIONS__) \
      && !defined(EEPROM_REG_LOCATIONS_OVERRIDE)
   /* 6-byte string denoting where to find the EEPROM registers in memory
      space.  Adresses denoted in hex syntax with uppercase letters. Used
      by the EEPROM subroutines.
	First two letters:  EECR address.
	Second two letters: EEDR address.
	Last two letters:   EEAR address.
    */
#  error "Unknown EEPROM register(s) location."
# endif

/* If needed, override the locations defined in the IO headers. */
# ifdef  EEPROM_REG_LOCATIONS_OVERRIDE
#  undef  __EEPROM_REG_LOCATIONS__
#  define __EEPROM_REG_LOCATIONS__ EEPROM_REG_LOCATIONS_OVERRIDE
# endif

# define CONCAT1(a, b) CONCAT2(a, b)
# define CONCAT2(a, b) a ## b
# define HEXNR CONCAT1(0x, __EEPROM_REG_LOCATIONS__)

# undef EECR
# define EECR _SFR_IO8((HEXNR >> 16) & 0xFF)

# undef EEDR
# define EEDR _SFR_IO8((HEXNR >> 8) & 0xFF)

# undef EEAR
# define EEAR _SFR_IO8(HEXNR & 0xFF)

# undef EEARH

# undef EEARL
# define EEARL EEAR

#endif


/** \def eeprom_is_ready
    \ingroup avr_eeprom
    \returns 1 if EEPROM is ready for a new read/write operation, 0 if not.
 */
#if	defined(__DOXYGEN__)
# define eeprom_is_ready()
#elif	defined(DEECR)
# define eeprom_is_ready() bit_is_clear(DEECR, BSY)
#else
# define eeprom_is_ready() bit_is_clear(EECR, EEWE)
#endif


/** \def eeprom_busy_wait
    \ingroup avr_eeprom
    Loops until the eeprom is no longer busy.
    \returns Nothing.
 */ 	 
#define eeprom_busy_wait() do {} while (!eeprom_is_ready())


/** \ingroup avr_eeprom
    Read one byte from EEPROM address \a __p.
 */
__ATTR_PURE__ static __inline__ uint8_t eeprom_read_byte (const uint8_t *__p)
{
    do {} while (!eeprom_is_ready ());
#if	E2END <= 0xFF
    EEARL = (unsigned)__p;
#else
    EEAR = (unsigned)__p;
#endif
    EECR |= (1 << EERE);
    return EEDR;
}

/** \ingroup avr_eeprom
    Read one 16-bit word (little endian) from EEPROM address \a __p.
 */
__ATTR_PURE__ static __inline__ uint16_t eeprom_read_word (const uint16_t *__p)
{
    return __eerd_word (__p, eeprom_read_byte);
}

/** \ingroup avr_eeprom
    Read one 32-bit double word (little endian) from EEPROM address \a __p.
 */
__ATTR_PURE__ static __inline__
uint32_t eeprom_read_dword (const uint32_t *__p)
{
    return __eerd_dword (__p, eeprom_read_byte);
}

/** \ingroup avr_eeprom
    Read a block of \a __n bytes from EEPROM address \a __src to SRAM
    \a __dst.
 */
static __inline__ void
eeprom_read_block (void *__dst, const void *__src, size_t __n)
{
    __eerd_block (__dst, __src, __n, eeprom_read_byte);
}

/** \ingroup avr_eeprom
    Write a byte \a __value to EEPROM address \a __p.
 */
static __inline__ void eeprom_write_byte (uint8_t *__p, uint8_t __value)
{
    do {} while (!eeprom_is_ready ());

#if	defined(EEPM0) && defined(EEPM1)
    EECR = 0;		/* Set programming mode: erase and write.	*/
#elif	defined(EEPM0) || defined(EEPM1)
# warning "Unknown EECR register, eeprom_write_byte() has become outdated."
#endif

#if	E2END <= 0xFF
    EEARL = (unsigned)__p;
#else
    EEAR = (unsigned)__p;
#endif
    EEDR = __value;

    __asm__ __volatile__ (
        "/* START EEPROM WRITE CRITICAL SECTION */\n\t"
        "in	r0, %[__sreg]		\n\t"
        "cli				\n\t"
        "sbi	%[__eecr], %[__eemwe]	\n\t"
        "sbi	%[__eecr], %[__eewe]	\n\t"
        "out	%[__sreg], r0		\n\t"
        "/* END EEPROM WRITE CRITICAL SECTION */"
        :
        : [__eecr]  "i" (_SFR_IO_ADDR(EECR)),
          [__sreg]  "i" (_SFR_IO_ADDR(SREG)),
          [__eemwe] "i" (EEMWE),
          [__eewe]  "i" (EEWE)
        : "r0"
    );
}

/** \ingroup avr_eeprom
    Write a word \a __value to EEPROM address \a __p.
 */
static __inline__ void eeprom_write_word (uint16_t *__p, uint16_t __value)
{
    __eewr_word (__p, __value, eeprom_write_byte);
}

/** \ingroup avr_eeprom
    Write a 32-bit double word \a __value to EEPROM address \a __p.
 */
static __inline__ void eeprom_write_dword (uint32_t *__p, uint32_t __value)
{
    __eewr_dword (__p, __value, eeprom_write_byte);
}

/** \ingroup avr_eeprom
    Write a block of \a __n bytes to EEPROM address \a __dst from \a __src.
    \note The argument order is mismatch with common functions like strcpy().
 */
static __inline__ void
eeprom_write_block (const void *__src, void *__dst, size_t __n)
{
    __eewr_block (__dst, __src, __n, eeprom_write_byte);
}

/** \name IAR C compatibility defines	*/
/*@{*/

/** \def _EEPUT
    \ingroup avr_eeprom
    Write a byte to EEPROM. Compatibility define for IAR C.	*/
#define _EEPUT(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))

/** \def _EEGET
    \ingroup avr_eeprom
    Read a byte from EEPROM. Compatibility define for IAR C.	*/
#define _EEGET(var, addr) (var) = eeprom_read_byte ((const uint8_t *)(addr))

/*@}*/

#endif	/* E2END || defined(__DOXYGEN__) */

#ifdef __cplusplus
}
#endif

#endif	/* !_AVR_EEPROM_H */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2014亚洲片线观看视频免费| 精品国产免费久久| 欧美成人一区二区三区| 国产精品女同一区二区三区| 石原莉奈在线亚洲三区| 国产成人精品影视| 69p69国产精品| 中文字幕亚洲视频| 国产一区91精品张津瑜| 欧美少妇bbb| 国产精品激情偷乱一区二区∴| 亚洲chinese男男1069| av成人免费在线观看| 欧美va亚洲va国产综合| 亚洲成a天堂v人片| 99久久国产综合精品色伊| www激情久久| 日韩精品高清不卡| 欧美色大人视频| 1区2区3区国产精品| 国产成都精品91一区二区三| 欧美一个色资源| 亚洲一区影音先锋| 色哟哟一区二区在线观看| 亚洲国产精品成人综合| 精品在线亚洲视频| 日韩三级视频在线看| 亚洲成年人影院| 欧美三电影在线| 亚洲最大的成人av| 一本到三区不卡视频| 成人欧美一区二区三区视频网页 | 色8久久精品久久久久久蜜| 久久精品男人的天堂| 另类调教123区| 91精品国产美女浴室洗澡无遮挡| 亚洲国产成人porn| 欧美日韩一区二区在线观看视频| 亚洲免费电影在线| 色悠久久久久综合欧美99| 亚洲少妇30p| 色呦呦网站一区| 亚洲高清免费观看高清完整版在线观看 | 97se狠狠狠综合亚洲狠狠| 国产精品网站在线| 不卡av电影在线播放| 国产精品毛片a∨一区二区三区| 欧美午夜精品久久久久久孕妇| 久久99精品国产| 亚洲免费视频中文字幕| 国产一区在线视频| 成人精品鲁一区一区二区| 欧美经典一区二区三区| 豆国产96在线|亚洲| 国产精品三级电影| 91一区二区在线| 亚洲电影你懂得| 精品免费一区二区三区| 国产91精品免费| 亚洲综合自拍偷拍| 日韩一区二区免费视频| 高清不卡一区二区| 亚洲女人****多毛耸耸8| 678五月天丁香亚洲综合网| 国产揄拍国内精品对白| 亚洲一区二区三区四区五区黄| 欧美日韩一二区| 经典三级在线一区| 精品制服美女久久| 精品视频在线视频| 久久精品一区二区三区不卡牛牛 | 国产精品久久久久久亚洲伦| 国产一区二区在线电影| 国产亚洲欧美在线| av动漫一区二区| 一区二区三区在线观看国产| 欧美裸体一区二区三区| 蜜臀av一区二区在线观看| 久久综合九色综合97婷婷女人| 成人精品gif动图一区| 亚洲午夜一二三区视频| 日韩欧美国产三级电影视频| 成人免费高清在线| 丝袜国产日韩另类美女| 2024国产精品| 色哟哟欧美精品| 亚洲伊人伊色伊影伊综合网| 大白屁股一区二区视频| 欧美在线影院一区二区| 国产日产欧产精品推荐色| 91视频在线观看| 日韩av中文字幕一区二区| 日韩精品一区二区三区在线| 在线视频欧美精品| 久草在线在线精品观看| 自拍偷拍欧美精品| 日韩免费观看2025年上映的电影| 大尺度一区二区| 日本强好片久久久久久aaa| 欧美国产欧美综合| 在线观看一区日韩| 99麻豆久久久国产精品免费 | 国产精品看片你懂得| 日韩欧美成人激情| 欧美伊人久久大香线蕉综合69| 中文字幕欧美一区| 国产亚洲欧洲997久久综合| 色婷婷久久综合| 久久国产精品72免费观看| 亚洲蜜臀av乱码久久精品| 久久久久久久久久美女| 欧美日韩国产成人在线91| 99久久久久久99| 视频在线观看91| 亚洲国产精品v| 精品福利一区二区三区| 欧美日韩一区二区在线观看视频| 福利视频网站一区二区三区| 美女高潮久久久| 五月婷婷色综合| 亚洲国产精品久久人人爱蜜臀| 国产精品福利影院| 欧美韩国日本一区| 久久综合一区二区| 精品福利在线导航| 日韩免费观看高清完整版在线观看| 欧美综合色免费| 337p亚洲精品色噜噜噜| 色一情一乱一乱一91av| 99久久精品久久久久久清纯| 国产很黄免费观看久久| 亚洲va韩国va欧美va| 午夜视频一区二区| 亚洲成人黄色影院| 五月婷婷激情综合网| 亚洲第一久久影院| 偷拍一区二区三区| 日日夜夜免费精品视频| 日韩中文字幕91| 首页综合国产亚洲丝袜| 精品在线一区二区| 国产成人在线视频网站| 国产激情偷乱视频一区二区三区| 国产精品影视天天线| 国产电影一区二区三区| 成人免费毛片高清视频| 美女在线观看视频一区二区| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品乱子久久久久| 亚洲美女在线国产| 一区二区三区丝袜| 天天综合网天天综合色| 奇米影视7777精品一区二区| 久久精品国产网站| 国产suv一区二区三区88区| 波多野结衣中文一区| 欧美剧情电影在线观看完整版免费励志电影| 欧美日韩在线综合| 日韩欧美一级二级| 国产精品国产自产拍高清av王其| 亚洲人123区| 日本午夜精品视频在线观看| 一区二区欧美精品| 国产成人aaaa| 在线视频国内自拍亚洲视频| 日韩一区二区三区观看| 欧美激情综合在线| 亚洲国产综合色| 美腿丝袜亚洲一区| 欧洲国产伦久久久久久久| 欧美一级高清大全免费观看| 国产亚洲一本大道中文在线| 亚洲黄色免费网站| 久久99国内精品| 日本乱码高清不卡字幕| 久久久精品免费网站| 夜夜精品视频一区二区| 国产一区二区0| 欧美图片一区二区三区| 久久久亚洲午夜电影| 亚洲午夜在线观看视频在线| 捆绑紧缚一区二区三区视频| 欧美性高清videossexo| 久久亚洲综合av| 偷拍日韩校园综合在线| 成人网在线免费视频| 在线不卡免费欧美| 国产精品成人免费精品自在线观看 | www成人在线观看| 亚洲一区二区美女| 国产一区二区三区在线看麻豆| 欧美在线免费观看亚洲| 国产三级欧美三级日产三级99| 午夜精品久久久久影视| 99免费精品在线观看| 久久亚洲精精品中文字幕早川悠里| 一区二区三区精密机械公司| 国产一区二区三区免费观看| 欧美久久久一区| 亚洲一区二区三区在线看|