20155308《資訊安全系統設計基礎 嵌入式C語言課堂考試補部落格
知識點
置位
-
?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)
PPT上事例
- 提取位
20155308《資訊安全系統設計基礎 嵌入式C語言課堂考試補部落格 - 插入位
20155308《資訊安全系統設計基礎 嵌入式C語言課堂考試補部落格 - 了解代碼
- 由于Seconds占5位,是以需要先右移5位将Minutes的最低位與位0對齊,再與上3F(0000 0000 0011 1111)即可将6-15位全部清0,則獲得minute部分。
- 0x3F出處為:對于minute一共有6bit,即(111111)2,轉換為16進制即為0x3F;
- 位址的定義
#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位。
#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()
#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
}