首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Atmel C销操作宏

Atmel C销操作宏
EN

Stack Overflow用户
提问于 2014-09-22 23:27:11
回答 1查看 5K关注 0票数 2

所以我已经用Atmel C编程了一段时间,我已经习惯了所有的C位操作,所以现在我想把它隐藏起来。我想隐藏位操作,这不仅使我的代码更具可读性,而且使维护和修改变得更容易,以防我们的硬件更改或者我们制造了新的硬件。

所以我想问你,对于基本的引脚操作,Atmel C最好的宏是什么。

我要寻找的特征是:

  1. 将Pin设置为输入或输出
  2. 设置输出针高或低
  3. 读取输入针的值

因此,我找到了一些宏,我可以使用,但没有一个真正适合我的议案。

链接:

o.html (每个引脚仍需保留多个定义)

macro.html (不编译,AVRStudio6.2)

Changing a global variable in C (最好的一个,在"/* LCD定义*/“下面的问题顶部。)

我真正想要的是这样的:

代码语言:javascript
复制
#define LED1      PA1
#define BUTTON1   PB0



set_output(LED1);
output_high(LED1);
delay_ms(100);
output_low(LED1);


set_input(BUTTON1);
uint8_t tmpVal = get_input(BUTTON1);
if( tmpVal == 1 )
{
    // assuming button IS pressed here
}
else
{
    // assuming button IS NOT pressed here
}

对最干净的方法有什么想法吗?

我可以处理保持更多的定义每针,但我觉得这是不应该需要的。PA1和PB0不应该告诉我们所有的事情吗,或者它们是否被定义为一个值?

编辑:在上使用Atmel Studio6.2

谢谢你,罗伯。

EN

回答 1

Stack Overflow用户

发布于 2014-09-23 03:50:13

不过,这确实编译了

macro.html

代码语言:javascript
复制
// MACROS FOR EASY PIN HANDLING FOR ATMEL GCC-AVR
//these macros are used indirectly by other macros , mainly for string concatination
#define _SET(type,name,bit)          type ## name  |= _BV(bit)    
#define _CLEAR(type,name,bit)        type ## name  &= ~ _BV(bit)        
#define _TOGGLE(type,name,bit)       type ## name  ^= _BV(bit)    
#define _GET(type,name,bit)          ((type ## name >> bit) &  1)
#define _PUT(type,name,bit,value)    type ## name = ( type ## name & ( ~ _BV(bit)) ) | ( ( 1 & (unsigned char)value ) << bit )

//these macros are used by end user
#define OUTPUT(pin)         _SET(DDR,pin)    
#define INPUT(pin)          _CLEAR(DDR,pin)    
#define HIGH(pin)           _SET(PORT,pin)
#define LOW(pin)            _CLEAR(PORT,pin)    
#define TOGGLE(pin)         _TOGGLE(PORT,pin)    
#define READ(pin)           _GET(PIN,pin)

/*
    BASIC STAMPS STYLE COMMANDS FOR ATMEL GCC-AVR

    Usage Example:
    ———————————————–
    #define pinLed B,5  //define pins like this

    OUTPUT(pinLed);       //typo fixed
    //OUTPUT(pinLED);     //compiles as DDRB |= (1<<5);
    HIGH(pinLed);         //compiles as PORTB |= (1<<5);
    ———————————————–
*/

只有一个错误是我修过的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25984587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档