Click here to Skip to main content
15,891,529 members
Articles / Desktop Programming / MFC

A PIC C Code Wizard

Rate me:
Please Sign up or sign in to vote.
4.94/5 (27 votes)
5 May 2003CPOL5 min read 156.2K   7.9K   46  
Creates C code templates for PIC microcontrollers. The default templates are for use with the Hi-Tech (tm) PICC compiler.
#if !defined(_TYPEDEFS_H_)
#define _TYPEDEFS_H_

#ifdef _WIN32
typedef unsigned __int8		UBYTE;
typedef signed __int8		SBYTE;
typedef unsigned __int8		UINT8;
typedef signed __int8		SINT8;
typedef unsigned __int16	UINT16;
typedef signed __int16		SINT16;
#if !defined(_WIN32)
typedef unsigned __int32	UINT32;
#endif
typedef signed __int32		SINT32;
typedef float				DOUBLE24;
typedef float				DOUBLE32;
#else // for PICC
typedef unsigned char		UBYTE;
typedef signed char			SBYTE;
typedef unsigned char		UINT8;
typedef signed char			SINT8;
typedef unsigned int		UINT16;
typedef signed int			SINT16;
typedef unsigned long		UINT32;
typedef signed long			SINT32;
typedef float				DOUBLE24;
typedef double				DOUBLE32;
#endif

// sleep
#define SLEEP_CONTINUE			0
#define SLEEP_WAKEUP			1

// macros
#define TIMER0_COUNTER_LIMIT	625
#define TIMER0_OFFSET			131
#define TIMER1_COUNTER_LIMIT	10
#define TIMER1_OFFSET			3036
#define TIMER2_COUNTER_LIMIT	0
#define TIMER2_OFFSET			0

// tasks
typedef void(*TASK_FUNCTION)(void);
#define TASKS_LIMIT_MASK		3
#define TASKS_LIMIT				TASKS_LIMIT_MASK + 1
#define TASKS_ADD(x)			tasks.funcs[tasks.ui8_Counter++] = x
#define TASKS_CHECK_LIMIT()		tasks.ui8_Counter &= TASKS_LIMIT_MASK
#define TASKS_ARE_THERE_MORE	tasks.ui8_Counter
#define TASKS_IS_NOT_NULL()		tasks.funcs[--tasks.ui8_Counter]
#define TASKS_EXECUTE()			tasks.funcs[tasks.ui8_Counter]()

typedef struct tagTASKS {
	TASK_FUNCTION	funcs[TASKS_LIMIT];
	UBYTE			ui8_Counter;
}TASKS;

#define ADC_SIGNALS		6

typedef enum ADCSIGNALS {
	ADC_CH0_ui16_A,
	ADC_CH1_ui16_B,
	ADC_CH2_ui16_C,
	ADC_CH0_ui16_AA,
	ADC_CH1_ui16_BB,
	ADC_CH2_ui16_CC,
}ADCSIGNAL;

typedef struct tagADC {
	UBYTE	ui8_Index;
	UINT16	ui16_Signal[ADC_SIGNALS];
	UBYTE	ui8_Channel[ADC_SIGNALS];
}ADC;

// RS232
#define RS232_BUFFER_LIMIT_MASK	15
#define RS232_BUFFER_LIMIT		RS232_BUFFER_LIMIT_MASK+1

typedef struct tagRS232 {
	UBYTE	ui8_Index;
	UBYTE	ui8_Buffer[RS232_BUFFER_LIMIT];
}RS232;

typedef enum RS232COMMANDS {
	RS232_CMD_REBOOT = 1,
	RS232_CMD_VERSIONID,
	RS232_CMD_DAQ,
	RS232_CMD_ADCREAD,
	RS232_CMD_EEPROMWRITE,
	RS232_CMD_EEPROMREAD,
	RS232_CMD_USER1,
	RS232_CMD_USER2,
	RS232_CMD_USER3,
	RS232_CMD_USER4,
	RS232_CMD_USER5,
}RS232COMMAND;

