打印
[AVR单片机]

avr studio中要对某一位赋值,该如何宏定义?

[复制链接]
1053|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
j6920|  楼主 | 2015-2-6 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Frank2013| | 2015-2-6 14:38 | 只看该作者
#define LED1_ON  PORTB|=(1<<PB4)
#define LED2_OFF PORTB&=~(1<<PB5)

使用特权

评论回复
板凳
j6920|  楼主 | 2015-2-7 19:51 | 只看该作者
Frank2013 发表于 2015-2-6 14:38
#define LED1_ON  PORTB|=(1

谢谢 ,  有点明白了 。。。。。

使用特权

评论回复
地板
pallee| | 2015-2-7 20:49 | 只看该作者
学习一下。

使用特权

评论回复
5
ccxlslr| | 2015-2-9 11:11 | 只看该作者
#ifndef __BIT_H__
#define __BIT_H__

#include <stdint.h>

/*
*********************************************************************************************************
* 程序配置
*********************************************************************************************************
*/
#define BIT_STAT_EN         0           ///< 位统计编译允许
#define BIT_MAP16_EN        0           ///< 位图数据设置编译允许
#define BIT_REV8_EN         1           ///< 位反转编译允计

/*
*********************************************************************************************************
* 常用位操作宏
*********************************************************************************************************
*/
#define B_V(BIT)                    (1 << (BIT))                    ///< 将指定位置1
#define B_SET(LVALUE, BIT)          (LVALUE |=   1 << (BIT))        ///< 位置1,直接操作指定的位
#define B_CLR(LVALUE, BIT)          (LVALUE &= ~(1 << (BIT)))       ///< 位清0,直接操作指定的位
#define B_REV(LVALUE, BIT)          (LVALUE ^=   1 << (BIT))        ///< 位取反,直接操作指定的位
#define B_SET_MSK(LVALUE, MASK)     (LVALUE |=  (MASK))             ///< 位置1,操作MASK指定的位,可以多位
#define B_CLR_MSK(LVALUE, MASK)     (LVALUE &= ~(MASK))             ///< 位清0,操作MASK指定的位,可以多位
#define B_REV_MSK(LVALUE, MASK)     (LVALUE ^=  (MASK))             ///< 位取反,操作MASK指定的位,可以多位

#define B_CHK(OPERAND, BIT)         ((OPERAND) & 1 << (BIT))        ///< 位检测
#define B_CHK_MSK(OPERAND, MASK)    ((OPERAND) & (MASK))            ///< 位检测,检测MASK指定的位,可以多位

/** \brief 设置指定位的值
*
*   \param      LVALUE      合法的左值表达式,常用为整型变量
*   \param      BIT         要设置的位,根据LVALUE的类型,不能超过其位数的最大值,如LVALUE为32位整型,就不能超过31
*   \param      VALUE       要设置的值,当VALUE为0时,设置相应位的值为0,当VALUE为其它值时,设置相应位的值为1
*/
#define B_SET_BIT(LVALUE, BIT, VALUE) ((VALUE) ? B_SET(LVALUE, (BIT)) : B_CLR(LVALUE, (BIT)))

/** \brief 位图位设置
*
*   以位图方式设置某位的值,值为0置相应位为0,其它值置1
*   \param  MAP     uint16_t指针
*   \param  LOC     要设置的位
*   \param  VALUE   要设置值,0-0,其它-1
*
*   \warning    此宏不检查MAP指针缓冲的边界,LOC设置不当,会造成指针溢出,导致意想不到的后果
*/
#define MAP_BIT16_SET(MAP, LOC, VALUE)  BIT_SET_BIT(MAP[(LOC) / 16], (LOC) % 16, (VALUE))

/** \brief 位图位检查
*
*   以位图方式检查某位的值,单字的位长度为16位。
*   \param  MAP     uint16_t指针
*   \param  LOC     要检查的位
*   \return 检查结果
*   \retval     0       LOC对应位为0
*   \retval     其它    LOC对应位为1  
*   
*   \warning    此宏不检查MAP指针缓冲的边界,LOC设置不当,会造成指针溢出,导致意想不到的后果
*/
#define MAP_BIT16_CHK(MAP, LOC)         (MAP[(LOC) / 16] & (1 << (LOC) % 16))

使用特权

评论回复
6
ningling_21| | 2015-2-9 14:12 | 只看该作者
举例
置位 PORTC |=0x01;

清零 PORTC &=~0x01;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

32

帖子

1

粉丝