请高手或版主指教:如何将AVR于IO口高4位与低4位输出分开来?
请高手或版主指教:如何将AVR于IO口高4位与低4位输出分开来?如AVR PB口有8位,8位同时输出,但高4位是一组数据输出到译码器,而低4位输出不同是按位输出。
如何处理? PORTB&=(0xF0)|(你要的四位值<<4); PB &= 0x0F //PB高四位赋0
PB |= 0xN<<4;//高4位赋值0xN
PB |=1<<3;//第3位单独赋值1
差不多是这样吧?初学者的看法,仅供参考。。。。 1楼的这个好。。。。学习了! 要求高4位按组输出时不影响低4位的状态。
或低4位按组输出时不影响高4位的状态。 这不是显然的么。。。。。。 对了 1楼 应该是PORTB&=(0x0F)|(你要的四位值<<4);吧? 1楼操作有误, PORTB&=??; 能置0,不能置1!
2楼正解.但有个小缺陷:PB &= 0x0F //PB高四位赋0 , PB口会有短暂0电平.
要避免的话,大致可以使用:DDRB = 0xff;PORTB = (PINB&0x0f)|(你要的四位值<<4); 回ilovezeno 鸣:我的确写错了,应该是PORTB&=(0x0F)|(你要的四位值<<4);
回lxx_sea_sky:PORTB&=??的确只用来清0,但后面有用|置1 mark 赋值运算'&=' 优先级比逻辑运算低.
PORTB&=(0xF0)|(你要的四位值<<4); 等效 PORTB &= ( (0xF0)|(你要的四位值<<4) );
例如: 原先 PORTB=0xcc,执行PORTB &= (0x0f)|(0xa0)后, PORTB=0x8c;
补:我在7楼的回答也不好,PINB 比 PORTB 滞后1个时钟周期; 最佳方式应该是 PORTB = (PORTB&0x0f)|(你要的四位值<<4); PORTB&=(0xF0)|(你要的四位值<<4); 这是高4位吗?
低4位如何处理? #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);
} 如果PA口与PB口都这样操作,可以共用结构体吗?
typedef struct
{
unsigned char l_half:4;
unsigned char h_half:4
}my_io_struct_t; {:handshake:}谢谢。果然好 不错,记号一下.....
页:
[1]