// misc
#define HighByte(x)	(*(((UBYTE*)(&x))+1))
#define LowByte(x)	(*(((UBYTE*)(&x))))
#define TRUE		1
#define FALSE		0
#define ENABLE		1
#define DISABLE		0
#define SET			1
#define CLEAR		0
#define ON			1
#define OFF			0
#define IO_OUTPUT	0
#define IO_INPUT	1

//port A
#define PORT_A_IO					TRISA
#define PORT_A_IO_SET(x)			PORT_A_IO = x
#define PORT_A						PORTA
#define PORT_A_SET(x)				PORT_A = x
#define PORT_A_0					RA0
#define PORT_A_1					RA1
#define PORT_A_2					RA2
#define PORT_A_3					RA3
#define PORT_A_4					RA4
#define PORT_A_5					RA5
#define PORT_A_6					RA6
#define PORT_A_7					RA7
#define PORT_A_0_SET(x)				PORT_A_0 = x
#define PORT_A_1_SET(x)				PORT_A_1 = x
#define PORT_A_2_SET(x)				PORT_A_2 = x
#define PORT_A_3_SET(x)				PORT_A_3 = x
#define PORT_A_4_SET(x)				PORT_A_4 = x
#define PORT_A_5_SET(x)				PORT_A_5 = x
#define PORT_A_6_SET(x)				PORT_A_6 = x
#define PORT_A_7_SET(x)				PORT_A_7 = x
#define PORT_A_IO_0					TRISA0
#define PORT_A_IO_1					TRISA1
#define PORT_A_IO_2					TRISA2
#define PORT_A_IO_3					TRISA3
#define PORT_A_IO_4					TRISA4
#define PORT_A_IO_5					TRISA5
#define PORT_A_IO_6					TRISA6
#define PORT_A_IO_7					TRISA7
#define PORT_A_IO_0_SET(x)			PORT_A_IO_0 = x
#define PORT_A_IO_1_SET(x)			PORT_A_IO_1 = x
#define PORT_A_IO_2_SET(x)			PORT_A_IO_2 = x
#define PORT_A_IO_3_SET(x)			PORT_A_IO_3 = x
#define PORT_A_IO_4_SET(x)			PORT_A_IO_4 = x
#define PORT_A_IO_5_SET(x)			PORT_A_IO_5 = x
#define PORT_A_IO_6_SET(x)			PORT_A_IO_6 = x
#define PORT_A_IO_7_SET(x)			PORT_A_IO_7 = x

//port B
#define PORT_B_IO					TRISB
#define PORT_B_IO_SET(x)			PORT_B_IO = x
#define PORT_B						PORTB
#define PORT_B_SET(x)				PORT_B = x
#define PORT_B_0					RB0
#define PORT_B_1					RB1
#define PORT_B_2					RB2
#define PORT_B_3					RB3
#define PORT_B_4					RB4
#define PORT_B_5					RB5
#define PORT_B_6					RB6
#define PORT_B_7					RB7
#define PORT_B_0_SET(x)				PORT_B_0 = x
#define PORT_B_1_SET(x)				PORT_B_1 = x
#define PORT_B_2_SET(x)				PORT_B_2 = x
#define PORT_B_3_SET(x)				PORT_B_3 = x
#define PORT_B_4_SET(x)				PORT_B_4 = x
#define PORT_B_5_SET(x)				PORT_B_5 = x
#define PORT_B_6_SET(x)				PORT_B_6 = x
#define PORT_B_7_SET(x)				PORT_B_7 = x
#define PORT_B_IO_0					TRISB0
#define PORT_B_IO_1					TRISB1
#define PORT_B_IO_2					TRISB2
#define PORT_B_IO_3					TRISB3
#define PORT_B_IO_4					TRISB4
#define PORT_B_IO_5					TRISB5
#define PORT_B_IO_6					TRISB6
#define PORT_B_IO_7					TRISB7
#define PORT_B_IO_0_SET(x)			PORT_B_IO_0 = x
#define PORT_B_IO_1_SET(x)			PORT_B_IO_1 = x
#define PORT_B_IO_2_SET(x)			PORT_B_IO_2 = x
#define PORT_B_IO_3_SET(x)			PORT_B_IO_3 = x
#define PORT_B_IO_4_SET(x)			PORT_B_IO_4 = x
#define PORT_B_IO_5_SET(x)			PORT_B_IO_5 = x
#define PORT_B_IO_6_SET(x)			PORT_B_IO_6 = x
#define PORT_B_IO_7_SET(x)			PORT_B_IO_7 = x

