[英]C Read char as binary
這實際上是我正在使用avr進行的項目的一部分。 我通過twi與DS1307實時時鍾IC接口。 它以一系列8個字符的形式報告信息。 它以以下格式返回:
// Second : ds1307[0]
// Minute : ds1307[1]
// Hour : ds1307[2]
// Day : ds1307[3]
// Date : ds1307[4]
// Month : ds1307[5]
// Year : ds1307[6]
我想做的是花費時間的每一部分,並一點一點地閱讀它。 我想不出辦法。 如果該位為1,則基本上點亮LED,但如果為0,則不點亮。
我以為有一種相當簡單的方法可以通過位移位來做到這一點,但是我無法完全理解這樣做的邏輯。
可以使用一個簡單的表達式來檢查是否設置了N位:
(bitmap & (0x1 << N)) != 0
其中,位圖是包含位的整數值(例如,您的情況下為64位)。
查找秒:
(bitmap & 0xFF)
查找分鍾:
(bitmap & 0xFF00) >> 8
查找時間:
(bitmap & 0xFF0000) >> 16
如果我正確地解釋了您的內容,則以下內容將對所有位進行從低到高的迭代。 也就是說,每秒的8位,然后是分鍾的8位,依此類推。
unsigned char i, j;
for (i = 0; i < sizeof(ds1307); i++)
{
unsigned char value = ds1307[i]; // seconds, minutes, hours etc
for (j = 0; j < 8; j++)
{
if (value & 0x01)
{
// bit is 1
}
else
{
// bit is 0
}
value >>= 1;
}
}
是的-您可以使用>>
將這些位右移一位,並使用& 1
獲得最低有效位的值:
unsigned char ds1307[7];
int i, j;
for (i = 0; i < 7; i++)
for (j = 0; j < 8; j++)
printf("byte %d, bit %d = %u\n", i, j, (ds1307[i] >> j) & 1U);
(這將檢查從最低到最高的位。順便說一下,示例數組只有7個字節,而不是8個字節。)
本質上,如果將以二進制格式顯示秒的6個LED連接到PORTA2-PORTA7,則可以使PORTA = ds1307[0]
以使秒自動正確點亮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.