用标准的api非常麻烦,DDRX,PORTX,PINX,这3个端口寄存器的X必须对应,硬件发生变化的时候,可能会从A变到B,修改起来非常费劲,下面给出一种解决方案,当然并非完美,因为是有时间损耗的,不过端口变化的情况下,可以自如处理,思路是:把所有端口统一编号,不再重复,如同basic stamp单片机,之后再修改这三组寄存器的时候,接口就能统一了,在执行时,再归到不同的寄存器内。欢迎拍砖
#define UPA0 0
#define UPA1 1
#define UPA2 2
#define UPA3 3
#define UPA4 4
#define UPA5 5
#define UPA6 6
#define UPA7 7
#define UPB0 (0+8)
#define UPB1 (1+8)
#define UPB2 (2+8)
#define UPB3 (3+8)
#define UPB4 (4+8)
#define UPB5 (5+8)
#define UPB6 (6+8)
#define UPB7 (7+8)
#define UPC0 (0+16)
#define UPC1 (1+16)
#define UPC2 (2+16)
#define UPC3 (3+16)
#define UPC4 (4+16)
#define UPC5 (5+16)
#define UPC6 (6+16)
#define UPC7 (7+16)
#define UPD0 (0+24)
#define UPD1 (1+24)
#define UPD2 (2+24)
#define UPD3 (3+24)
#define UPD4 (4+24)
#define UPD5 (5+24)
#define UPD6 (6+24)
#define UPD7 (7+24)
void seUPort(char uport)
{
switch(uport/8)
{
case 0:
PORTA|=(1<<(uport&7));
break;
case 1:
PORTB|=(1<<(uport&7));
break;
case 2:
PORTC|=(1<<(uport&7));
break;
case 3:
PORTD|=(1<<(uport&7));
break;
}
}
void clUPort(char uport)
{
switch(uport/8)
{
case 0:
PORTA&=~(1<<(uport&7));
break;
case 1:
PORTB&=~(1<<(uport&7));
break;
case 2:
PORTC&=~(1<<(uport&7));
break;
case 3:
PORTD&=~(1<<(uport&7));
break;
}
}
void outUPort(char uport)
{
switch(uport/8)
{
case 0:
DDRA|=(1<<(uport&7));
break;
case 1:
DDRB|=(1<<(uport&7));
break;
case 2:
DDRC|=(1<<(uport&7));
break;
case 3:
DDRD|=(1<<(uport&7));
break;
}
}
void inUport(char uport)
{
switch(uport/8)
{
case 0:
DDRA&=~(1<<(uport&7));
break;
case 1:
DDRB&=~(1<<(uport&7));
break;
case 2:
DDRC&=~(1<<(uport&7));
break;
case 3:
DDRD&=~(1<<(uport&7));
break;
}
}
char getUPort(char uport)
{
unsigned char v = 0;
switch(uport/8)
{
case 0:
v = (PINA&(1<<(uport&7)));
break;
case 1:
v = (PINB&(1<<(uport&7)));
break;
case 2:
v = (PINC&(1<<(uport&7)));
break;
case 3:
v = (PIND&(1<<(uport&7)));
break;
}
return v!=0;
}