//port C
#define PORT_C_IO					TRISC
#define PORT_C_IO_SET(x)			PORT_C_IO = x
#define PORT_C						PORTC
#define PORT_C_SET(x)				PORT_C = x
#define PORT_C_0					RC0
#define PORT_C_1					RC1
#define PORT_C_2					RC2
#define PORT_C_3					RC3
#define PORT_C_4					RC4
#define PORT_C_5					RC5
#define PORT_C_6					RC6
#define PORT_C_7					RC7
#define PORT_C_0_SET(x)				PORT_C_0 = x
#define PORT_C_1_SET(x)				PORT_C_1 = x
#define PORT_C_2_SET(x)				PORT_C_2 = x
#define PORT_C_3_SET(x)				PORT_C_3 = x
#define PORT_C_4_SET(x)				PORT_C_4 = x
#define PORT_C_5_SET(x)				PORT_C_5 = x
#define PORT_C_6_SET(x)				PORT_C_6 = x
#define PORT_C_7_SET(x)				PORT_C_7 = x
#define PORT_C_IO_0					TRISC0
#define PORT_C_IO_1					TRISC1
#define PORT_C_IO_2					TRISC2
#define PORT_C_IO_3					TRISC3
#define PORT_C_IO_4					TRISC4
#define PORT_C_IO_5					TRISC5
#define PORT_C_IO_6					TRISC6
#define PORT_C_IO_7					TRISC7
#define PORT_C_IO_0_SET(x)			PORT_C_IO_0 = x
#define PORT_C_IO_1_SET(x)			PORT_C_IO_1 = x
#define PORT_C_IO_2_SET(x)			PORT_C_IO_2 = x
#define PORT_C_IO_3_SET(x)			PORT_C_IO_3 = x
#define PORT_C_IO_4_SET(x)			PORT_C_IO_4 = x
#define PORT_C_IO_5_SET(x)			PORT_C_IO_5 = x
#define PORT_C_IO_6_SET(x)			PORT_C_IO_6 = x
#define PORT_C_IO_7_SET(x)			PORT_C_IO_7 = x

//port D
#define PORT_D_IO					TRISD
#define PORT_D_IO_SET(x)			PORT_D_IO = x
#define PORT_D						PORTD
#define PORT_D_SET(x)				PORT_D = x
#define PORT_D_0					RD0
#define PORT_D_1					RD1
#define PORT_D_2					RD2
#define PORT_D_3					RD3
#define PORT_D_4					RD4
#define PORT_D_5					RD5
#define PORT_D_6					RD6
#define PORT_D_7					RD7
#define PORT_D_0_SET(x)				PORT_D_0 = x
#define PORT_D_1_SET(x)				PORT_D_1 = x
#define PORT_D_2_SET(x)				PORT_D_2 = x
#define PORT_D_3_SET(x)				PORT_D_3 = x
#define PORT_D_4_SET(x)				PORT_D_4 = x
#define PORT_D_5_SET(x)				PORT_D_5 = x
#define PORT_D_6_SET(x)				PORT_D_6 = x
#define PORT_D_7_SET(x)				PORT_D_7 = x
#define PORT_D_IO_0					TRISD0
#define PORT_D_IO_1					TRISD1
#define PORT_D_IO_2					TRISD2
#define PORT_D_IO_3					TRISD3
#define PORT_D_IO_4					TRISD4
#define PORT_D_IO_5					TRISD5
#define PORT_D_IO_6					TRISD6
#define PORT_D_IO_7					TRISD7
#define PORT_D_IO_0_SET(x)			PORT_D_IO_0 = x
#define PORT_D_IO_1_SET(x)			PORT_D_IO_1 = x
#define PORT_D_IO_2_SET(x)			PORT_D_IO_2 = x
#define PORT_D_IO_3_SET(x)			PORT_D_IO_3 = x
#define PORT_D_IO_4_SET(x)			PORT_D_IO_4 = x
#define PORT_D_IO_5_SET(x)			PORT_D_IO_5 = x
#define PORT_D_IO_6_SET(x)			PORT_D_IO_6 = x
#define PORT_D_IO_7_SET(x)			PORT_D_IO_7 = x

