#include <avr/delay.h>
#define DDRB *(volatile uint8_t*)0x24
#define DDRD *(volatile uint8_t*)0x2A
#define PORTD *(volatile uint8_t*)0x2B
#define PORTB *(volatile uint8_t*)0x25
#define PIND *(volatile uint8_t*)0x29
#define PINB *(volatile uint8_t*)0x23
void at328_arduino_io_init(int pin, int dir){
char port;
int bit_index;
if ((pin>=0 && pin<=7)){
port='D';
bit_index=pin;
}
else {
port= 'B';
bit_index=pin-8;
}
if ((dir==0) && (port='D')){
DDRD &= ~(1<<bit_index);
}
else if ((dir ==1) && (port= 'D')){
DDRD |= (1<<bit_index);
}
else if ((dir ==0) && (port= 'B')){
DDRB &= ~(1<<bit_index);
}
else {
DDRB |= (1<<bit_index);
}
}
void at328_arduino_io_write(int pin, int val){
char port;
int bit_index;
if ((pin>=0 && pin<=7)){
port='D';
bit_index=pin;
}
else {
port= 'B';
bit_index=pin-8;
}
if((val==0)&& (port=='B')){
PORTB &= ~(1 << bit_index);
}
else if ((val==0)&&(port=='D')){
PORTD &= ~(1 << bit_index);
}
else if ((val==1)&&(port=='B')){
PORTB |= (1 << bit_index);
}
else{
PORTD |= (1 << bit_index);
}
}
int at328_arduino_io_read(int pin){
char port;
int bit_index;
if ((pin>=0 && pin<=7)){
port='D';
bit_index=pin;
if((PIND & 1<<bit_index)){
return 1;
}
else {
return 0;
}
}
else {
port= 'B';
bit_index=pin-8;
if((PINB & 1<<bit_index)){
return 1;
}
else {
return 0;
}
}
}
int main(){
int pin=10;
int dir=1;
int val;
at328_arduino_io_init(10, 1);
pin=12;
dir=0;
at328_arduino_io_init(12, 0);
while(1){
val=at328_arduino_io_read (12);
at328_arduino_io_write(10, val);
}
return 0;
}