	
#define GLUE(a, b)  a##b
#define sbi(var, bit) (var|=1<<bit)//set
#define cbi(var, bit) (var&=~(1<<bit))//clear
#define tbi(var, bit) (var^=1<<bit)//toggle
#define gbi(var, bit) (var>>bit&1)//get
#define wait  _delay_ms(1000)
#define wait10  {_delay_ms(3333);_delay_ms(3333);_delay_ms(3333);}
#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define v volatile
#define _BV(x) (1<<x)

#if zucAVR	
#define GLUE(a, b)  a##b
#define PORT(x)    			GLUE(PORT, x)
#define PIN(x)    			GLUE(PIN, x)
#define DDR(x)    			GLUE(DDR, x)
#define pinSET(x,y) 		PORT(x) |=(1<<y)
#define pinCLR(x,y) 		PORT(x)&=~(1<<y)
#define pinTOG(x,y) 		PORT(x)^=(1<<y)
#define pinDIRin(x,y) 		DDR(x)&=~(1<<y)
#define pinDIRout(x,y) 		DDR(x)|=(1<<y)
#define pinVAL(x,y) 		(PIN(x)&(1<<y))
//  #define MINimal(x,y)  ((x<y) ? x : y)
#define pinPULLUP(x,y,z) 	(z)?(PORT(x)|=(1<<y)):(PORT(x)&=~(1<<y))//0_no 1_up 
#define u8x  uint8_t







//_delay_us
#else//notAvr
#define u8x  uint32_t
#define PROGMEM
typedef char PROGMEM prog_char;
#define PGM_P const prog_char *
#define PSTR(s) ((const PROGMEM char *)(s))
#define pgm_read_byte *
#define sei()
#define cli()
/*
void _delay_ms(volatile uint32_t ms) {
u32 ii,j;
j=100000;
while(j){
j--;
}
}*/
void _delay_ms(volatile uint32_t ms) {
uint32_t tmp=ms*F_DELAY;
while(tmp){
tmp-- ;
}
}

void _delay_us(volatile uint32_t us) {
	uint32_t tmp=us*F_DELAY/1000;
while(tmp--)  {  }}
#endif

#if zucSTM32
GPIO_InitTypeDef GPIO_InitStructure;

#define GPIO(x)    GLUE(GPIO, x)
#define RCC_APB2Periph_GPIO(x)    GLUE(RCC_APB2Periph_GPIO, x)
//		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO(x)  , ENABLE);
#define PIN(x)    GLUE(GPIO_PIN_,x)
#define pinSET(x,y) GPIO(x)->ODR |=(1<<y)
#define pinCLR(x,y) GPIO(x)->ODR &=~(1<<y)
#define pinTOG(x,y) GPIO(x)->ODR ^=(1<<y)
//GPIO_InitTypeDef GPIO_InitStructure;
#define pinDIRout(x,y) { \
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
	  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; \
	  GPIO_InitStructure.GPIO_Pin   = 1<<y ; \
	  GPIO_Init(GPIO(x), &GPIO_InitStructure);}

#define pinDIRin(x,y) { \
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; \
	GPIO_InitStructure.GPIO_Pin = 1<<y; \
	GPIO_Init(GPIO(x), &GPIO_InitStructure);}

/*0_no 1_up 2_down*/ 
#define pinPULLUP(x,y,z) { \
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
		if(z==0)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; \
		if(z==1)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; \
		if(z==2)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; \
		GPIO_InitStructure.GPIO_Pin = 1<<y; \
		GPIO_Init(GPIO(x), &GPIO_InitStructure);}
#if 0
GPIO_InitDef.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
    GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
    //Initialize pins
    GPIO_Init(GPIOA, &GPIO_InitDef);
#endif


#define pinVAL(x,y) (GPIO(x)->IDR)&(1<<(y))


#define pinTYPE(x,y) GPIO(x)->OTYPER&=~(3<<(y*2))//
#endif
//################################################################
#if zucLPC176x
#include "c:\zuc\lpc\LPC176x.h"//error #define	RxFliterCtrl #define CCR 2x

#define pinSET(portn,pinn) (*(volatile uint32_t*)(0x2009C018UL+(portn*0x20UL)))|=(1UL<<pinn)
#define pinCLR(portn,pinn) (*(volatile uint32_t*)(0x2009C01CUL+(portn*0x20UL)))|=(1UL<<pinn)
#define pinDIRin(portn,pinn)  (*(volatile uint32_t*)(0x2009C000UL+(portn*0x20UL)))&=~(1UL<<pinn)
#define pinDIRout(portn,pinn) (*(volatile uint32_t*)(0x2009C000UL+(portn*0x20UL)))|=(1UL<<pinn)
#define pinSEL(p,b,v)		PINSEL[(p) * 2 + (b) / 16] = (PINSEL[(p) * 2 + (b) / 16] & ~(3 << ((b) * 2 % 32))) | (v << ((b) * 2 % 32))
#define pinVAL(portn,pinn) ((*(volatile uint32_t*)(0x2009C014UL+(portn*0x20UL))& (1<<pinn))>>pinn)
#define pinTOG(portn,pinn) ((*(volatile uint32_t*)(0x2009C014UL+(portn*0x20UL))^= (1<<pinn)))

#define pinMODE(p,b,v) PINMODE[(p) * 2 + (b) / 16] = (PINMODE[(p) * 2 + (b) / 16] & ~(3 << ((b) * 2 % 32))) | (v << ((b) * 2 % 32))
#define pinOPD(p,b,v) (PINMODE_OD[p] & ~(1 << (b))) | ((v) << (b))
#define mode_pullup   0
#define mode_repeater 1
#define mode_non 		2
#define mode_pulldown 3
#define opd_normal 0
#define opd_opendrain 1