//port E
#define PORT_E_IO					TRISE
#define PORT_E_IO_SET(x)			PORT_E_IO = x
#define PORT_E						PORTE
#define PORT_E_SET(x)				PORT_E = x
#define PORT_E_0					RE0
#define PORT_E_1					RE1
#define PORT_E_2					RE2
#define PORT_E_3					RE3
#define PORT_E_4					RE4
#define PORT_E_5					RE5
#define PORT_E_6					RE6
#define PORT_E_7					RE7
#define PORT_E_0_SET(x)				PORT_E_0 = x
#define PORT_E_1_SET(x)				PORT_E_1 = x
#define PORT_E_2_SET(x)				PORT_E_2 = x
#define PORT_E_3_SET(x)				PORT_E_3 = x
#define PORT_E_4_SET(x)				PORT_E_4 = x
#define PORT_E_5_SET(x)				PORT_E_5 = x
#define PORT_E_6_SET(x)				PORT_E_6 = x
#define PORT_E_7_SET(x)				PORT_E_7 = x
#define PORT_E_IO_0					TRISE0
#define PORT_E_IO_1					TRISE1
#define PORT_E_IO_2					TRISE2
#define PORT_E_IO_3					TRISE3
#define PORT_E_IO_4					TRISE4
#define PORT_E_IO_5					TRISE5
#define PORT_E_IO_6					TRISE6
#define PORT_E_IO_7					TRISE7
#define PORT_E_IO_0_SET(x)			PORT_E_IO_0 = x
#define PORT_E_IO_1_SET(x)			PORT_E_IO_1 = x
#define PORT_E_IO_2_SET(x)			PORT_E_IO_2 = x
#define PORT_E_IO_3_SET(x)			PORT_E_IO_3 = x
#define PORT_E_IO_4_SET(x)			PORT_E_IO_4 = x
#define PORT_E_IO_5_SET(x)			PORT_E_IO_5 = x
#define PORT_E_IO_6_SET(x)			PORT_E_IO_6 = x
#define PORT_E_IO_7_SET(x)			PORT_E_IO_7 = x

// interrupts
#define INTERRUPT_GLOBAL				GIE
#define INTERRUPT_GLOBAL_DISABLE()		INTERRUPT_GLOBAL = DISABLE;
#define INTERRUPT_GLOBAL_ENABLE()		INTERRUPT_GLOBAL = ENABLE;
#define INTERRUPT_PERIPHERAL			PEIE
#define INTERRUPT_PERIPHERAL_ENABLE()	INTERRUPT_PERIPHERAL = ENABLE
#define INTERRUPT_PERIPHERAL_DISABLE()	INTERRUPT_PERIPHERAL = DISABLE

//timer0 defines
#define TIMER0						TMR0
#define TIMER0_EVENT				T0IE
#define TIMER0_EVENT_FLAG			T0IF
#define TIMER0_EVENT_FLAG_CLEAR()	TIMER0_EVENT_FLAG = CLEAR
#if !defined(_WIN32)
#define TIMER0_SET(x)				TIMER0 = x
#define TIMER0_EVENT_ENABLE()		TIMER0_EVENT = ENABLE
#define TIMER0_EVENT_DISABLE()		TIMER0_EVENT = DISABLE
#endif

