HeP028 发表于 2012-10-28 22:49:28

AVR的IO操作感觉没51方便啊。

费劲9牛2虎之力,把数码管点亮了,模拟的SPI,不过在送完一位数据后不加延时,4位数码管亮的也很均匀?请问这是为什么呢?#include <iom128v.h>
#include <macros.h>

unsigned char const codeLED[] = {0X8F,0X4F,0X2F,0X1F};

void PORTinitial(void)
{
        DDRB   = 0XFF;
        PORTB= 0XFF;
        DDRC|=BIT(PC7);
        PORTC &= ~BIT(PC7);
        PORTB |=BIT(PB3);
}

void SPIsendonedata(unsigned char dataSend)
{
        unsigned char i = 0;
        for (i = 0;i < 8;i++)
        {
                if (dataSend & 0x80)                //判断高位
                        {
                                PORTB |=BIT(PB2);               
                        }
                else
                        {
                                PORTB &= ~BIT(PB2);
                        }
                PORTB |=BIT(PB1);
                PORTB &= ~BIT(PB1);
                dataSend <<= 1;
        }
}


void LEDdisplayline(void)
{
        unsigned char i = 0;
        for (i = 0;i < 4;i++)
        {
                PORTB |=0XFF;
                PORTB &=codeLED;
                SPIsendonedata(0X30);
                PORTB |=BIT(PB0);
                PORTB &= ~BIT(PB0);
                //这里不加延时数码管也很亮。请问AVR的特色吗澹?
        }
}

void main(void)
{                          
        PORTinitial();
        while(1)
                {
                        LEDdisplayline();
                }
}

Garbage614 发表于 2012-10-28 22:55:29

好像avr这样的io操作是主流吧,方向、数据、类型……
是不是risc全部都这样

HeP028 发表于 2012-10-28 22:59:40

Garbage614 发表于 2012-10-28 22:55 static/image/common/back.gif
好像avr这样的io操作是主流吧,方向、数据、类型……
是不是risc全部都这样 ...

呵呵,是我太菜了。公司拿回一块板子,51没学好,但也弄了很久突然接触AVR不容易转弯啊~

Garbage614 发表于 2012-10-28 23:03:28

HeP028 发表于 2012-10-28 22:59 static/image/common/back.gif
呵呵,是我太菜了。公司拿回一块板子,51没学好,但也弄了很久突然接触AVR不容易转弯啊~ ...

我也很菜,共同进步!
mega128!性价比太低了,可以试着用stm32

HeP028 发表于 2012-10-28 23:20:14

Garbage614 发表于 2012-10-28 23:03 static/image/common/back.gif
我也很菜,共同进步!
mega128!性价比太低了,可以试着用stm32

半路出家我当成业余爱好玩玩啦,

你说的那芯片太伤脑筋了,或过去与过来的容易迷糊{:lol:}

qwermhb 发表于 2012-10-29 00:14:51

/**********位段**************/
typedef struct
{   unsigned bit0: 1;
    unsigned bit1: 1;
    unsigned bit2: 1;
    unsigned bit3: 1;
    unsigned bit4: 1;
    unsigned bit5: 1;
    unsigned bit6: 1;
    unsigned bit7: 1;
}PBIT;
/* Port A */
#define PINAB      (*(volatile PBIT *)&PINA)
#define DDRAB      (*(volatile PBIT *)&DDRA)
#define PORTAB      (*(volatile PBIT *)&PORTA)

#define          PA_0         PORTAB.bit0
#define          PA_1         PORTAB.bit1
#define          PA_2          PORTAB.bit2
#define          PA_3          PORTAB.bit3
#define          PA_4         PORTAB.bit4
#define          PA_5         PORTAB.bit5
#define          PA_6         PORTAB.bit6
#define          PA_7         PORTAB.bit7


置位直接PA_0=1就行了

hsztc 发表于 2012-10-29 01:02:43

AVR有硬件SPI

