欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機入門經驗分享3-通過流水燈講解for循環語句 取反 與或非運算
[打印本頁]
作者:
dabing89
時間:
2018-10-13 08:41
標題:
51單片機入門經驗分享3-通過流水燈講解for循環語句 取反 與或非運算
接上一篇帖子,繼續來看,既然我們會點亮一個小燈,并可以讓其閃爍了,那么我們就嘗試著點亮流水燈好了,讓8個小燈,從左到右,從右往左來回流動,還是在上一個程序的基礎上來修改,很簡單依次賦值即可實現。
while(1)
{
P2 = 0XFE;//1111_1110;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XFD;//1111_1101;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XFB;//1111_1011;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XF7;//1111_0111;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XEF;//1110_1110;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XDF;//1101_1111;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XBF; //1011_1110;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0X7F; //0111_1111;
Delay500ms();//500ms延時 11.0592MHZ
P2 = 0XBF; //1011_1110;
Delay500ms(); //500ms延時 11.0592MHZ
P2 = 0XDF; //1101_1111;
Delay500ms(); //500ms延時 11.0592MHZ
P2 = 0XEF; //1110_1110;
Delay500ms(); //500ms延時 11.0592MHZ
P2 = 0XF7; //1111_0111;
Delay500ms(); //500ms延時 11.0592MHZ
P2 = 0XFB; //1111_0111;
Delay500ms(); //500ms延時 11.0592MHZ
P2 = 0XFD; //1111_1101;
Delay500ms(); //500ms延時 11.0592MHZ
}
復制代碼
這樣弄,雖然很好理解,但是代碼顯得太冗長了,我們接觸下for循環語句,先用for語句來實現我們想要的功能。代碼修改如下:
for(i = 0; i < 8;i++)
{
P2 = ~(0X01 << i);
Delay500ms();//500ms延時 11.0592MHZ
}
for(i = 0; i < 6;i++)
{
P2 = ~(0X40 >> i);
Delay500ms();//500ms延時 11.0592MHZ
}
復制代碼
用了for循環左移和右移的辦法,配合取反實現的,還有一種辦法,更簡單可以實現來回循環,這便是循環左移和循環右移指令
/*******************************************************************
* 文件名 main函數入口
* 描述:
* 功 能
* 作者:大核桃
* 版本號:V1.00(2018.09.17)
********************************************************************/
void main(void)
{
uint8 i = 0;
uint8 temp;
MCU_Port_Init();//端口模式初始化函數
//上電IO默認是0
LED0 = 1;//輸出1
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;//
temp = 0XFE;
while(1)
{
for(i = 0; i < 7;i++)
{
P2 = temp;
temp = _crol_(temp,1);
Delay500ms();//500ms延時 11.0592MHZ
}
for(i = 0; i < 7;i++)
{
P2 = temp;
temp = _cror_(temp,1);
Delay500ms();//500ms延時 11.0592MHZ
}
}
復制代碼
這一節,用到了for循環這個知識點,for語句的用法在C語言課本的第120頁,詳細的了解可以看C語言這本書,我們只列舉一個實際例子來說明C語言的流程,就拿下面的代碼來說吧。
for(i = 0; i < 8;i++)
{
P2 = ~(0X01 << i);
Delay500ms();//500ms延時 11.0592MHZ
}
復制代碼
首先i = 0;是給變量賦初值,i<8是循環條件,i++是變量累加,先來看看i = 0;的時候,這個時候判斷下語句P2 = 0XFE,然后0 < 8條件成立,i++;
// i = 0;的時候
for(i = 0; i < 8;i++)
{
P2 = ~(0X01 << 0);
Delay500ms();//500ms延時 11.0592MHZ
}
// i = 1;的時候
for(i = 0; i < 8;i++)
{
P2 = ~(0X01 << 1);
Delay500ms();//500ms延時 11.0592MHZ
}
復制代碼
當 i= 1;的時候,P2 = 0XFD,依然1<8成立,然后i++;
當 i= 2;的時候,
P2 = 0XFB,依然2<8成立,然后i++;
當 i= 3;的時候,
P2 = 0XF7,依然3<8成立,然后i++;
當 i= 4;的時候,
P2 = 0XEF,依然4<8成立,然后i++;
當 i= 5;的時候,
P2 = 0XDF,依然5<8成立,然后i++;
當 i= 6;的時候,
P2 = 0XBF,依然6<8成立,然后i++;
當 i= 7;的時候,
P2 = 0X7F,依然7<8成立,然后i++;
當 i= 8;的時候,8
<8不成立,跳出循環執行下面的語句;
這樣我們就把for循環的流程給分解了,首先就是賦初值,然后執行循環,循環完之后變量累加,回過頭看條件是否成立,如果條件繼續成立,則繼續循環,累加變量,直到條件不滿足為止。
關于取反符號
~這個符號,可以讀作取反,注意這不是!(非),數字電路中的 &(按位與) , | (
按位
或),!(非)和 &&(邏輯與),||(邏輯或),和~(取反)是不一樣的,按位與顧名思義,是位和位之間運算,他們運算是能夠得出一個具體的結果的,而邏輯與是對左右兩個表達式的真假進行判斷,得出的結果不是真就是假。
關于與或非的真值表
與或非是數字電路最基本的知識點,必須要掌握這個知識點。
&, 就好比乘法一樣,如果A和B都為1,那么結果就是1,如果有一個為0,則輸出都是0,。
|, 就好比加法運算,如果A或者B有一個是1,那么結果就是1,否則就是0;
!, 輸入為0時,輸出為1,輸入為1時,輸出為0;
!|,或非門,只有A和B輸入全部位0時,輸出才為1,否則全為0;
!&,與非門,只有A和B全部輸入為1時,輸出才為0,否則全為1;
異或門,如果A和B相等時,輸出都是0,否則輸出都是1。
好了,今天就到這里吧,明天繼續。。。代碼奉獻上。。。
001 LED點亮.rar
(25.11 KB, 下載次數: 59)
2018-10-13 08:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
002 LED閃爍.rar
(27.56 KB, 下載次數: 51)
2018-10-13 08:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
哈哈我哈哈
時間:
2018-10-13 15:25
真好,感謝樓主
作者:
dabing89
時間:
2018-10-14 14:54
哈哈我哈哈 發表于 2018-10-13 15:25
真好,感謝樓主
謝謝,一起進步
作者:
一片到
時間:
2018-10-15 14:37
有位老師說,盡量不要用延時的習慣。
作者:
dabing89
時間:
2018-10-15 19:37
一片到 發表于 2018-10-15 14:37
有位老師說,盡量不要用延時的習慣。
你說的對,后面我們基本都是用定時器了,延時確實不實用
作者:
yaoming110
時間:
2018-10-18 16:14
收了下
作者:
yaoming110
時間:
2018-10-18 16:14
真好,感謝樓主
作者:
臺風天然粉
時間:
2018-10-30 12:23
延時要的,CPU處理太快了
作者:
vectorxu
時間:
2018-11-1 14:17
真好,感謝樓主
作者:
qiangcn
時間:
2018-11-12 23:29
感謝樓主。講的很好!
作者:
friend114
時間:
2018-12-4 19:27
真好,感謝樓主
作者:
時光倒影
時間:
2018-12-13 11:39
謝謝樓主分享
作者:
2019keil
時間:
2019-1-23 15:04
感謝樓主
作者:
supper戰
時間:
2019-2-16 22:26
不錯不錯,直擊要點
作者:
a89588038
時間:
2019-3-6 11:56
感謝樓主
作者:
zhouqihang
時間:
2019-3-28 20:00
感謝 小白學習
作者:
鵝鵝鵝鵝
時間:
2019-4-8 16:22
真好謝謝
作者:
sugui
時間:
2019-7-9 15:50
太棒了,感謝!
作者:
cphnkj188
時間:
2019-7-24 18:13
真好,講的很透徹,受益匪淺啊!
作者:
木示
時間:
2020-3-19 21:01
感謝分享
作者:
256339
時間:
2020-8-21 15:25
第二組代碼那,i是要小于6嗎,不應該小于7嗎,左移一共要點亮8個燈,右移的時候點亮7個燈,這里沒看懂,希望樓主能解答一下,謝謝、
作者:
Tuier
時間:
2020-12-13 14:26
清晰透徹,初學者的好資料
作者:
aktuan007
時間:
2021-2-9 22:49
樓主沒有講循環移位啊
作者:
szkalwa
時間:
2021-3-13 18:09
是STC單片機嗎,謝謝
作者:
黃sir
時間:
2021-3-28 20:38
這個直接用循環移位函數就好了 ,直接一個循環
作者:
內卷卷
時間:
2021-12-2 16:44
雖然現在不是很理解其中意思,但是很謝謝樓主
作者:
free1sxh
時間:
2022-3-4 23:16
受益匪淺,感謝樓主
作者:
wyl138
時間:
2022-10-31 20:15
樓主提供的學習資料很有用,可惜我沒那么多下載幣,繼續努力!。。
作者:
Longan.Wang
時間:
2022-11-11 17:05
還可以定義數組方式,把所有狀態都存放在數組里,用一個for循環調用就可以了。
這種可擴展性強,把數組定義到程序flash里,擴展狀態數量取決于flash大小。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1