//timer1 defines
#define TIMER1						timer1_clone
#define TIMER1_CONTROL				T1CON
#define TIMER1_EVENT				TMR1IE
#define TIMER1_EVENT_FLAG			TMR1IF
#define TIMER1_EVENT_FLAG_CLEAR()	TIMER1_EVENT_FLAG = CLEAR
#define TIMER1_DISABLE()			TIMER1_CONTROL &= 0xFE
#define TIMER1_ENABLE()				TIMER1_CONTROL |= 0x01
#if !defined(_WIN32)
#define TIMER1_SET(x)				timer1_clone = x
#define TIMER1_EVENT_ENABLE()		TIMER1_EVENT = ENABLE
#define TIMER1_EVENT_DISABLE()		TIMER1_EVENT = DISABLE
#endif

//timer2 defines
#define TIMER2						TMR2
#define TIMER2_CONTROL				T2CON
#define TIMER2_ENABLE()				TIMER2_CONTROL |= 0x04
#define TIMER2_DISABLE()			TIMER2_CONTROL &= 0xFB
#define TIMER2_EVENT				TMR2IE
#define TIMER2_EVENT_ENABLE()		TIMER2_EVENT = ENABLE
#define TIMER2_EVENT_DISABLE()		TIMER2_EVENT = DISABLE
#define TIMER2_EVENT_FLAG			TMR2IF
#define TIMER2_EVENT_FLAG_CLEAR()	TIMER2_EVENT_FLAG = CLEAR

//ccp1 defines
#define CCP1_CONTROL				CCP1CON
#define CCP1_EVENT					CCP1IE
#define CCP1_EVENT_ENABLE()			CCP1_EVENT = ENABLE
#define CCP1_EVENT_DISABLE()		CCP1_EVENT = DISABLE
#define CCP1_EVENT_FLAG				CCP1IF
#define CCP1_EVENT_FLAG_CLEAR()		CCP1_EVENT_FLAG = CLEAR
#define CCP1_PWM_IO_SET()			PORT_C_IO_2_SET(IO_OUTPUT)

//ccp2 defines
#define CCP2_CONTROL				CCP2CON
#define CCP2_EVENT					CCP2IE
#define CCP2_EVENT_ENABLE()			CCP2_EVENT = ENABLE
#define CCP2_EVENT_DISABLE()		CCP2_EVENT = DISABLE
#define CCP2_EVENT_FLAG				CCP2IF
#define CCP2_EVENT_FLAG_CLEAR()		CCP2_EVENT_FLAG = CLEAR
#define CCP2_PWM_IO_SET()			PORT_C_IO_1_SET(IO_OUTPUT)

//rs232 defines
#define RS232_RX_EVENT				RCIE
#define RS232_RX_EVENT_ENABLE()		RS232_RX_EVENT = ENABLE
#define RS232_RX_EVENT_DISABLE()	RS232_RX_EVENT = DISABLE
#define RS232_RX_EVENT_FLAG			RCIF
#define RS232_RX_EVENT_FLAG_CLEAR()	RS232_RX_EVENT_FLAG = CLEAR
#define RS232_RX_DATA				RCREG
#define RS232_RX_ERROR_OVERFLOW		OERR
#define RS232_RX_ERROR_FRAMING		FERR
#define RS232_RX_CONTINUOUS			CREN
#define RS232_RX_CONTINUOUS_ON()	RS232_RX_CONTINUOUS = ON
#define RS232_RX_CONTINUOUS_OFF()	RS232_RX_CONTINUOUS = OFF
#define RS232_BAUDRATE_CONTROL		SPBRG
#define RS232_BAUDRATE_SET(x)		RS232_BAUDRATE_CONTROL = x
#define RS232_RX_CONTROL			RCSTA
#define RS232_RX_SET(x)				RS232_RX_CONTROL = x
#define RS232_TX_CONTROL			TXSTA
#define RS232_TX_SET(x)				RS232_TX_CONTROL = x

