搜索
bottom↓
回复: 18

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

[复制链接]

出0入0汤圆

发表于 2012-10-28 22:49:28 | 显示全部楼层 |阅读模式
费劲9牛2虎之力,把数码管点亮了,模拟的SPI,不过在送完一位数据后不加延时,4位数码管亮的也很均匀?请问这是为什么呢?
  1. #include <iom128v.h>
  2. #include <macros.h>

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

  4. void PORTinitial(void)
  5. {
  6.         DDRB   = 0XFF;
  7.         PORTB  = 0XFF;
  8.         DDRC  |=  BIT(PC7);
  9.         PORTC &= ~BIT(PC7);
  10.         PORTB |=  BIT(PB3);
  11. }

  12. void SPIsendonedata(unsigned char dataSend)
  13. {
  14.         unsigned char i = 0;
  15.         for (i = 0;i < 8;i++)
  16.         {
  17.                 if (dataSend & 0x80)                //判断高位
  18.                         {
  19.                                 PORTB |=  BIT(PB2);               
  20.                         }
  21.                 else
  22.                         {
  23.                                 PORTB &= ~BIT(PB2);
  24.                         }
  25.                 PORTB |=  BIT(PB1);
  26.                 PORTB &= ~BIT(PB1);
  27.                 dataSend <<= 1;
  28.         }
  29. }


  30. void LEDdisplayline(void)
  31. {
  32.         unsigned char i = 0;
  33.         for (i = 0;i < 4;i++)
  34.         {
  35.                 PORTB |=  0XFF;
  36.                 PORTB &=  codeLED[i];
  37.                 SPIsendonedata(0X30);
  38.                 PORTB |=  BIT(PB0);
  39.                 PORTB &= ~BIT(PB0);
  40.                 //这里不加延时数码管也很亮。请问AVR的特色吗澹?
  41.         }
  42. }

  43. void main(void)
  44. {                          
  45.         PORTinitial();
  46.         while(1)
  47.                 {
  48.                         LEDdisplayline();
  49.                 }
  50. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-28 22:55:29 | 显示全部楼层
好像avr这样的io操作是主流吧,方向、数据、类型……
是不是risc全部都这样

出0入0汤圆

 楼主| 发表于 2012-10-28 22:59:40 | 显示全部楼层
Garbage614 发表于 2012-10-28 22:55
好像avr这样的io操作是主流吧,方向、数据、类型……
是不是risc全部都这样 ...

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

出0入0汤圆

发表于 2012-10-28 23:03:28 | 显示全部楼层
HeP028 发表于 2012-10-28 22:59
呵呵,是我太菜了。公司拿回一块板子,51没学好,但也弄了很久突然接触AVR不容易转弯啊~ ...

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

出0入0汤圆

 楼主| 发表于 2012-10-28 23:20:14 | 显示全部楼层
Garbage614 发表于 2012-10-28 23:03
我也很菜,共同进步!
mega128!性价比太低了,可以试着用stm32

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

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

出0入0汤圆

发表于 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就行了

出0入0汤圆

发表于 2012-10-29 01:02:43 | 显示全部楼层
AVR有硬件SPI

出0入0汤圆

发表于 2012-10-29 08:08:17 | 显示全部楼层
似乎除51外,AVR、MSP430、stm32都差不多。

出0入0汤圆

发表于 2012-10-29 08:14:39 | 显示全部楼层
编译器用IAR 试试

出0入0汤圆

发表于 2012-10-29 09:05:49 来自手机 | 显示全部楼层
能够模拟SPI算是不错的了吧。我可以说无数的人模拟不了

出0入0汤圆

发表于 2012-10-29 09:09:21 | 显示全部楼层
51习惯了    是不方便

出0入0汤圆

发表于 2012-10-29 09:19:25 来自手机 | 显示全部楼层
qwermhb 发表于 2012-10-29 00:14:51
/**********位段**************/
typedef struct
{   unsigned bit0: 1;
    unsigned bit1: 1;
    unsi

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

出0入0汤圆

发表于 2012-10-29 09:27:37 | 显示全部楼层
51准双向端口,AVR标准双向端口。

出0入0汤圆

发表于 2012-10-29 10:34:12 | 显示全部楼层
HeP028 发表于 2012-10-28 23:20
半路出家我当成业余爱好玩玩啦,

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

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

出0入0汤圆

发表于 2012-10-29 10:48:50 | 显示全部楼层
用惯了一样,还可以装b

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

出0入0汤圆

发表于 2012-10-29 21:03:13 | 显示全部楼层
If you are used to C51's sbit notation, you may find this helpful:

  1. typedef struct {
  2.         unsigned char B0: 1;
  3.         unsigned char B1: 1;
  4.         unsigned char B2: 1;
  5.         unsigned char B3: 1;
  6.         unsigned char B4: 1;
  7.         unsigned char B5: 1;
  8.         unsigned char B6: 1;
  9.         unsigned char B7: 1;
  10. } BIT8_T;

  11. //extend bit fields
  12. #if defined (PORTA)
  13. #define PORTAbits        (*(volatile BIT8_T *)&PORTA)
  14. #define DDRAbits        (*(volatile BIT8_T *)&DDRA)
  15. #define PINAbits        (*(volatile BIT8_T *)&PINA)
  16. #endif

  17. #if defined (PORTB)
  18. #define PORTBbits        (*(volatile BIT8_T *)&PORTB)
  19. #define DDRBbits        (*(volatile BIT8_T *)&DDRB)
  20. #define PINBbits        (*(volatile BIT8_T *)&PINB)
  21. #endif

  22. #if defined (PORTC)
  23. #define PORTCbits        (*(volatile BIT8_T *)&PORTC)
  24. #define DDRCbits        (*(volatile BIT8_T *)&DDRC)
  25. #define PINCbits        (*(volatile BIT8_T *)&PINC)
  26. #endif

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

  29. //port functions
  30. #define DDR(pin)                                _DDR(pin)
  31. #define PORT(pin)                                _PORT(pin)

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

  33.         //set pinLED as output
  34.         DDR(pinLED) = 1;

  35.                 //set pinLED
  36.                 PORT(pinLED) = 1;

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

出0入0汤圆

 楼主| 发表于 2012-10-30 14:35:04 | 显示全部楼层
yurinacn 发表于 2012-10-29 10:48
用惯了一样,还可以装b

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

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

出0入0汤圆

发表于 2012-10-30 17:04:14 | 显示全部楼层
习惯就好啊

出0入0汤圆

发表于 2012-10-31 16:16:10 | 显示全部楼层
51 IO操作是简单,但功能不够强呀
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表