AVR单片机怎么样位操作?比如对PA0写1,对PA1写0,其它引脚不变?

include<iom16V.h>#include<macros.h>#defineLCD_PORTPORTA#defineHI_LCD_A0PORTC|=BIT(0)#... include <iom16V.h>
#include <macros.h>

#define LCD_PORT PORTA

#define HI_LCD_A0 PORTC|=BIT(0)
#define LO_LCD_A0 PORTC&=~BIT(0)
#define HI_LCD_A1 PORTC|=BIT(1)
#define LO_LCD_A1 PORTC&=~BIT(1)
#define HI_LCD_A2 PORTC|=BIT(2)
#define LO_LCD_A2 PORTC&=~BIT(2)
#define HI_LCD_A3 PORTC|=BIT(3)
#define LO_LCD_A3 PORTC&=~BIT(3)
#define HI_LCD_A4 PORTC|=BIT(4)
#define LO_LCD_A4 PORTC&=~BIT(4)
#define HI_LCD_WR PORTC|=BIT(5)
#define LO_LCD_WR PORTC&=~BIT(5)
#define busy PC6

//写X坐标子程序
void write_lcd_x_location(unsigned int wr_dat)
{
HI_LCD_A0;
LO_LCD_A0;
LO_LCD_A3;
LO_LCD_A4;
LO_LCD_A1;
LCD_PORT=(wr_dat&0x00ff); //写低八位
asm("nop");
LO_LCD_WR;

LCD_PORT=((wr_dat>>8)&0x0003); //写高两位
asm("nop");
HI_LCD_WR;

这样写不对吧?
展开
 我来答
夜猫叫枫子
推荐于2016-09-18 · TA获得超过1160个赞
知道小有建树答主
回答量:704
采纳率:0%
帮助的人:490万
展开全部
看你使用什么样的编译器啦,
如果是使用的IAR的,是可以直接位操作的,就像51单片机那样的。

如果是WinAVR的,可以这样子操作

#define SetBit( __port, __bit ) __port |= ( 1<<__bit )
#define ClrBit( __port, __bit ) __port &= ~( 1<<__bit )

对PA0写1 SetBit( PORTA, PA0 )
对PAr1写0 ClrBit( PORTA, PA1 )

这样子就可以了,
追问
我用的是ICCAVR
追答
IICAVR跟WinAVR很相似,那样写没错啊,
BIT是编译器提供的一个宏来的
#define BIT( __bit ) ( 1<<__bit )
凌珑井
2012-04-16 · TA获得超过856个赞
知道小有建树答主
回答量:585
采纳率:0%
帮助的人:465万
展开全部
#define PA0 0
#define PA1 1

PORTA |= 1<<PA0;//写1
PORTA &= ~(1<<PA1);//写0
追问
谢谢您的回答,我现在是PB0-PB4分别接的LCD 的A0-A4,
要求是PB=0000 1101 或者PB=0000 0101 或PB=0000 0010,该怎么控制?
我现在用的指令是:比如想让PB=XXXX 001X ; PORTB&=0B11100001;
PORTB|=0B00000100;
追答
PB=XXXX 001X: 
PORTB &= ~(0x07 << 1);
PORTB |= 1 << 1;

其实么都一样的,通过公式么,你可以把一些参数直接放公式里去,可操作性,可读性强一点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
I多多问题多多
2012-04-25 · TA获得超过379个赞
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:101万
展开全部
BIT()是个宏 你可以看看源文件
PORTA |= 1<<0;//PORTA的bit0写1
PORTA &= ~(1<<0);//PORTA的bit0写0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式