2 * \author Maarten Brock
\r
4 * This library is free software; you can redistribute it and/or
\r
5 * modify it under the terms of the GNU Lesser General Public
\r
6 * License as published by the Free Software Foundation; either
\r
7 * version 2.1 of the License, or (at your option) any later version.
\r
9 * This library is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
12 * Lesser General Public License for more details.
\r
14 * You should have received a copy of the GNU Lesser General Public
\r
15 * License along with this library; if not, write to the Free Software
\r
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
18 * In other words, you are welcome to use, share and improve this program.
\r
19 * You are forbidden to forbid anyone else to use, share and improve
\r
20 * what you give them. Help stamp out software-hoarding!
\r
22 * Header file to overcome 8051 compiler differences for specifying
\r
23 * special function registers. The following compilers are supported:
\r
24 * SDCC, Keil, Raisonance, IAR, Hi-Tech, Tasking, Crossware, Wickenhäuser.
\r
25 * Unfortunately not for use with Dunfield.
\r
27 * SBIT and SFR define special bit and special function registers at the given
\r
28 * address. SFR16 and SFR32 define sfr combinations at adjacent addresses in
\r
29 * little-endian format. SFR16E and SFR32E define sfr combinations without
\r
30 * prerequisite byte order or adjacency. None of these multi-byte sfr
\r
31 * combinations will guarantee the order in which they are accessed when read
\r
33 * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined
\r
34 * to avoid portability issues because of compiler endianness.
\r
35 * This file is to be included in every microcontroller specific header file.
\r
38 * // my_mcu.h: sfr definitions for my mcu
\r
39 * #include <compiler.h>
\r
41 * SBIT (P0_1, 0x80, 1); // Port 0 pin 1
\r
43 * SFR (P0, 0x80); // Port 0
\r
45 * SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in xdata memory at 0xE600
\r
47 * SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD
\r
49 * SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C
\r
51 * SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96
\r
53 * SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5
\r
60 /** SDCC - Small Device C Compiler
\r
61 * http://sdcc.sf.net
\r
64 # define SBIT(name, addr, bit) __sbit __at(addr+bit) name
\r
65 # define SFR(name, addr) __sfr __at(addr) name
\r
66 # define SFRX(name, addr) xdata volatile unsigned char __at(addr) name
\r
67 # define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name
\r
68 # define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name
\r
69 # define SFR32(name, addr) __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name
\r
70 # define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name
\r
73 * http://www.keil.com
\r
75 #elif defined __CX51__
\r
76 # define SBIT(name, addr, bit) sbit name = addr^bit
\r
77 # define SFR(name, addr) sfr name = addr
\r
78 # define SFRX(name, addr) volatile unsigned char xdata name _at_ addr
\r
79 # define SFR16(name, addr) sfr16 name = addr
\r
80 # define SFR16E(name, fulladdr) /* not supported */
\r
81 # define SFR32(name, fulladdr) /* not supported */
\r
82 # define SFR32E(name, fulladdr) /* not supported */
\r
85 * http://www.raisonance.com
\r
87 #elif defined __RC51__
\r
88 # define SBIT(name, addr, bit) at (addr+bit) sbit name
\r
89 # define SFR(name, addr) sfr at addr name
\r
90 # define SFRX(name, addr) xdata at addr volatile unsigned char name
\r
91 # define SFR16(name, addr) sfr16 at addr name
\r
92 # define SFR16E(name, fulladdr) /* not supported */
\r
93 # define SFR32(name, fulladdr) /* not supported */
\r
94 # define SFR32E(name, fulladdr) /* not supported */
\r
97 * http://www.iar.com
\r
99 #elif defined __ICC8051__
\r
100 # define SBIT(name, addr, bit) __bit __no_init volatile bool name @ (addr+bit)
\r
101 # define SFR(name, addr) __sfr __no_init volatile unsigned char name @ addr
\r
102 # define SFRX(name, addr) __xdata __no_init volatile unsigned char name @ addr
\r
103 # define SFR16(name, addr) __sfr __no_init volatile unsigned int name @ addr
\r
104 # define SFR16E(name, fulladdr) /* not supported */
\r
105 # define SFR32(name, fulladdr) __sfr __no_init volatile unsigned long name @ addr
\r
106 # define SFR32E(name, fulladdr) /* not supported */
\r
108 /** Tasking / Altium
\r
109 * http://www.altium.com/tasking
\r
111 #elif defined _CC51
\r
112 # define SBIT(name, addr, bit) _sfrbit name _at(addr+bit)
\r
113 # define SFR(name, addr) _sfrbyte name _at(addr)
\r
114 # define SFRX(name, addr) _xdat volatile unsigned char name _at(addr)
\r
115 # define SFR16(name, addr) /* not supported */
\r
116 # define SFR16E(name, fulladdr) /* not supported */
\r
117 # define SFR32(name, fulladdr) /* not supported */
\r
118 # define SFR32E(name, fulladdr) /* not supported */
\r
121 * http://www.htsoft.com
\r
123 #elif defined HI_TECH_C
\r
124 # define SBIT(name, addr, bit) volatile bit name @ (addr+bit)
\r
125 # define SFR(name, addr) volatile unsigned char name @ addr
\r
126 # define SFRX(name, addr) volatile far unsigned char name @ addr
\r
127 # define SFR16(name, addr) /* not supported */
\r
128 # define SFR16E(name, fulladdr) /* not supported */
\r
129 # define SFR32(name, fulladdr) /* not supported */
\r
130 # define SFR32E(name, fulladdr) /* not supported */
\r
133 * http://www.crossware.com
\r
135 #elif defined _XC51_VER
\r
136 # define SBIT(name, addr, bit) _sfrbit name = (addr+bit)
\r
137 # define SFR(name, addr) _sfr name = addr
\r
138 # define SFRX(name, addr) volatile unsigned char _xdata name _at addr
\r
139 # define SFR16(name, addr) _sfrword name = addr
\r
140 # define SFR16E(name, fulladdr) /* not supported */
\r
141 # define SFR32(name, fulladdr) /* not supported */
\r
142 # define SFR32E(name, fulladdr) /* not supported */
\r
145 * http://www.wickenhaeuser.de
\r
147 #elif defined __UC__
\r
148 # define SBIT(name, addr, bit) unsigned char bit name @ (addr+bit)
\r
149 # define SFR(name, addr) near unsigned char name @ addr
\r
150 # define SFRX(name, addr) xdata volatile unsigned char name @ addr
\r
151 # define SFR16(name, addr) /* not supported */
\r
152 # define SFR16E(name, fulladdr) /* not supported */
\r
153 # define SFR32(name, fulladdr) /* not supported */
\r
154 # define SFR32E(name, fulladdr) /* not supported */
\r
160 # warning unknown compiler
\r
161 # define SBIT(name, addr, bit) volatile bool name
\r
162 # define SFR(name, addr) volatile unsigned char name
\r
163 # define SFRX(name, addr) volatile unsigned char name
\r
164 # define SFR16(name, addr) volatile unsigned short name
\r
165 # define SFR16E(name, fulladdr) volatile unsigned short name
\r
166 # define SFR32(name, fulladdr) volatile unsigned long name
\r
167 # define SFR32E(name, fulladdr) volatile unsigned long name
\r
171 #endif //COMPILER_H
\r