ICCAVR中关于C语言移位的问题?

来源:百度知道 编辑:UC知道 时间:2024/05/24 21:47:41
/* EEPROM */
#define EECR (*(volatile unsigned char *)0x3C)
#define EEDR (*(volatile unsigned char *)0x3D)
#define EEARL (*(volatile unsigned char *)0x3E)
#define EEAR (*(volatile unsigned char *)0x3E)

/* EEPROM Control Register */
#define EEPM1 5
#define EEPM0 4
#define EERIE 3
#define EEMWE 2
#define EEWE 1
#define EERE 0
void EEPROM_write(uchar ucaddress,uchar ucdata)
{
while(EECR&1<<EEPE);
{
EECR=((0<<EEPM1)|(0>>EEPM0));
}
EEARL=ucaddress;
EEDR=ucdata;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
}
1、请问这段程序中while(EECR&1<<EEPE);是什么意思?
我可以写成下面这样吗?
while(EECR&BIT(EEPE));

2、请问这段程序中EECR=((0<<EEPM1)|(0>>EEPM0));是什么意思?
能给我说详细一点好吗?

3、请问这段程序中
EECR|=(1<<EEMWE);
EECR|=(1<<E

1.你的EEPE没有定义,如果没有猜错的话是EERE,while(EECR&1<<EEPE);其实应该写为while(EECR&(1<<EERE));表示1左移EERE位(也就是左移0位)之后再与EECR寄存器进行位与运算,也就是判断EERE是否为0,为0则跳出循环
2.如果1你看明白了这条也就懂了,表示0进行左移了EEPM1(左移5位)或上0右移EEPM0位(右移4位),之后的结果给了EECR
3.我不知道你的ICCAVR是否支持BIT函数,如果支持是可以这么写的,上述的内容都是将寄存器的某位置1或置0,再就是判断这位是1还是0,可以根据自己的想法进行编写,但是手册上都是这样给的,因为这样的效率最快