//Kennung cmsis
#ifndef PINSEL
//LPC176x.h-V1.09 fehlt
//#include "LPC176x.h"
Fehler beachten: CCR 2x definiert,
#define pinSEL(p,b,v)		PINSEL[(p) * 2 + (b) / 16] = (PINSEL[(p) * 2 + (b) / 16] & ~(3 << ((b) * 2 % 32))) | (v << ((b) * 2 % 32))

void out_pin_init(char port,char pin){
	pinSEL(port,pin,0);
	pinMODE(port,pin,2);//0_pullup 1_repeater 2_no 3_pulldown
	pinOPD(port,pin,0);//0_normal 1_opendrain
	pinDIRout(port,pin);
	pinSET(port,pin);
}


#endif
#ifndef LPC_PINCON
//LPC17xx.h-V1.09 fehlt
LPC_PINCON_TypeDef LPC_PINCON;
#define pinSEL(p,b,v)		LPC_PINCON->PINSEL[(p) * 2 + (b) / 16] = (LPC_PINCON->PINSEL[(p) * 2 + (b) / 16] & ~(3 << ((b) * 2 % 32))) | (v << ((b) * 2 % 32))

void out_pin_init(char port,char pin){
	pinSEL(port,pin,0);
	pinMODE(port,pin,2);//0_pullup 1_repeater 2_no 3_pulldown
	pinOPD(port,pin,0);//0_normal 1_opendrain
	pinDIRout(port,pin);
	pinSET(port,pin);
}
#endif
#if keil
	PINSEL_CFG_Type PinCfg;
    SSP_CFG_Type SSP_ConfigStruct;
	/*
	 * Initialize SPI pin connect
	 * P0.15 - LCD_CSB - used as GPIO
	 * P0.16 - LCD_SCK
	 * P0.17 - LCD_MISO
	 * P0.18 - LCD_MOSI
	 */
	PinCfg.Funcnum = 2;
	PinCfg.OpenDrain = 0;
	PinCfg.Pinmode = 0;
	PinCfg.Portnum = 0;
	PinCfg.Pinnum = 15;
	PINSEL_ConfigPin(&PinCfg);
	PinCfg.Pinnum = 17;
	PINSEL_ConfigPin(&PinCfg);
	PinCfg.Pinnum = 18;
	PINSEL_ConfigPin(&PinCfg);
#endif



/*
//FEHLENDE LPC176x.h
#define NVIC_SYSTICK_CLK		0x00000004
#define NVIC_SYSTICK_INT		0x00000002
#define NVIC_SYSTICK_ENABLE		0x00000001
#define NVIC_ST_RELOAD (*(volatile uint32_t*)0xE000E014)
#define NVIC_ST_CTRL (*(volatile uint32_t*)0xE000E010)
*/

#endif
//###############################################################//led1
#define led1_tog 	pinTOG(LED1_port,LED1_pin)
#define led1_on   	pinSET(LED1_port,LED1_pin)
#define led1_off   	pinCLR(LED1_port,LED1_pin)
#define led1_blink {led1_tog;_delay_ms(300);led1_tog;_delay_ms(300);led1_tog;\
		_delay_ms(300);led1_tog;_delay_ms(300);}
#define led1_init 	pinDIRout(LED1_port,LED1_pin);led1_blink;

//led2
#define led2_tog 	pinTOG(LED2_port,LED2_pin)
#define led2_on   	pinSET(LED2_port,LED2_pin)
#define led2_off   	pinCLR(LED2_port,LED2_pin)
#define led2_blink {led2_tog;_delay_ms(300);led2_tog;_delay_ms(300);led2_tog;\
		_delay_ms(300);led2_tog;_delay_ms(300);}
#define led2_init 	pinDIRout(LED2_port,LED2_pin);led2_blink;

//pinout
#define led_on  led1_on 
#define led_off led1_off


#define true 1
#define false 0
#define NULL 0

void nothing(void){;}

//================= Globals ====================:

//globals for timers:


volatile u8x  wday, SECalt,min_alt;
#ifndef __LPC176x
volatile u8x sec,min,hou,WDY,DAY,MON,YEA,wday;
#define HOUR 	hou
#define MINUTE 	min
#define SEC 	sec
#else
#define YEA YEAR
#define MON MONTH
#define DAY DOM
#define hou HOUR
#define min MINUTE
#define sec SEC
#endif

u8 bool1=0;
#define schalterProgrammstart 0
#define schalterWDG_Menu	1

//Timer:
v u8 display_timer,i;
volatile uint16_t zl_sec_timer0,zl_sec_wdg,eth_timerkk;
v u16 timer0_neu;
volatile uint32_t TimeTick,TimeTickSec;
 volatile
u32 timer_10ms, timer_sd2,timer_Anzeige;	/* 1kHz decrement timer stopped at zero (disk_timerproc()) */
 volatile uint32_t TimeTick,timer_Anzeige,timer_netactivity;
 
 v u8x Timer1,Timer2;//sd
 u8 buf_zeile3[61]={{'M'}};
//buf_zeile3[61]=0;//,'M','C','_','4','x','6','3','4','5','0','1','2','3','4','5','6','7','8','9',0};

// v u16 test[20];
v u16 messtimer;
 u8 ds1307gefunden;
