找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3303|回复: 3
打印 上一主题 下一主题
收起左侧

4位数码管单片机程序最后的语句求大神解释一波!

[复制链接]
跳转到指定楼层
楼主
ID:253661 发表于 2017-11-30 02:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个4位数码管程序  程序最后的语句
unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 0) {
    previousMillis = currentMillis;
previousMillis前面一直没有定义和赋值,为啥可以使用啊?

还有
for(int a=0;a<4;a++) //循环写位码,任何时刻只有1位数码管选通,之前全部关闭,然后再选通需要的那位数码管
       digitalWrite(segPins[a],1);//
     digitalWrite(segPins[ i],0);//
     deal(displayTemp[ i]);//读取对应的段码值
    i++;
    if(i==4) //4位结束后重新循环
      i=0;
  }
中for 循环体没有用{ } 括起来为啥可以正常编译?if也同样
大神指导一下!!






int ledCount=8;
int segCount=4;

long previousMillis = 0;
//定义段码,这里是共阴段码,可以使用数码管段码软件改变数组值或者任意显示形状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 注释是数码管实际引脚数,和芯片一样,逆时针数
int segPins[] = {
  13,10,9,7
};
unsigned char displayTemp[4];//显示缓冲区
void setup() {
// 循环设置,把对应的端口都设置成输出
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT); }
  for (int thisSeg = 0; thisSeg < segCount; thisSeg++) {
    pinMode(segPins[thisSeg], OUTPUT);
  }
}
// 数据处理,把需要处理的byte数据写到对应的引脚端口。
void deal(unsigned char value){
for(int i=0;i<8;i++)
   digitalWrite(ledPins[ i],bitRead(value,i));//使用了bitWrite函数,非常简单
   // !bitRead(value,i),这里前面加!(非运算符号),取决于使用的是共阴还是共阳数码管。
}
// 主循环
void loop() {

   static unsigned int num;//定义一个数据
   static unsigned  long lastTime=0;

  if (millis() - lastTime >= 1000) {
    lastTime = millis();
    //serialOutput();
    num++;
  }
  //displayTemp[0]=dofly_DuanMa[num/1000];       //动态显示
  //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]; //静态显示
  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++) //循环写位码,任何时刻只有1位数码管选通,之前全部关闭,然后再选通需要的那位数码管
       digitalWrite(segPins[a],1);//
     digitalWrite(segPins[ i],0);//
     deal(displayTemp[ i]);//读取对应的段码值
    i++;
    if(i==4) //4位结束后重新循环
      i=0;
  }


  }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:194257 发表于 2017-11-30 08:48 | 只看该作者
程序第三行定义了long previousMillis = 0; 后面的问题都是最基本的C语言语法,找本C语言的书查下就知道了。

评分

参与人数 1黑币 +5 收起 理由
ZFDPJ + 5 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:251323 发表于 2017-11-30 11:57 | 只看该作者
for循环体的主体,如果只有一个语句,大括号{}是可以省略的,这里 for(int a=0;a<4;a++);digitalWrite(segPins[a],1);只有一句,所以省略了
回复

使用道具 举报

地板
ID:222948 发表于 2017-11-30 12:03 | 只看该作者
中for 循环体没有用{ } 括起来为啥可以正常编译?if也同样        不一定要括号啊没括号被认为是只判断for或者if下面一条语句,{}是在一条或者多条需要判断的时候才用的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表