#define ppm_in_pin 2
#define ppm_pulseIn 4
unsigned int RC_count = 0;
unsigned int PPM_HIGH = 0;
void RC_in() {
RC_count++;
}
void setup()
{
DDRB = DDRB | 0X1F ;
DDRD = DDRD | 0XE0 ;
Serial.begin(57600);
pinMode(ppm_in_pin, INPUT_PULLUP);
pinMode(ppm_pulseIn, INPUT);
attachInterrupt(0, RC_in, RISING); //上升沿觸發中斷
}
void RC_valout() {
switch ( RC_count ) {
//第一通道
case 0: {
PORTD = PORTD & 0X1F; //PD后三位清零
PORTD = PORTD | 0X20;//PD5輸出高電平
PORTB = PORTB & 0XE0; //PB前五位清零
}; break;
//第二通道PD6
case 1: {
PORTD = PORTD & 0X1F; //PD后三位清零
PORTD = PORTD | 0X40; //PD6輸出高電平
PORTB = PORTB & 0XE0; //PB前五位清零
}; break;
//第三通道PD7
case 2: {
PORTD = PORTD & 0X1F; //PD后三位清零
PORTD = PORTD | 0X80; //PD7輸出高電平
PORTB = PORTB & 0XE0; //PB前五位清零
}; break;
//第四通道PB0
case 3: {
PORTD = PORTD & 0X1F; //PD后三位清零
PORTB = PORTB & 0XE0; //PB前五位清零
PORTB = PORTB | 0X01; //PB0輸出高電平
}; break;
//第五通道PB1
case 4: {
PORTB = PORTB & 0XE0; //PB前五位清零
PORTB = PORTB | 0X02; //PB1輸出高電平
}; break;
//第六通道PB2
case 5: {
PORTB = PORTB & 0XE0; //PB前五位清零
PORTB = PORTB | 0X04; //PB2輸出高電平
}; break;
//第七通道PB3
case 6: {
PORTB = PORTB & 0XE0; //PB前五位清零
PORTB = PORTB | 0X08; //PB3輸出高電平
}; break;
//第八通道PB4
case 7: {
PORTB = PORTB & 0XE0; //PB前五位清零
PORTB = PORTB | 0X10; //PB4輸出高電平
}; break;
case 8: {
PORTB = PORTB & 0XE0; //PB前五位清零
PORTD = PORTD & 0X1F; //PD后三位清零
}; break;
}
}
void loop()
{
PPM_HIGH = pulseIn(ppm_pulseIn, HIGH);
if (PPM_HIGH > 3000) {
RC_count = 0;
}
RC_valout();
}
|