void Main()
{
//-變數宣告區----------------------------
int d = 0; // 宣佈一個控制偏向的變數
// 0:向左 1:向右
int bit = 0; // 宣佈一個儲存LED狀況變數
// 改成記載的幾個 bit
}
else // 向右移動處置懲罰
{
bit--;
if(bit <= 1) { bit = 0; d = 0; }
注意以上兩行紫色的程式,特別在輸出那一行,利用了一個簡單的邏輯運算 OR 就能夠到達將原來一個由右至左的資料 Bit 1 同時複製出一個由左至右的資料 Bit 1 ,將兩各運算使用 OR 運算就能夠組合而成。固然還得做個小潤色,就是當 bit 為 4 期間輸出結果跟 3 是相同的,為了掩蓋這個狀況讓輸出看起來更流通一點,是以就在延遲上做了一點潤色翻譯而如許的設計是有點小技巧,然則筆者要在這邊表達的是,邏輯運算對程式設計是很有用的,特別是初學者必然要領會各類邏輯運算的道理,很多程式設計的時辰,利用簡單的邏輯運算可以大量削減程式碼。固然也要避免使用過於複雜的邏輯運算,恰當的利用可使程式輕易被維護,因為一支寫得好的程式,可以很輕易的再被行使,是以,套一句筆者的師父所說過的話︰程式只要寫一次就夠了。
SystemInit();
//-程式由這邊開始------------------------
首先寫一個霹靂燈的控制體例,先以一個 LED 往返移動,以下是整個程式碼︰
Delay(1000); // 這邊能用的延遲函式呼喚,
// 單元是 萬分之1秒
if(d == 0) // 向左移動處置
{
bit <<= 1;
if(bit == 0x80) d = 1; // 如果已經移到最左
// 則切換偏向
}
else // 向右移動處置
{
bit >>= 1;
if(bit == 0x01) d = 0; // 如果已經移到最右
// 則切換偏向
}
}
//---------------------------------------
while(1); //嵌入式系統不克不及竣事主程式
}
while(1)
{
Led = ~( (0x01 << bit) | (0x80 >> bit) ); // 輸出LED狀況
if(d==0) // 向左移動處置
{
bit++;
if(bit >= 7) { bit = 7; d = 1; }
void Main()
{
//-變數宣告區----------------------------
int d = 0; // 宣佈一個節制方向的變數
// 0:向左 1:向右
int bit = 0; // 宣佈一個貯存LED狀況變數
// 改成紀錄的幾個 bit
以上是一個使用 C 說話做霹靂燈控制最簡單的節制程式,一個無限迴圈結合判定式便可完成翻譯以初學者而言,如許的程式僅考慮到完美的公道狀態,就是 bit 這個變數的運算沒有出錯的可能性,是以假如 bit 變數內的資料若是被其他程式影響到而遺失的話,那可能就沒有一顆 LED 會亮了。當然這不只是可能被其他程式所影響,也有多是電路受到雜訊干擾而造成其他狀態,都有可能使 bit 變數內資料被改變,所以一支具有避免錯誤的程式需要斟酌的問題是良多的,以下將上面程式改用一種比力可靠的體例來改寫。
#include "..INCstdafx.h"
extern void SystemInit(void);
}
}
//---------------------------------------
while(1);//嵌入式系統不克不及結束主程式
}
#define Led (*(volatile U16 *)0xA000000)
void Main()
{
//-變數宣告區----------------------------
int d = 0; // 宣佈一個節制方向的變數
// 0:向左 1:向右
U8 bit = 0x01; // 宣佈一個貯存LED狀態變數
// 0x01最右邊的LED是亮的狀況
Delay(1000); // 這邊能用的延遲函式呼喚,
// 單位是 萬分之1秒
if(d==0) // 向左移動處置懲罰
{
bit++;
if(bit >= 7) { bit = 7; d = 1; }
接著設計一個不一樣的霹靂燈控制體式格局,將本來的 8 個 LED 分成左右各 4 個兩組霹靂燈節制,而燈的移動偏向恰好相反,以下將使用上面的類型簡單的利用邏輯運算來到達如許的效果。
#define Led (*(volatile U16 *)0xA000000)
在做完 LED 根蒂根基控制實行後,固然不會只寫一個單純又沒意思的程式就竣事了,必然要加點 C 說話程式控制技能來做點轉變.這邊就來一個最多見的賽馬燈節制,這應該是學生練習課做單晶片節制時最喜歡玩的一種實驗翻譯一般進修這類 LED 節制歷程大概都是像以下如許的步調︰第一步先學會點亮,第二步控制每一顆的亮跟滅狀況,第三步就是讓一整排動起來,第四步固然就是矩陣掃描控制,不外這邊所利用的實行平台只有一排,所以就玩不到矩陣節制這一步。以下會做出幾種不同的結果來揭示各類單排的 LED 節制體例。
while(1)
{
Led = ~(0x01 << bit); // 輸出LED狀況
}
else // 向右移動處置
{
bit--;
if(bit <= 1) { bit = 0; d = 0; }
#define Led (*(volatile U16 *)0xA000000)
}
}
//---------------------------------------
while(1);//嵌入式系統不克不及結束主程式
}
SystemInit();
//-程式由這邊入手下手------------------------
while(1) // 無限迴圈
{
Led = ~bit; // 輸出LED狀態翻譯社別忘了LED是0為亮
// 所以記得做反相後才能輸出
點竄好的完全程式以下︰
#include "..INCstdafx.h"
extern void SystemInit(void);
if(bit!=4) Delay(1000);
SystemInit();
//-程式由這邊開始------------------------
以上兩支程式的履行結果是一樣的,然則第二支程式已具備防錯概念,因為這支程式在履行時不會因為變數資料遺失而造成程式毛病,比第一支程式更靠得住翻譯不過這只是初步階段的設計考量,對於初學者來說,應當要去漸漸理解其為何如此設計的根本緣由,程式設計者不該該只是會寫程式,而是要真的去理解程式的運行道理跟基礎,熟習實際在硬體上程式該使怎麼樣被履行。如許一個程式設計師可以理解系統的運作概念,因而可以或許設計出更切近系統運作架構的程式,對於產品設計也就可以解少其問題的產生。
#include "..INCstdafx.h"
extern void SystemInit(void);
來自: http://blog.xuite.net/kyanite0909/Blog/61011016-Wiggler+JTAG+%E6%87%89%E7%94%A8%E7%B3%BB%E5%88%97%EF有關各國語文翻譯公證的問題歡迎諮詢天成翻譯公司02-77260931