//INT external interrupt (RB0)
#define INT_EXT_EDGE_ON_RISING					1
#define INT_EXT_EDGE_ON_FALLING					0
#define INTERRUPT_EXTERNAL_EVENT				INTE
#define INTERRUPT_EXTERNAL_EDGE					INTEDG
#define INTERRUPT_EXTERNAL_EVENT_FLAG			INTF
#define INTERRUPT_EXTERNAL_EVENT_FLAG_CLEAR()	INTERRUPT_EXTERNAL_EVENT_FLAG = CLEAR
#define INTERRUPT_EXTERNAL_EDGE_SET(x)			INTERRUPT_EXTERNAL_EDGE = x
#define INTERRUPT_EXTERNAL_EDGE_RISING()		INTERRUPT_EXTERNAL_EDGE_SET(INT_EXT_EDGE_ON_RISING)
#define INTERRUPT_EXTERNAL_EDGE_FALLING()		INTERRUPT_EXTERNAL_EDGE_SET(INT_EXT_EDGE_ON_FALLING)
#define INTERRUPT_EXTERNAL_EVENT_ENABLE()		INTERRUPT_EXTERNAL_EVENT = ENABLE
#define INTERRUPT_EXTERNAL_EVENT_DISABLE()		INTERRUPT_EXTERNAL_EVENT = DISABLE

//RB7:RB4 change interrupt
#define INTERRUPT_PORTB_EVENT					RBIE
#define INTERRUPT_PORTB_EVENT_FLAG				RBIF
#define INTERRUPT_PORTB_EVENT_FLAG_CLEAR()		INTERRUPT_PORTB_EVENT_FLAG = CLEAR
#define INTERRUPT_PORTB_EVENT_ENABLE()			INTERRUPT_PORTB_EVENT = ENABLE
#define INTERRUPT_PORTB_EVENT_DISABLE()			INTERRUPT_PORTB_EVENT = DISABLE

//ADC
#define ADC_AUTO				255
#define ADRES					ADRESH
#define ADC_CH0					0x00
#define ADC_CH1					0x08
#define ADC_CH2					0x10
#define ADC_CH3					0x18
#define ADC_CH4					0x20
#define ADC_CH5					0x28
#define ADC_CH6					0x30
#define ADC_CH7					0x38
#define ADC_EVENT				ADIE
#define ADC_EVENT_FLAG			ADIF
#define ADC_EVENT_ENABLE()		ADC_EVENT = ENABLE
#define ADC_EVENT_DISABLE()		ADC_EVENT = DISABLE
#define ADC_EVENT_FLAG_CLEAR()	ADC_EVENT_FLAG = CLEAR

// software implementation of I2C
// SDA (data) and SCL (clock) bits
#define	I2C_SCL				(UBYTE)PORT_C_3
#define	I2C_SCL_DIR			PORT_C_IO_3
#define	I2C_SDA				(UBYTE)PORT_C_3
#define	I2C_SDA_DIR			PORT_C_IO_3
#define I2C_ERROR			(UBYTE)0xFF
#define I2C_OUTPUT			0
#define I2C_INPUT			1

#define I2C_SCL_HIGH() 			I2C_SCL_DIR = I2C_INPUT
#define I2C_SCL_LOW()  			I2C_SCL_DIR = I2C_OUTPUT
#define I2C_SDA_HIGH() 			I2C_SDA_DIR = I2C_INPUT
#define I2C_SDA_LOW()  			I2C_SDA_DIR = I2C_OUTPUT
#define I2C_DELAY_1uS_20MHz()	asm("goto $+1"); asm("goto $+1"); asm("nop")
#if OSC_FREQUENCY <= 4000000UL
#define I2C_DELAY_1uS()			asm("nop")
#elif OSC_FREQUENCY <= 8000000UL
#define I2C_DELAY_1uS()			asm("goto $+1")
#elif OSC_FREQUENCY <= 16000000UL
#define I2C_DELAY_1uS()			asm("goto $+1");asm("goto $+1")
#else
#define I2C_DELAY_1uS()			asm("goto $+1");asm("goto $+1");asm("nop")
#endif

#endif // _TYPEDEFS_H_

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Delphi
United States United States
Carlos Buelna works in the automotive industry.

Comments and Discussions