coleyao 发表于 2012-10-29 08:08:17

似乎除51外,AVR、MSP430、stm32都差不多。

zuu0 发表于 2012-10-29 08:14:39

编译器用IAR 试试

AVRTDK 发表于 2012-10-29 09:05:49

能够模拟SPI算是不错的了吧。我可以说无数的人模拟不了

leijiayou 发表于 2012-10-29 09:09:21

51习惯了    是不方便

x2816960 发表于 2012-10-29 09:19:25

qwermhb 发表于 2012-10-29 00:14:51 static/image/common/back.gif
/**********位段**************/
typedef struct
{   unsigned bit0: 1;
    unsigned bit1: 1;
    unsi

可以啊,可以把这个加到头文件中,以后就方便了。

zhanan 发表于 2012-10-29 09:27:37

51准双向端口,AVR标准双向端口。

Garbage614 发表于 2012-10-29 10:34:12

HeP028 发表于 2012-10-28 23:20 static/image/common/back.gif
半路出家我当成业余爱好玩玩啦,

你说的那芯片太伤脑筋了,或过去与过来的容易迷糊...

avr位操作也是一样的,与或感觉挺方便,而且还有不好好处

yurinacn 发表于 2012-10-29 10:48:50

用惯了一样,还可以装b{:titter:}{:titter:}

不过除51外的单片机几乎都是这样操作,建议学习。还有助于加深对位操作的理解,而且有些情况会比位操作方便,比如同时给多个端口赋值,比如进行一些移位写出,比如同时反转多个端口。

millwood0 发表于 2012-10-29 21:03:13

If you are used to C51's sbit notation, you may find this helpful:
typedef struct {
        unsigned char B0: 1;
        unsigned char B1: 1;
        unsigned char B2: 1;
        unsigned char B3: 1;
        unsigned char B4: 1;
        unsigned char B5: 1;
        unsigned char B6: 1;
        unsigned char B7: 1;
} BIT8_T;

//extend bit fields
#if defined (PORTA)
#define PORTAbits        (*(volatile BIT8_T *)&PORTA)
#define DDRAbits        (*(volatile BIT8_T *)&DDRA)
#define PINAbits        (*(volatile BIT8_T *)&PINA)
#endif

#if defined (PORTB)
#define PORTBbits        (*(volatile BIT8_T *)&PORTB)
#define DDRBbits        (*(volatile BIT8_T *)&DDRB)
#define PINBbits        (*(volatile BIT8_T *)&PINB)
#endif

#if defined (PORTC)
#define PORTCbits        (*(volatile BIT8_T *)&PORTC)
#define DDRCbits        (*(volatile BIT8_T *)&DDRC)
#define PINCbits        (*(volatile BIT8_T *)&PINC)
#endif

#define _DDR(id, pin)                        DDR ## id ## bits.B ## pin
#define _PORT(id, pin)                        PORT ## id ## bits.B ## pin

//port functions
#define DDR(pin)                                _DDR(pin)
#define PORT(pin)                                _PORT(pin)

#define pinLED B, 5//pinLED on portB.5

      //set pinLED as output
        DDR(pinLED) = 1;

                //set pinLED
                PORT(pinLED) = 1;

                ...
                //flip pinLED
                PORT(pinLED) ^= 1;
I only extended the definitions to PORTA/B/C, but you can easily expand it to cover other ports / registers.

HeP028 发表于 2012-10-30 14:35:04

yurinacn 发表于 2012-10-29 10:48 static/image/common/back.gif
用惯了一样,还可以装b

不过除51外的单片机几乎都是这样操作,建议学习。还有助于加 ...

哈哈,赶上公司有块板子,学习学习。

feixiang1990 发表于 2012-10-30 17:04:14

{:smile:}习惯就好啊

stmmcu 发表于 2012-10-31 16:16:10

51 IO操作是简单,但功能不够强呀
页: [1]
查看完整版本: AVR的IO操作感觉没51方便啊。