struct GPIOF
{
int d : 4;
int a : 1;
int b : 1;
int c : 1;
int res : 25;
};
/*struct GPIOF_1
{
int d : 8;
int a : 2;
int b : 2;
int c : 2;
int res : 18;
};*\
//这个结构体就是4个字节(int)分为32位,d占4位,依次类推。
要得出结构体成员的的值要&后面的(2^n-1)n表示位数。
p->a=1;
出来等于-1 16进制为ffffffff,因为设置那一位后(bit),其他的自动补1.
void delay(volatile int d)
{
while (d--)
;
}
int main(void)
{
unsigned int *pF_CON = (unsigned int *)0x56000050;
unsigned int *pF_DAT = (unsigned int *)0x56000054;
unsigned int *pG_CON = (unsigned int *)0x56000060;
unsigned int *pG_DAT = (unsigned int *)0x56000064;
// struct GPIOF *pF_DAT=(struct GPIO *)0x56000054;
// struct GPIOF *pG_DAT=(struct GPIO *)0x56000064;
// struct GPIOF_1 *pF_CON=(struct GPIOF *)0x56000050;
// struct GPIOF_1 *pG_CON=(struct GPIOF *)0x56000060;
int val1, val2;
unsigned int flag1 = 1, flag2 = 1, flag3 = 1;
*pF_CON &= ~((3 << 8) | (3 << 10) | (3 << 12));
// pF_CON->d=0;
// pF_CON->a=1;
// pF_CON->b=1;
// pF_CON->c=1;
// pF_CON->res=0;
// pG_CON->d=0;
*pF_CON |= ((1 << 8) | (1 << 10) | (1 << 12));
*pF_CON &= ~((3 << 0) | (3 << 4));
*pG_CON &= ~(3 << 6);
// pF_DAT->c=1;
while (1)
{
//*pF_DAT=~0;
//struct GPIOF (*pG_DAT) ={0,0,0,0,0};
val1=(*pF_DAT);
val2=*pG_DAT;
if(val1&(1<<0))
// if (((pF_DAT->a) & 1) & (1 << 0))
flag2 = 1;
if (flag2)
if (!( val1& (1 << 0)))
{
if (flag1)
( (struct GPIOF *)pF_DAT)->c=0;
else
( (struct GPIOF *)pF_DAT)->c=1;
flag1=!flag1;
flag2=!flag2;
}
}
return 0;
}
我还犯了一个特别智障的问题:
强转不是把变量永久变成强转类型,而是把当前变成强转类型。
( (struct GPIOF *)pF_DAT)把当前变成强转结构体指针类型。
后面的pF_DAT还是unsigned int型