12F675 发表于 2009-3-29 22:17:51

请高手或版主指教:如何将AVR于IO口高4位与低4位输出分开来?

请高手或版主指教:如何将AVR于IO口高4位与低4位输出分开来?
如AVR PB口有8位,8位同时输出,但高4位是一组数据输出到译码器,而低4位输出不同是按位输出。
如何处理?

z_zt 发表于 2009-3-29 22:34:47

PORTB&=(0xF0)|(你要的四位值<<4);

ilovezeno 发表于 2009-3-29 22:37:57

PB &= 0x0F //PB高四位赋0
PB |= 0xN<<4;//高4位赋值0xN

PB |=1<<3;//第3位单独赋值1

差不多是这样吧?初学者的看法,仅供参考。。。。

ilovezeno 发表于 2009-3-29 22:39:15

1楼的这个好。。。。学习了!

12F675 发表于 2009-3-29 22:43:39

要求高4位按组输出时不影响低4位的状态。
或低4位按组输出时不影响高4位的状态。

ilovezeno 发表于 2009-3-29 22:45:28

这不是显然的么。。。。。。

ilovezeno 发表于 2009-3-29 22:55:21

对了 1楼 应该是PORTB&=(0x0F)|(你要的四位值<<4);吧?

lxx_sea_sky 发表于 2009-3-30 10:04:03

1楼操作有误, PORTB&=??; 能置0,不能置1!
2楼正解.但有个小缺陷:PB &= 0x0F //PB高四位赋0 , PB口会有短暂0电平.
要避免的话,大致可以使用:DDRB = 0xff;PORTB = (PINB&0x0f)|(你要的四位值<<4);

z_zt 发表于 2009-3-31 22:44:46

回ilovezeno 鸣:我的确写错了,应该是PORTB&=(0x0F)|(你要的四位值<<4);
回lxx_sea_sky:PORTB&=??的确只用来清0,但后面有用|置1

funghome 发表于 2009-3-31 23:02:46

mark

lxx_sea_sky 发表于 2009-4-1 09:16:16

赋值运算'&=' 优先级比逻辑运算低.
PORTB&=(0xF0)|(你要的四位值<<4);   等效    PORTB &= ( (0xF0)|(你要的四位值<<4) );

例如: 原先 PORTB=0xcc,执行PORTB &= (0x0f)|(0xa0)后, PORTB=0x8c;

补:我在7楼的回答也不好,PINB 比 PORTB 滞后1个时钟周期; 最佳方式应该是 PORTB = (PORTB&0x0f)|(你要的四位值<<4);

12F675 发表于 2009-4-1 22:17:54

PORTB&=(0xF0)|(你要的四位值<<4); 这是高4位吗?
低4位如何处理?

void_c 发表于 2009-4-1 22:46:45

#include <avr/io.h>

typedef struct
{
   unsigned char l_half:4;
   unsigned char h_half:4
}my_io_struct_t;


#define PORTB_H4 ((volatile my_io_struct_t *)&PORTB)->h_half
#define PORTB_L4 ((volatile my_io_struct_t *)&PORTB)->l_half

int main()
{

PORTB_H4=0x0f;//高四位置1
PORTB_H4=0x00;//高四位清0

PORTB_L4=0x0f;//低四位置1
PORTB_L4=0x00;//低四位清0

   while(1);
}

12F675 发表于 2009-4-2 21:40:10

如果PA口与PB口都这样操作,可以共用结构体吗?
typedef struct
{
   unsigned char l_half:4;
   unsigned char h_half:4
}my_io_struct_t;

a4446570 发表于 2013-2-4 16:43:01

{:handshake:}谢谢。果然好

jz701209李 发表于 2013-2-6 13:13:51

不错,记号一下.....
页: [1]
查看完整版本: 请高手或版主指教:如何将AVR于IO口高4位与低4位输出分开来?