搜索
bottom↓
回复: 10

分享一下 关于avr单片机 不同程序IO切换的问题

[复制链接]

出0入0汤圆

发表于 2012-7-11 11:50:03 | 显示全部楼层 |阅读模式
本帖最后由 naiqiqnus 于 2012-7-12 09:38 编辑

经常会碰到这样的事情:
这个项目要用A端口,下个项目要用B端口,资源有限,或者考虑布板图方便,不得不用一些凌乱的IO作为指示灯、继电器输出,若果就几个还好说,当有30多个IO需要调整时,头就大了。

我想到的方法,大家分享一下:

#define sAdd(x,y) x ## y    // 宏命令 合并字符串  举例:sAdd(PORT,A)     等价于  PORTA
#define SetOn(x,y)  sAdd(PORT,x)|=(1<<y)
#define SetOff(x,y) sAdd(PORT,x)&=~(1<<y)
#define SuperSet(x,y,a,b);  {if(x&(1<<y))SetOn(a,b);else SetOff(a,b);}

void OUT_Init(void)
{
        DDRG|=0x1f;
        DDRF|=0xff;
        DDRA|=0xff;
        DDRC|=0xff;
        DDRD|=0xf3;
}

void OUT(unsigned char a[])
{
        SuperSet(a[0],0,G,4);//1-8
        SuperSet(a[0],1,D,0);
        SuperSet(a[0],2,D,1);
        SuperSet(a[0],3,D,4);
        SuperSet(a[0],4,D,5);
        SuperSet(a[0],5,D,6);
        SuperSet(a[0],6,D,7);
        SuperSet(a[0],7,G,0);

        SuperSet(a[1],0,G,1);//9-16
        SuperSet(a[1],1,C,0);
        SuperSet(a[1],2,C,1);
        SuperSet(a[1],3,C,2);
        SuperSet(a[1],4,C,3);
        SuperSet(a[1],5,C,4);
        SuperSet(a[1],6,C,5);
        SuperSet(a[1],7,C,6);

        SuperSet(a[2],0,C,7);//17-24
        SuperSet(a[2],1,G,2);
        SuperSet(a[2],2,A,7);
        SuperSet(a[2],3,A,6);
        SuperSet(a[2],4,A,5);
        SuperSet(a[2],5,A,4);
        SuperSet(a[2],6,A,3);
        SuperSet(a[2],7,A,2);

        SuperSet(a[3],0,A,1);//25-32
        SuperSet(a[3],1,A,0);
        SuperSet(a[3],2,F,7);
        SuperSet(a[3],3,F,6);
        SuperSet(a[3],4,F,5);
        SuperSet(a[3],5,F,4);
        SuperSet(a[3],6,F,3);
        SuperSet(a[3],7,F,2);

        SuperSet(a[4],0,G,3);//0
}



也许你有更好的办法,说出来大家分享一下!

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-7-13 08:49:11 | 显示全部楼层
huayuliang 发表于 2012-7-12 16:50
客气了,可俺用了好几年了,都不知道 token-pasting 是啥意思。。。。

我也不知道,惭愧啊……

出0入0汤圆

发表于 2012-7-12 16:50:00 | 显示全部楼层
客气了,可俺用了好几年了,都不知道 token-pasting 是啥意思。。。。

出0入0汤圆

发表于 2012-7-12 16:46:20 | 显示全部楼层
huayuliang 发表于 2012-7-12 00:12
C 的 preprocessor 里的 token-pasting 运算符。
简单说就是把两个参数连接起来。

谢谢前辈。。。

出0入0汤圆

发表于 2012-7-12 00:12:10 | 显示全部楼层
yklstudent 发表于 2012-7-11 23:11
a##b什么意思 哪位前辈能解释下 啊

C 的 preprocessor 里的 token-pasting 运算符。
简单说就是把两个参数连接起来。

#define _CONCAT(a,b) a##b      // 定义一个宏,把a, b两个参数连接···
#define PORT(x) _CONCAT(PORT,x)      // 利用前面定义的宏,把PORT 和 x 连接

你可以把前面这两行单独定义一个头文件,使用的时候引用进来就OK了

#define PN A         // PN 就是那个x,值为A

#define IO_PORT PORT(PN)  // IO_PORT 得到的就是 PORT 和 A 的连接结果:PORTA

这种方法最简单····

出0入0汤圆

发表于 2012-7-11 23:11:38 | 显示全部楼层
a##b什么意思 哪位前辈能解释下 啊

出0入0汤圆

发表于 2012-7-11 15:47:45 | 显示全部楼层
不错的办法学习

出0入0汤圆

发表于 2012-7-11 14:11:24 | 显示全部楼层
啊哦,怎么插队了。。。。

出0入0汤圆

发表于 2012-7-11 14:10:35 | 显示全部楼层
俺用的方法:
  1. #define _CONCAT(a,b) a##b
  2. #define PORT(x) _CONCAT(PORT,x)
  3. #define PIN(x) _CONCAT(PIN,x)
  4. #define DDR(x) _CONCAT(DDR,x)

  5. #define PN A

  6. #define IO_PORT PORT(PN)
  7. #define IO_DDR   DDR(PN)
  8. #define IO_PIN   PIN(PN)
复制代码

出0入296汤圆

发表于 2012-7-11 13:51:25 | 显示全部楼层
赞一个,从物理映射抽象为线性的逻辑映射。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-20 10:15

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

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