細數實現流水燈的三種程式碼形式
阿新 • • 發佈:2018-12-14
在上篇博文發出之後,有同學說,程式程式碼太繁瑣了,不如用移位啊,陣列啊一步就搞定了。由於是入門,我們當然是一步一步來了。這裡我們來看一看實現流水燈的三種程式碼書寫形式:
①順序賦值式
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7; /* ********************************************* */ // 函式名稱: Delay() // 函式功能:毫秒延時 /* ********************************************* */ void delay(uint z) { uint x,y; for(x = 0; x < z; x++) for(y = 0; y < 113; y++); } // 函式名稱: main() // 函式功能: 實現一個LED燈一閃一閃的效果 void main(void) { while(1) { LED1 = 0; //燈亮 delay(1000); //持續亮1s LED1 = 1; //燈滅 delay(1000); //持續滅1s LED2 = 0; delay(1000); LED2 = 1; delay(1000); LED3 = 0; delay(1000); LED3 = 1; delay(1000); LED4 = 0; //燈亮 delay(1000); //持續亮1s LED4 = 1; //燈滅 delay(1000); //持續滅1s LED5 = 0; delay(1000); LED5 = 1; delay(1000); LED6 = 0; delay(1000); LED6 = 1; delay(1000); LED7 = 0; delay(1000); LED7 = 1; delay(1000); } }
這個便是我們昨天列出的程式,是的,這個程式程式碼十分冗長,但是這個程式最大的特點就是邏輯簡單,用來入門,以及理解微控制器的控制原理,以及sbit的用法,再合適不過了。這裡對於這段程式碼我們就不多說了。
②移位操作式
#include <reg52.h> #define uint unsigned int /* ********************************************* */ // 函式名稱: delay() // 函式功能:毫秒延時 /* ********************************************* */ void delay(uint z) { uint x,y; for(x = 0; x < z; x++) for(y = 0; y < 113; y++); } /* ***************************************************** */ // 函式名稱:main() // 函式功能:實現流水燈效果 // 入口引數:無 // 出口引數:無 /* ***************************************************** */ void main(void) { int i; //迴圈變數 while(1) { P2 = 0xff; //設定LED燈初始值 delay(1000); for(i = 0;i < 8;i++) { P2 = P2 << 1; //移位、依次點亮 delay(1000); //延時 } } }
這段程式碼較上一段程式碼,很明顯簡明多了,但是邏輯性強了些,下面我們來解釋一下功能函式,以及它的亮點之所在--移位。先說移位,即C語言中的移位運算子,左移運算子<<、右移運算子>>;對於移位運算子,我們簡單地介紹一下,
<< 左移運算子:
移位規則:左邊拋棄,右邊補零
>>右移運算子
移位規則: 左邊用0補充,右邊丟棄;
具體函式來說,首先 賦值語句 P2 = 0xff; 0xff轉換為二進位制即是11111111,八個一,這裡實現的作用便是給P2埠的8個I\O口全部賦高電平1,對於LED燈來說,也就是滅;接著for迴圈,i加1,往左移動一位,隨著補0操作,即實現了對應埠的LED燈點亮,如此迴圈往復,也就實現了流水燈操作。
③陣列賦值式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //陣列
/* ********************************************* */
// 函式名稱: Delay()
// 函式功能:毫秒延時
/* ********************************************* */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函式名稱:main()
// 函式功能:實現流水燈效果
// 入口引數:無
// 出口引數:無
/* ***************************************************** */
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P2 = table[i];
delay(300);
}
}
}