?bits = bits | (1 << 7) ; /* sets bit 7 */
安全
bits |= (1 << 7) ; /* sets bit 7 */
#define SET_BIT (n,bits) do{bits |= (1<<n)}while(0)
設計
bits &= ~(1 << 7) ; /* clears bit 7 */
#define CLR_BIT (n,bits) do{bits &=~ (1<<n)}while(0)
bits ^= (1 << 6) ; /* flips bit 6 */
#define FLIP_BIT (n,bits) do{bits ^= (1<<n)}while(0)
提取位
code
插入位
blog
#define DATA_Addr 0x0C00000 #define DATA *(volatile int *)(DATA_Addr) DATA = 0x1234;
#define Time_Addr 0xFFFFC0000 //實時鐘芯片的IO映像基址是OxFFFFC0000 #define TIME *(volatile int *)(Time_Addr+2) //時間存放在基址+2的寄存器中 void SetMinutes(int minutes) //插入Minutes { int oldtime=TIME; int newtime; newtime=oldtime&~(0x3F<<5); newtime|=(minutes&0x3F)<<5; TIME=newtime; } int getMinutes() //取出Minutes { int time=TIME; return (time>>5)&0x3F; }
因爲Seconds佔5位,Minutes佔6位,所以須要先右移11位將Hours的最低位與位0對齊,再與上1F(0000 0000 0001 1111)便可將5-15位所有清0從而取出Hours的所有5位。ip
#define Time_Addr 0xFFFFC0000 //實時鐘芯片的IO映像基址是OxFFFFC0000 #define TIME *(volatile int *)(Time_Addr+2) //時間存放在基址+2的寄存器中 void SetHours(int hours) //插入Hours { int oldtime=TIME; int newtime; newtime=oldtime&~(0x1F<<11); newtime|=(hours&0x1F)<<11; TIME=newtime; } int getHours() //取出Hours { int time=TIME; return (time>>11)&0x1F; }
void SetSeconds(int seconds)
int Getseconds()get
#define Time_Addr 0xFFFFC0000 //實時鐘芯片的IO映像基址是OxFFFFC0000 #define TIME *(volatile int *)(Time_Addr+2) //時間存放在基址+2的寄存器中 void SetHours(int hours) //插入Hours void SetSeconds(int seconds) //插入Seconds { int oldtime=TIME; int newtime; newtime=oldtime&~0x1F; newtime|=(seconds/2)&0x1F; TIME=newtime; } int getSeconds() //取出Seconds { int time=TIME; return (time&0x1F)*2; //此處不考慮Seconds除2帶來的偏差,所以直接乘2 }