avr端口访问简化处理

来源:互联网 发布:股票盯盘系统公式源码 编辑:程序博客网 时间:2024/04/29 02:16

用标准的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;
}