標(biāo)題: 4位數(shù)碼管單片機(jī)程序最后的語(yǔ)句求大神解釋一波! [打印本頁(yè)]
作者: ZFDPJ 時(shí)間: 2017-11-30 02:40
標(biāo)題: 4位數(shù)碼管單片機(jī)程序最后的語(yǔ)句求大神解釋一波!
這是一個(gè)4位數(shù)碼管程序 程序最后的語(yǔ)句
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > 0) {
previousMillis = currentMillis;
中 previousMillis前面一直沒(méi)有定義和賦值,為啥可以使用?
還有
for(int a=0;a<4;a++) //循環(huán)寫位碼,任何時(shí)刻只有1位數(shù)碼管選通,之前全部關(guān)閉,然后再選通需要的那位數(shù)碼管
digitalWrite(segPins[a],1);//
digitalWrite(segPins[ i],0);//
deal(displayTemp[ i]);//讀取對(duì)應(yīng)的段碼值
i++;
if(i==4) //4位結(jié)束后重新循環(huán)
i=0;
}
中for 循環(huán)體沒(méi)有用{ } 括起來(lái)為啥可以正常編譯?if也同樣
大神指導(dǎo)一下!
int ledCount=8;
int segCount=4;
long previousMillis = 0;
//定義段碼,這里是共陰段碼,可以使用數(shù)碼管段碼軟件改變數(shù)組值或者任意顯示形狀const unsigned char dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//位碼
//unsigned char const dofly_WeiMa[]={0,1,2,3};
int ledPins[] = {
12,8,5, 3, 2, 11, 6, 4, }; // 11,7,4,2,1,10,5,3 注釋是數(shù)碼管實(shí)際引腳數(shù),和芯片一樣,逆時(shí)針數(shù)
int segPins[] = {
13,10,9,7
};
unsigned char displayTemp[4];//顯示緩沖區(qū)
void setup() {
// 循環(huán)設(shè)置,把對(duì)應(yīng)的端口都設(shè)置成輸出
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT); }
for (int thisSeg = 0; thisSeg < segCount; thisSeg++) {
pinMode(segPins[thisSeg], OUTPUT);
}
}
// 數(shù)據(jù)處理,把需要處理的byte數(shù)據(jù)寫到對(duì)應(yīng)的引腳端口。
void deal(unsigned char value){
for(int i=0;i<8;i++)
digitalWrite(ledPins[ i],bitRead(value,i));//使用了bitWrite函數(shù),非常簡(jiǎn)單
// !bitRead(value,i),這里前面加!(非運(yùn)算符號(hào)),取決于使用的是共陰還是共陽(yáng)數(shù)碼管。
}
// 主循環(huán)
void loop() {
static unsigned int num;//定義一個(gè)數(shù)據(jù)
static unsigned long lastTime=0;
if (millis() - lastTime >= 1000) {
lastTime = millis();
//serialOutput();
num++;
}
//displayTemp[0]=dofly_DuanMa[num/1000]; //動(dòng)態(tài)顯示
//displayTemp[1]=dofly_DuanMa[(num%1000)/100];
//displayTemp[2]=dofly_DuanMa[((num%1000)%100)/10];
//displayTemp[3]=dofly_DuanMa[((num%1000)%100)%10];
displayTemp[0]=dofly_DuanMa[1]; //靜態(tài)顯示
displayTemp[1]=dofly_DuanMa[2];
displayTemp[2]=dofly_DuanMa[3];
displayTemp[3]=dofly_DuanMa[4];
static int i;
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > 0) {
previousMillis = currentMillis;
deal(0);// 清除“鬼影”
for(int a=0;a<4;a++) //循環(huán)寫位碼,任何時(shí)刻只有1位數(shù)碼管選通,之前全部關(guān)閉,然后再選通需要的那位數(shù)碼管
digitalWrite(segPins[a],1);//
digitalWrite(segPins[ i],0);//
deal(displayTemp[ i]);//讀取對(duì)應(yīng)的段碼值
i++;
if(i==4) //4位結(jié)束后重新循環(huán)
i=0;
}
}
作者: xiaoshan7748 時(shí)間: 2017-11-30 08:48
程序第三行定義了long previousMillis = 0; 后面的問(wèn)題都是最基本的C語(yǔ)言語(yǔ)法,找本C語(yǔ)言的書查下就知道了。
作者: 凡凡伯樂(lè) 時(shí)間: 2017-11-30 11:57
for循環(huán)體的主體,如果只有一個(gè)語(yǔ)句,大括號(hào){}是可以省略的,這里 for(int a=0;a<4;a++);digitalWrite(segPins[a],1);只有一句,所以省略了
作者: 999333 時(shí)間: 2017-11-30 12:03
中for 循環(huán)體沒(méi)有用{ } 括起來(lái)為啥可以正常編譯?if也同樣 不一定要括號(hào)啊沒(méi)括號(hào)被認(rèn)為是只判斷for或者if下面一條語(yǔ)句,{}是在一條或者多條需要判斷的時(shí)候才用的
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |