dat=(j<<7)|(dat>>1)詳解:
//讀一位數據(讀位程序)
1unsigned char tmpreadbit(void) //read a bit
2{
3 unsigned char dat;
4 DS_OUT(); //端口設置爲輸出
5 DS_L(); //DS=0
6 //Delayn(1); //2uS
7 DS_IN(); //input
8 //Delayn(1);
9 if(DS_R()!=0)
10 dat=1;
11 else
12 dat=0;
13 DelaynUs(50);
14 return (dat);
15}
//讀一個字節數據 (讀字節程序)
16unsigned char tmpread(void) //read a byte date
17{
18 unsigned char i,j,dat;
19 dat=0; //令dat初始值爲0,代碼23處將會用到
20 for(i=1;i<=8;i++)
21 {
22 j=tmpreadbit();
23 dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT裏
24 }
25 return(dat);
26}
任意取一個字節,本文以1011 1010爲例
首先由讀位程序讀取第7位1,執行22得j=1,執行23得dat=1xxx xxxx, 詳解如下:
j<<7得到1xxx xxxx
dat>>1得到0xxx xxxx(注意:dat初始值爲0,即代碼19)
然後執行|(位或)運算,得到dat=1xxx xxxx
然後由讀位程序讀取第6位0,執行22得j=0,執行23得dat=01xx xxxx 詳解如下:
j<<7得到0xxx xxxx
dat>>1得到01xx xxxx(此時,dat的值不再是0,而是上一步得到的1xxx xxxx)
然後執行|(位或)運算,得到dat=01xx xxxx
剩餘位的計算方法同上,故略去......................
最終主機讀到的字節數據是0101 1101 ,最低位在最前面