[共享]傻孩子常用基础库文件同步贴 (for OLD Style)
由于Snail C Coding Style 的修正,该贴中提到的基础库文件仅仅用作对2009年之前的工程进行向前兼容,2009年4月以后,Snail Studio将全面执行新的编码规范,规范草案和对应的基础
库函数将陆续更新。
RD_MacroAndConst.h
-----------------------------------------------------------------
#ifndef _USE_MACRO_AND_CONST_H_
#define _USE_MACRO_AND_CONST_H_
/***********************************************************
* 声明库说明:系统常用宏定义声明库 *
* 版本: v0.14 *
* 作者: 傻孩子 *
* 创建日期:2006年5月4日 *
* -------------------------------------------------------- *
*[支 持 库] *
* 支持库名称: *
* 需要版本: *
* 支持库说明: *
* -------------------------------------------------------- *
*[版本更新] *
* 修改: 王卓然 *
* 修改日期:2007年1月31日 *
* 版本: v0.05 *
* *
* 修改: 王卓然 *
* 修改日期:2007年2月20日 *
* 版本: v0.06 *
* *
* 修改: 王卓然 *
* 修改日期:2007年2月27日 *
* 版本: v0.07 *
* *
* 修改: 王卓然 *
* 修改日期:2007年5月14日 *
* 版本: v0.09 *
* *
* 修改: 王卓然 *
* 修改日期:2007年8月15日 *
* 版本: v0.11 *
* *
* 修改: 王卓然 *
* 修改日期:2008年1月02日 *
* 版本: v0.12 *
* *
* 修改: 王卓然 *
* 修改日期:2008年1月19日 *
* 版本: v0.13 *
* *
* 修改: 王卓然 *
* 修改日期:2008年2月27日 *
* 版本: v0.14 *
* -------------------------------------------------------- *
*[版本历史] *
* v0.04修改了NULL的定义,增加了MAX()和MIN两个宏;*
* 修改了关于char的符号定义。 *
* v0.05针对新规范进行了宏的扩充,删除了一些无效的*
* 非规范的宏定义和类型声明。 *
* v0.06增加了对新的位操作方式的支持。 *
* v0.07增加了一个SAFE_CODE_PERFORMANCE()宏,用来保 *
* 正原子操作的正确运行。 *
* v0.09增加了一个强制类型转换宏TYPE_CONVERSION(), *
* 和一个绝对值宏ABS() *
* v0.11增加了一个用于从任意整数中提取16进制数字的*
* 宏SELECT_HEX()。和一个将任意整数进行等效的*
* 正数求模。也就是说,即便是负数,也会映射到*
* 等效的正数上。 *
* v0.12增加了一个宏相加结构。 *
* v0.13更新了原子操作,使其对环境的影响减小。 *
* v0.14再次更新原子操作。 *
* -------------------------------------------------------- *
*[使用说明] *
* 1、该库文件属于基础库文件。 *
***********************************************************/
/********************
* 系 统 宏 定 义*
********************/
#ifndef _USE_NON_ICC_IDE
# include <macros.h>
#endif
/*------------------*
* 常 数 宏 定 义*
*------------------*/
#ifndef FALSE
# define FALSE 0x00
#endif
#ifndef TRUE
# define TRUE (!FALSE)
#endif
#ifndef HIGH
# define HIGH 0x01
#endif
#ifndef LOW
# define LOW 0x00
#endif
#ifndef PI
# define PI 3.1415926535897932f
#endif
# define K_D2R (PI/180.0)
# define K_R2D (180.0/PI)
/*------------------*
* 动 作 宏 定 义*
*------------------*/
# define SIN(x)sin((float)x * K_D2R)
# define COS(x)cos((float)x * K_D2R)
# define TAN(x)tan((float)x * K_D2R)
# define ATAN(x) (K_R2D*atan(x))
# define ASIN(x) (K_R2D*asin(x))
# define ACOS(x) (K_R2D*acos(x))
#ifndef NULL
# define NULL 0
#endif
# define SET(Reg,n) Reg |= BIT(n);
# define CLR(Reg,n) Reg &= ~BIT(n);
#define MAX(a,b)(((a) > (b)) ? (a) : (b))
#define MIN(a,b)(((a) < (b)) ? (a) : (b))
#define UBOUND(a) (sizeof(a)/sizeof(a))
# define SAFE_CODE_PERFORMANCE(Code) {\
UINT8 cFlags = (SREG & BIT(7));\
CLI();\
Code;\
SREG |= cFlags;\
}
# define EXIT_SAFE_CODE SREG |= cflags;
# define TYPE_CONVERSION(Addr,Type) (*((Type *)(Addr)))
# define ABS(Number) (((Number) < 0)?(-(Number)):(Number))
# define SELECT_HEX(Value,n,Type) ((Value << (n) * 4) >> ((sizeof(Type) * 8) - 4))
# define ABS_MOD(x,y) ((((x) % (y)) + (y)) % (y))
# define _ADD_STR(a,b) a##b
# define ADD_STR(a,b) _ADD_STR(a,b)
/********************
*用户变量类型定义 *
********************/
typedef unsigned int uint16;
typedef unsigned int UINT;
typedef unsigned int uint;
typedef unsigned int UINT16;
typedef unsigned int WORD;
typedef unsigned int word;
typedef int int16;
typedef int INT16;
typedef unsigned long uint32;
typedef unsigned long UINT32;
typedef unsigned long DWORD;
typedef unsigned long dword;
typedef long int32;
typedef long INT32;
typedef signed char int8;
typedef signed char INT8;
typedef unsigned char byte;
typedef unsigned char BYTE;
typedef unsigned char UINT8;
typedef unsigned char uint8;
typedef unsigned char BOOL;
#endif RD_UseBits.h
--------------------------------------------------------------------
#ifndef _USE_BITS_H_
#define _USE_BITS_H_
/***********************************************************
* 声明库说明:系统位段操作函数库 *
* 版本: v1.01 *
* 作者: 傻孩子 *
* 创建时间:2006年5月4日 *
* -------------------------------------------------------- *
*[支 持 库] *
* 支持库名称: *
* 需要版本: *
* 支持库说明: *
* -------------------------------------------------------- *
*[版本更新] *
* 修改: 傻孩子 *
* 修改日期:2007年9月3日 *
* 版本: v1.01 *
* -------------------------------------------------------- *
*[版本历史] *
* v1.00 包含了从32位到8位对16位8位4位1位的各种映射*
* 允许通过功能宏定义中定义的宏拆分任意的地址*
* v1.01 修改了一处BUG *
* -------------------------------------------------------- *
*[使用说明] *
* 1、该头文件属于基层头文件。 *
* 2、兼容32位16位8位单片机系统。 *
* 3、饱含该头文件以后,可以通过功能宏定义中定义的 *
* 宏拆分任意地址,也可以直接使用后面自定义的位 *
* 段类型定义新的位段变量或者指针。 *
* 4、需要注意的是,使用功能宏定义中的宏只是将指定 *
* 变量的地址强行邦定为指定类型的位段,并不真正 *
* 分配一个地址空间,如果指定类型的位段长度和地 *
* 址实际长度不相同将会导致不可预期的后果。 *
***********************************************************/
/********************
* 系 统 宏 定 义*
********************/
/*------------------*
* 常 数 宏 定 义*
*------------------*/
/*------------------*
* 功 能 宏 定 义*
*------------------*/
# define SET_BIT8_FORMAT(Addr) (*((volatile BYTEBIT *)&Addr))
# define SET_BYTE_DIV_2(Addr) (*((volatile BYTE2HBYTE *)&Addr))
# define SET_BIT16_FORMAT(Addr) (*((volatile WORDBIT *)&Addr))
# define SET_WORD_DIV_2(Addr) (*((volatile WORD2BYTE *)&Addr))
# define SET_WORD_DIV_4(Addr) (*((volatile WORD2HBYTE *)&Addr))
# define SET_BIT32_FORMAT(Addr) (*((volatile DWORDBIT *)&Addr))
# define SET_DWORD_DIV_2(Addr) (*((volatile DWORD2WORD *)&Addr))
# define SET_DWORD_DIV_4(Addr) (*((volatile DWORD2BYTE *)&Addr))
# define SET_DWORD_DIV_8(Addr) (*((volatile DWORD2HBYTE *)&Addr))
/********************
* 结 构 体 定 义 区 *
********************/
/*------------------*
* 8位变量位映射 *
*------------------*/
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
/*------------------*
* 16位变量位映射*
*------------------*/
typedef struct WORD_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
unsigned BIT8:1;
unsigned BIT9:1;
unsigned BIT10:1;
unsigned BIT11:1;
unsigned BIT12:1;
unsigned BIT13:1;
unsigned BIT14:1;
unsigned BIT15:1;
}WORDBIT;
/*------------------*
*32位变量位映射 *
*------------------*/
typedef struct DWORD_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
unsigned BIT8:1;
unsigned BIT9:1;
unsigned BIT10:1;
unsigned BIT11:1;
unsigned BIT12:1;
unsigned BIT13:1;
unsigned BIT14:1;
unsigned BIT15:1;
unsigned BIT16:1;
unsigned BIT17:1;
unsigned BIT18:1;
unsigned BIT19:1;
unsigned BIT20:1;
unsigned BIT21:1;
unsigned BIT22:1;
unsigned BIT23:1;
unsigned BIT24:1;
unsigned BIT25:1;
unsigned BIT26:1;
unsigned BIT27:1;
unsigned BIT28:1;
unsigned BIT29:1;
unsigned BIT30:1;
unsigned BIT31:1;
}DWORDBIT;
/*------------------*
*32位变量4分映射*
*------------------*/
typedef struct DWORD_BYTE
{
unsigned BYTEA:8;
unsigned BYTEB:8;
unsigned BYTEC:8;
unsigned BYTED:8;
}DWORD2BYTE;
/*------------------*
*32位变量2分映射*
*------------------*/
typedef struct DWORD_WORD
{
unsigned WORDA:16;
unsigned WORDB:16;
}DWORD2WORD;
/*------------------*
*32位变量16分映射 *
*------------------*/
typedef struct DWORD_HBYTE
{
unsigned BYTEAL:4;
unsigned BYTEAH:4;
unsigned BYTEBL:4;
unsigned BYTEBH:4;
unsigned BYTECL:4;
unsigned BYTECH:4;
unsigned BYTEDL:4;
unsigned BYTEDH:4;
}DWORD2HBYTE;
/*------------------*
* 16位变量2分映射 *
*------------------*/
typedef struct WORD_BYTE
{
unsigned BYTEA:8;
unsigned BYTEB:8;
}WORD2BYTE;
/*------------------*
*16位变量4分映射*
*------------------*/
typedef struct WORD_HBYTE
{
unsigned BYTEAL:4;
unsigned BYTEAH:4;
unsigned BYTEBL:4;
unsigned BYTEBH:4;
}WORD2HBYTE;
/*------------------*
*8位变量2分映射 *
*------------------*/
typedef struct BYTE_DIV2
{
unsigned BYTEAL:4;
unsigned BYTEAH:4;
}BYTE2HBYTE;
#endif RD_UseAVRPORTBit.h AVR通用位操作支持库
--------------------------------------------------------------------
#ifndef _USE_AVR_PORT_BIT_H_
#define _USE_AVR_PORT_BIT_H_
/***********************************************************
* 声明库说明:AVR位操作通用支持库 *
* 版本: v1.10 *
* 作者: 傻孩子 *
* 创建日期:2006年4月25日 *
* -------------------------------------------------------- *
*[支 持 库] *
* 库名称: RD_UseBITs.h *
* 需要版本:v1.00 &abv *
* 支持库说明:系统位段操作函数库 *
* *
* 库名称: RD_MacroAndConst.h *
* 需要版本:v0.01 &abv *
* 支持库说明:系统常用宏定义库 *
* -------------------------------------------------------- *
*[版本更新] *
* 修改: 傻孩子 *
* 修改日期:2006年5月4日 *
* 版本: v1.01 *
* *
* 修改: 傻孩子 *
* 修改日期:2007年7月17日 *
* 版本: v1.10 *
* -------------------------------------------------------- *
*[版本历史] *
* 前身版本在该版本最终生成之前,经历过针对各种芯片的 *
* 专用版本,这些版本提供了针对PORT的位操作和 *
* 部分PIN、DDR的位操作。 *
* v1.00该版本支持几乎所有的芯片,具有完善的宏定义 *
* 系统,相对前身版本最小的资源占用。增加了对 *
* 各种常用变量用户类型的定义。 *
* v1.01增加了关于布尔型变量类型的宏定义。 *
* 修改了头文件的位段映射模式。通过统一的头文 *
* 件RD_UseBITs.h来实现位段类型的定义和声明。 *
* v1.10规范了宏的名称DDR_PXn PIN_PXn *
* -------------------------------------------------------- *
*[使用说明] *
* 1、在使用该头文件之前先包含您需要使用的芯片 *
* 的官方头文件,例如:# include <iom8v.h> *
* 2、如果你不是ICC的用户,请在使用该头文件之前*
* 先绑定各个端口的地址到相应的宏定义上,例如 *
* # define PORTA (*((volatile char *)0x3b))*
* 3、如果你使用的是非ICC系统,请在调用文件之前*
* 定义宏 _USE_NON_ICC_IDE。 *
* 4、可以使用SET_BITS_FORMAT(变量)把任意变量拆*
* 成位定义的模式。 *
***********************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_UseBITs.h"
/********************
* 系 统 宏 定 义*
********************/
/*------------------*
* 常 数 宏 定 义*
*------------------*/
#ifndef PDIR_OUT
# define PDIR_OUT 0x01
#endif
#ifndef PDIR_IN
# define PDIR_IN 0x00
#endif
/*------------------*
* 硬 件 连 接 定 义 *
*------------------*/
/*---------------- PORT口绑定 ---------------*/
#ifdef PORTA
# define PORTA_BIT SET_BIT8_FORMAT(PORTA)
#endif
#ifdef PORTB
# define PORTB_BIT SET_BIT8_FORMAT(PORTB)
#endif
#ifdef PORTC
# define PORTC_BIT SET_BIT8_FORMAT(PORTC)
#endif
#ifdef PORTD
# define PORTD_BIT SET_BIT8_FORMAT(PORTD)
#endif
#ifdef PORTE
# define PORTE_BIT SET_BIT8_FORMAT(PORTE)
#endif
#ifdef PORTF
# define PORTF_BIT SET_BIT8_FORMAT(PORTF)
#endif
#ifdef PORTG
# define PORTG_BIT SET_BIT8_FORMAT(PORTG)
#endif
/*---------------- DDR 口绑定 ---------------*/
#ifdef DDRA
# define DDRA_BIT SET_BIT8_FORMAT(DDRA)
#endif
#ifdef DDRB
# define DDRB_BIT SET_BIT8_FORMAT(DDRB)
#endif
#ifdef DDRC
# define DDRC_BIT SET_BIT8_FORMAT(DDRC)
#endif
#ifdef DDRD
# define DDRD_BIT SET_BIT8_FORMAT(DDRD)
#endif
#ifdef DDRE
# define DDRE_BIT SET_BIT8_FORMAT(DDRE)
#endif
#ifdef DDRF
# define DDRF_BIT SET_BIT8_FORMAT(DDRF)
#endif
#ifdef DDRG
# define DDRG_BIT SET_BIT8_FORMAT(DDRG)
#endif
/*---------------- PIN 口绑定 ---------------*/
#ifdef PINA
# define PINA_BIT SET_BIT8_FORMAT(PINA)
#endif
#ifdef PINB
# define PINB_BIT SET_BIT8_FORMAT(PINB)
#endif
#ifdef PINC
# define PINC_BIT SET_BIT8_FORMAT(PINC)
#endif
#ifdef PIND
# define PIND_BIT SET_BIT8_FORMAT(PIND)
#endif
#ifdef PINE
# define PINE_BIT SET_BIT8_FORMAT(PINE)
#endif
#ifdef PINF
# define PINF_BIT SET_BIT8_FORMAT(PINF)
#endif
#ifdef PING
# define PING_BIT SET_BIT8_FORMAT(PING)
#endif
/*------------------*
* 端 口 宏 定 义*
*------------------*/
/*-------------PORT位操作定义--------------*/
#ifdef PORTA
# define _PA0 PORTA_BIT.BIT0
# define _PA1 PORTA_BIT.BIT1
# define _PA2 PORTA_BIT.BIT2
# define _PA3 PORTA_BIT.BIT3
# define _PA4 PORTA_BIT.BIT4
# define _PA5 PORTA_BIT.BIT5
# define _PA6 PORTA_BIT.BIT6
# define _PA7 PORTA_BIT.BIT7
#endif
#ifdef PORTB
# define _PB0 PORTB_BIT.BIT0
# define _PB1 PORTB_BIT.BIT1
# define _PB2 PORTB_BIT.BIT2
# define _PB3 PORTB_BIT.BIT3
# define _PB4 PORTB_BIT.BIT4
# define _PB5 PORTB_BIT.BIT5
# define _PB6 PORTB_BIT.BIT6
# define _PB7 PORTB_BIT.BIT7
#endif
#ifdef PORTC
# define _PC0 PORTC_BIT.BIT0
# define _PC1 PORTC_BIT.BIT1
# define _PC2 PORTC_BIT.BIT2
# define _PC3 PORTC_BIT.BIT3
# define _PC4 PORTC_BIT.BIT4
# define _PC5 PORTC_BIT.BIT5
# define _PC6 PORTC_BIT.BIT6
# define _PC7 PORTC_BIT.BIT7
#endif
#ifdef PORTD
# define _PD0 PORTD_BIT.BIT0
# define _PD1 PORTD_BIT.BIT1
# define _PD2 PORTD_BIT.BIT2
# define _PD3 PORTD_BIT.BIT3
# define _PD4 PORTD_BIT.BIT4
# define _PD5 PORTD_BIT.BIT5
# define _PD6 PORTD_BIT.BIT6
# define _PD7 PORTD_BIT.BIT7
#endif
#ifdef PORTE
# define _PE0 PORTE_BIT.BIT0
# define _PE1 PORTE_BIT.BIT1
# define _PE2 PORTE_BIT.BIT2
# define _PE3 PORTE_BIT.BIT3
# define _PE4 PORTE_BIT.BIT4
# define _PE5 PORTE_BIT.BIT5
# define _PE6 PORTE_BIT.BIT6
# define _PE7 PORTE_BIT.BIT7
#endif
#ifdef PORTF
# define _PF0 PORTF_BIT.BIT0
# define _PF1 PORTF_BIT.BIT1
# define _PF2 PORTF_BIT.BIT2
# define _PF3 PORTF_BIT.BIT3
# define _PF4 PORTF_BIT.BIT4
# define _PF5 PORTF_BIT.BIT5
# define _PF6 PORTF_BIT.BIT6
# define _PF7 PORTF_BIT.BIT7
#endif
#ifdef PORTG
# define _PG0 PORTG_BIT.BIT0
# define _PG1 PORTG_BIT.BIT1
# define _PG2 PORTG_BIT.BIT2
# define _PG3 PORTG_BIT.BIT3
# define _PG4 PORTG_BIT.BIT4
# define _PG5 PORTG_BIT.BIT5
# define _PG6 PORTG_BIT.BIT6
# define _PG7 PORTG_BIT.BIT7
#endif
/*------------- DDR 位操作定义 -------------*/
#ifdef DDRA
# define DDR_PA0 DDRA_BIT.BIT0
# define DDR_PA1 DDRA_BIT.BIT1
# define DDR_PA2 DDRA_BIT.BIT2
# define DDR_PA3 DDRA_BIT.BIT3
# define DDR_PA4 DDRA_BIT.BIT4
# define DDR_PA5 DDRA_BIT.BIT5
# define DDR_PA6 DDRA_BIT.BIT6
# define DDR_PA7 DDRA_BIT.BIT7
#endif
#ifdef DDRB
# define DDR_PB0 DDRB_BIT.BIT0
# define DDR_PB1 DDRB_BIT.BIT1
# define DDR_PB2 DDRB_BIT.BIT2
# define DDR_PB3 DDRB_BIT.BIT3
# define DDR_PB4 DDRB_BIT.BIT4
# define DDR_PB5 DDRB_BIT.BIT5
# define DDR_PB6 DDRB_BIT.BIT6
# define DDR_PB7 DDRB_BIT.BIT7
#endif
#ifdef DDRC
# define DDR_PC0 DDRC_BIT.BIT0
# define DDR_PC1 DDRC_BIT.BIT1
# define DDR_PC2 DDRC_BIT.BIT2
# define DDR_PC3 DDRC_BIT.BIT3
# define DDR_PC4 DDRC_BIT.BIT4
# define DDR_PC5 DDRC_BIT.BIT5
# define DDR_PC6 DDRC_BIT.BIT6
# define DDR_PC7 DDRC_BIT.BIT7
#endif
#ifdef DDRD
# define DDR_PD0 DDRD_BIT.BIT0
# define DDR_PD1 DDRD_BIT.BIT1
# define DDR_PD2 DDRD_BIT.BIT2
# define DDR_PD3 DDRD_BIT.BIT3
# define DDR_PD4 DDRD_BIT.BIT4
# define DDR_PD5 DDRD_BIT.BIT5
# define DDR_PD6 DDRD_BIT.BIT6
# define DDR_PD7 DDRD_BIT.BIT7
#endif
#ifdef DDRE
# define DDR_PE0 DDRE_BIT.BIT0
# define DDR_PE1 DDRE_BIT.BIT1
# define DDR_PE2 DDRE_BIT.BIT2
# define DDR_PE3 DDRE_BIT.BIT3
# define DDR_PE4 DDRE_BIT.BIT4
# define DDR_PE5 DDRE_BIT.BIT5
# define DDR_PE6 DDRE_BIT.BIT6
# define DDR_PE7 DDRE_BIT.BIT7
#endif
#ifdef DDRF
# define DDR_PF0 DDRF_BIT.BIT0
# define DDR_PF1 DDRF_BIT.BIT1
# define DDR_PF2 DDRF_BIT.BIT2
# define DDR_PF3 DDRF_BIT.BIT3
# define DDR_PF4 DDRF_BIT.BIT4
# define DDR_PF5 DDRF_BIT.BIT5
# define DDR_PF6 DDRF_BIT.BIT6
# define DDR_PF7 DDRF_BIT.BIT7
#endif
#ifdef DDRG
# define DDR_PG0 DDRG_BIT.BIT0
# define DDR_PG1 DDRG_BIT.BIT1
# define DDR_PG2 DDRG_BIT.BIT2
# define DDR_PG3 DDRG_BIT.BIT3
# define DDR_PG4 DDRG_BIT.BIT4
# define DDR_PG5 DDRG_BIT.BIT5
# define DDR_PG6 DDRG_BIT.BIT6
# define DDR_PG7 DDRG_BIT.BIT7
#endif
/*------------- PIN 位操作定义 -------------*/
#ifdef PINA
# define READ_PA0 PINA_BIT.BIT0
# define READ_PA1 PINA_BIT.BIT1
# define READ_PA2 PINA_BIT.BIT2
# define READ_PA3 PINA_BIT.BIT3
# define READ_PA4 PINA_BIT.BIT4
# define READ_PA5 PINA_BIT.BIT5
# define READ_PA6 PINA_BIT.BIT6
# define READ_PA7 PINA_BIT.BIT7
# define PIN_PA0 PINA_BIT.BIT0
# define PIN_PA1 PINA_BIT.BIT1
# define PIN_PA2 PINA_BIT.BIT2
# define PIN_PA3 PINA_BIT.BIT3
# define PIN_PA4 PINA_BIT.BIT4
# define PIN_PA5 PINA_BIT.BIT5
# define PIN_PA6 PINA_BIT.BIT6
# define PIN_PA7 PINA_BIT.BIT7
#endif
#ifdef PINB
# define READ_PB0 PINB_BIT.BIT0
# define READ_PB1 PINB_BIT.BIT1
# define READ_PB2 PINB_BIT.BIT2
# define READ_PB3 PINB_BIT.BIT3
# define READ_PB4 PINB_BIT.BIT4
# define READ_PB5 PINB_BIT.BIT5
# define READ_PB6 PINB_BIT.BIT6
# define READ_PB7 PINB_BIT.BIT7
# define PIN_PB0 PINB_BIT.BIT0
# define PIN_PB1 PINB_BIT.BIT1
# define PIN_PB2 PINB_BIT.BIT2
# define PIN_PB3 PINB_BIT.BIT3
# define PIN_PB4 PINB_BIT.BIT4
# define PIN_PB5 PINB_BIT.BIT5
# define PIN_PB6 PINB_BIT.BIT6
# define PIN_PB7 PINB_BIT.BIT7
#endif
#ifdef PINC
# define READ_PC0 PINC_BIT.BIT0
# define READ_PC1 PINC_BIT.BIT1
# define READ_PC2 PINC_BIT.BIT2
# define READ_PC3 PINC_BIT.BIT3
# define READ_PC4 PINC_BIT.BIT4
# define READ_PC5 PINC_BIT.BIT5
# define READ_PC6 PINC_BIT.BIT6
# define READ_PC7 PINC_BIT.BIT7
# define PIN_PC0 PINC_BIT.BIT0
# define PIN_PC1 PINC_BIT.BIT1
# define PIN_PC2 PINC_BIT.BIT2
# define PIN_PC3 PINC_BIT.BIT3
# define PIN_PC4 PINC_BIT.BIT4
# define PIN_PC5 PINC_BIT.BIT5
# define PIN_PC6 PINC_BIT.BIT6
# define PIN_PC7 PINC_BIT.BIT7
#endif
#ifdef PIND
# define READ_PD0 PIND_BIT.BIT0
# define READ_PD1 PIND_BIT.BIT1
# define READ_PD2 PIND_BIT.BIT2
# define READ_PD3 PIND_BIT.BIT3
# define READ_PD4 PIND_BIT.BIT4
# define READ_PD5 PIND_BIT.BIT5
# define READ_PD6 PIND_BIT.BIT6
# define READ_PD7 PIND_BIT.BIT7
# define PIN_PD0 PIND_BIT.BIT0
# define PIN_PD1 PIND_BIT.BIT1
# define PIN_PD2 PIND_BIT.BIT2
# define PIN_PD3 PIND_BIT.BIT3
# define PIN_PD4 PIND_BIT.BIT4
# define PIN_PD5 PIND_BIT.BIT5
# define PIN_PD6 PIND_BIT.BIT6
# define PIN_PD7 PIND_BIT.BIT7
#endif
#ifdef PINE
# define READ_PE0 PINE_BIT.BIT0
# define READ_PE1 PINE_BIT.BIT1
# define READ_PE2 PINE_BIT.BIT2
# define READ_PE3 PINE_BIT.BIT3
# define READ_PE4 PINE_BIT.BIT4
# define READ_PE5 PINE_BIT.BIT5
# define READ_PE6 PINE_BIT.BIT6
# define READ_PE7 PINE_BIT.BIT7
# define PIN_PE0 PINE_BIT.BIT0
# define PIN_PE1 PINE_BIT.BIT1
# define PIN_PE2 PINE_BIT.BIT2
# define PIN_PE3 PINE_BIT.BIT3
# define PIN_PE4 PINE_BIT.BIT4
# define PIN_PE5 PINE_BIT.BIT5
# define PIN_PE6 PINE_BIT.BIT6
# define PIN_PE7 PINE_BIT.BIT7
#endif
#ifdef PINF
# define READ_PF0 PINF_BIT.BIT0
# define READ_PF1 PINF_BIT.BIT1
# define READ_PF2 PINF_BIT.BIT2
# define READ_PF3 PINF_BIT.BIT3
# define READ_PF4 PINF_BIT.BIT4
# define READ_PF5 PINF_BIT.BIT5
# define READ_PF6 PINF_BIT.BIT6
# define READ_PF7 PINF_BIT.BIT7
# define PIN_PF0 PINF_BIT.BIT0
# define PIN_PF1 PINF_BIT.BIT1
# define PIN_PF2 PINF_BIT.BIT2
# define PIN_PF3 PINF_BIT.BIT3
# define PIN_PF4 PINF_BIT.BIT4
# define PIN_PF5 PINF_BIT.BIT5
# define PIN_PF6 PINF_BIT.BIT6
# define PIN_PF7 PINF_BIT.BIT7
#endif
#ifdef PING
# define READ_PG0 PING_BIT.BIT0
# define READ_PG1 PING_BIT.BIT1
# define READ_PG2 PING_BIT.BIT2
# define READ_PG3 PING_BIT.BIT3
# define READ_PG4 PING_BIT.BIT4
# define READ_PG5 PING_BIT.BIT5
# define READ_PG6 PING_BIT.BIT6
# define READ_PG7 PING_BIT.BIT7
# define PIN_PG0 PING_BIT.BIT0
# define PIN_PG1 PING_BIT.BIT1
# define PIN_PG2 PING_BIT.BIT2
# define PIN_PG3 PING_BIT.BIT3
# define PIN_PG4 PING_BIT.BIT4
# define PIN_PG5 PING_BIT.BIT5
# define PIN_PG6 PING_BIT.BIT6
# define PIN_PG7 PING_BIT.BIT7
#endif
#endif 我先占个位子,好东西 的却是好东东,佩服 3楼的好强 我记得明明把帖子锁定了阿……
- -b
我才 - -b 呢! 好东西,收了 # define SET_DWORD_DIV_8(Addr) (*((volatile DWORD2HBYTE *)&Addr))
看不明白?能解释一下吗?
傻孩子:你可以下载我书的DEMO,里面有非常详细的解释! mark 能解释#define不带参数的用法吗?是空格吗?
#ifndef _USE_MACRO_AND_CONST_H_
#define _USE_MACRO_AND_CONST_H_
傻孩子:不带参数就是 替换为 空字符,什么是空字符呢,就是什么都没有…… 你牛啊 记号 to 【10楼】 liqu
这个是包含警卫,是为了防止此文件被包含多次的。
(如果此文件被包含多次,又没有警卫的话,编译器会有多次define的错误的)
完整的应该是
#ifndef _USE_MACRO_AND_CONST_H_
#define _USE_MACRO_AND_CONST_H_
...
#endif 请教楼主一个问题,我看瑞萨的头文件是这样定义的,先定义一个结构体,然后给顶地址,这样就可以既可以按位操作又可以按字节操作,十分的方便.我曾在GCC下试过一次这中方式定义AVR的,结果高低位刚好相反,有没有什么方法解决呀.
下面是瑞萨的定义:
struct st_p1 { /* struct P1 */
unsigned char DDR; /* P1DDR */
char wk1; /* */
union { /* P1PORT */
unsigned char BYTE; /*Byte Access */
struct { /*BitAccess */
unsigned char B7:1; /* Bit 7 */
unsigned char B6:1; /* Bit 6 */
unsigned char B5:1; /* Bit 5 */
unsigned char B4:1; /* Bit 4 */
unsigned char B3:1; /* Bit 3 */
unsigned char B2:1; /* Bit 2 */
unsigned char B1:1; /* Bit 1 */
unsigned char B0:1; /* Bit 0 */
} BIT; /* */
} PORT; /* */
char wk2; /* */
union { /* P1DR */
unsigned char BYTE; /*Byte Access */
struct { /*BitAccess */
unsigned char B7:1; /* Bit 7 */
unsigned char B6:1; /* Bit 6 */
unsigned char B5:1; /* Bit 5 */
unsigned char B4:1; /* Bit 4 */
unsigned char B3:1; /* Bit 3 */
unsigned char B2:1; /* Bit 2 */
unsigned char B1:1; /* Bit 1 */
unsigned char B0:1; /* Bit 0 */
} BIT; /* */
} DR; /* */
};
#define P1 (*(volatile struct st_p1 *)0xFFFEB0) /* P1 Address*/ 这种方法是通过union的方式实现与我的头文件相同的功能。至于相反,那是大端对齐与小端对齐的不同导致的。可以通过一个预编译宏来设定。具体请查阅gcc手册。我不使用GCC,所以无法一下给您明确的大案。 先占个位子 谢谢,mark 仔细研究一下,谢谢了 看看 能不能说一下,怎么定义一个标志位么,只有真与假两种情况的也变量 to 【20楼】 yutianyiren
比方说我有16个以内但是大于8个的BOOL型变量想合并在一起,以节省空间。
我们可以首先声明一个占用了两个字节的变量:
UINT16 g_wBoolFlag = NULL;
然后就是利用BIT宏了
# define BOOL_BIT_FLAG SET_BIT16_FORMAT(g_wBoolFlag)
/* 下面我们开始逐个定义这些BOOL型变量 */
# define BOOL_FLAT_A BOOL_BIT_FLAG.BIT0
# define BOOL_FLAG_B BOOL_BIT_FLAG.BIT1
……
对于我们定义的BOOL_FLAGA、BOOL_FLAG_B这样的布尔型变量,只有0个1两个
值,其中0表示FALSE,1表示TRUE。 mark。以后就用上了。 About H
Mark! 好贴! 不MARK一下对不起楼主! 做个记号,以后研究 水平太低了,看不出有什么用。。。。 不错,挺规范的.
# define SET(Reg,n) Reg |= BIT(n);
# define CLR(Reg,n) Reg &= ~BIT(n);
这个BIT是哪个编译器的,而且#和define之间居然可以有空格,真神奇.
我喜欢用如下的关于位操作的宏,通用性比较好.
#define SET_BIT(a,b) (a |= (1<<b))
#define CLR_BIT(a,b) (a &= ~(1<<b))
#define TST_BIT(a,b) (a & (1<<b)) 很繁琐 好东西啊,收藏一下。谢谢楼主无私奉献。 mark~~~ 先记着,回头有空再看 怎么我看里面的很复杂啊。看不懂 牛,就一个字 学习 强 由于Snail C Coding Style 的修正,该贴中提到的基础库文件仅仅用作对2009年之前
的工程进行向前兼容,2009年4月以后,Snail Studio将全面执行新的编码规范,规范草案和对应的基础
库函数将陆续更新。
Snail Studio将全面执行新的编码规范??
什么意思??
请斑竹点一下~!! 有时间好好看看~~ 标记 mark.偶滴鼠标滚轮哇。。。 这贴必需顶…… mark good ~~ mark 好东西啊 牛 mark! 可以引用一些的,谢谢 好东西 租个女友回家过年 mark MARK的 正在看你的深入浅出! 写的不错! mark mark 仔细研究下得。 膜拜中 哎 自己太差 谢谢了 拜拜傻孩子!
又上了一课。 多谢了 正好用到位操作,真是省事多了 union 方法与傻孩子的方法那种更好? 标记学习 mark mark mark 收获不小啊 学习一下哈 mark 需要学习的东西好多啊,头好晕 不错 # define TYPE_CONVERSION(Addr,Type) (*((Type *)(Addr)))
这个怎么使用?
是对变量进行类型转换还是对指针进行类型转换?
我考虑了一种情况:
有变量u8 a = 0x03;
假设a的地址是0x0000 0000,且0x0000 0001单元内是0x01;
那么TYPE_CONVERSION(&a,u16)读出来的值应该是0x0103(具体是0x0103还是0x0301,我也不清楚)吧。 to 【73楼】 ww1228
你的理解没有错……但是别这么用…… 回复【74楼】Gorgon Meducer傻孩子
to 【73楼】 ww1228
你的理解没有错……但是别这么用……
-----------------------------------------------------------------------
这么用会什么陷阱吗?
取模软件输出的数据一般都是8位的,在RGB数据是16位时采用这种方法就很方便哎~ mark mark mark 记号 大智啊 好 榜样 mark mark mark mark # define SELECT_HEX(Value,n,Type) ((Value << (n) * 4) >> ((sizeof(Type) * 8) - 4))
这个宏是怎么用的? 馬克帕克。 终于找到你的基础头文件了
哇哈哈!!!! 各位大侠 小弟有个很菜的问题 楼主上面的库文件 要添加到ICC文件的哪个文件夹 才能在编程时很方便地直接用位操作,不胜感谢!
页:
[1]