数码之家

 找回密码
 立即注册
搜索
查看: 1433|回复: 39

请教:子程序问题

[复制链接]
发表于 2021-9-7 08:24:14 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
把这个子程序里的内容放到主程序里,四位数码管可以正常显示,但是从主程序里调用就只能显示一位,把IF块改为从1到4的for循环也一样不能正常显示,想不通为什么?请教大家应该怎么改?
void display_ADC(unsigned char adc,unsigned char display_time)//ÏÔʾ³ÌÐòÄ£¿é»¯£¬Ö»ÐèÒª¸Ä±äData1/2/3/4µÄÖµ¾Í¿ÉÒÔ¿ØÖÆÏÔʾÄÚÈÝ   
    {   
              Data1=adc/1000;
              Data2=adc/100;          //°ÙλÊý¾Ý
              Data3=adc%100/10;   //ʮλÊý¾Ý
              Data3=Data3;            //¼Ó10£¬displayº¯ÊýÏÔʾµÄÊý×Ö»á´øÐ¡Êýµã
              Data4=adc%10;        //¸öλÊý¾Ý
              if(display_time==1 && Data1>0 && Data2>0)//µÚ0´ÎÏÔʾµÚÒ»¸öÊýÂë¹Ü
                    {
                        B1=1;B2=1;B3=1;B4=1; DA=0;DB=0;DC=0;DD=0;DE=0;DF=0;DG=0;DP=0;                      //¹Ø±ÕËùÓÐÊýÂë¹ÜÏÔʾ
                              display_SEG(Data1);                        //·¢Ë͵Ú1λÊý¾Ý
                        B1=0;                                      //¿ªµÚ1λ¹«¹²¶ËÒÔÏÔʾµÚ1λÊý
                    }               
              if(display_time==2)//µÚ1´ÎÏÔʾµÚ¶þ¸öÊýÂë¹Ü
                    {
                        B1=1;B2=1;B3=1;B4=1; DA=0;DB=0;DC=0;DD=0;DE=0;DF=0;DG=0;DP=0;                      //¹Ø±ÕËùÓÐÊýÂë¹ÜÏÔʾ
                                                                                    display_SEG(Data2);                        //·¢Ë͵Ú2λÊý¾Ý
                        B2=0;                                      //¿ªµÚ2λ¹«¹²¶ËÒÔÏÔʾµÚ2λÊý
                    }               
              if(display_time==3)//µÚ2´ÎÏÔʾµÚÈý¸öÊýÂë¹Ü
                    {
                        B1=1;B2=1;B3=1;B4=1; DA=0;DB=0;DC=0;DD=0;DE=0;DF=0;DG=0;DP=0;                      //¹Ø±ÕËùÓÐÊýÂë¹ÜÏÔʾ
                                                                                    display_SEG(Data3);                        //·¢Ë͵Ú3λÊý¾Ý
                        B3=0;                                      //¿ªµÚ3λ¹«¹²¶ËÒÔÏÔʾµÚ3λÊý
                    }               
              if(display_time==4)//µÚ3´ÎÏÔʾµÚËĸöÊýÂë¹Ü
                    {
                        B1=1;B2=1;B3=1;B4=1; DA=0;DB=0;DC=0;DD=0;DE=0;DF=0;DG=0;DP=0;                      //¹Ø±ÕËùÓÐÊýÂë¹ÜÏÔʾ
                                                                                    display_SEG(Data4);                        //·¢Ë͵Ú4λÊý¾Ý
                        B4=0;                                      //¿ªµÚ4λ¹«¹²¶ËÒÔÏÔʾµÚ4λÊý
                    }                                                  
    }

发表于 2021-9-7 08:40:12 | 显示全部楼层
本帖最后由 chenlei1910 于 2021-9-7 08:41 编辑

要么没延时,要么没计数。数码管这是基本操作,你要多去看看别人的程序不要瞎琢磨。
回复 支持 反对

使用道具 举报

发表于 2021-9-7 08:53:48 | 显示全部楼层
先上电路图,并把注释的乱码改了,不然怎么看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 08:55:28 | 显示全部楼层
本帖最后由 iritwq 于 2021-9-7 08:57 编辑
chenlei1910 发表于 2021-9-7 08:40
要么没延时,要么没计数。数码管这是基本操作,你要多去看看别人的程序不要瞎琢磨。 ...

问题是内容都没变,只是从主程序移出去变成子程序,然后从主程序调用就不行了,所以想不通呀
这是主程序部分:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 1 反对 1

使用道具 举报

发表于 2021-9-7 08:58:21 | 显示全部楼层
把你主程序的调用部分发上来呗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 09:01:31 | 显示全部楼层
ww5223017240 发表于 2021-9-7 08:58
把你主程序的调用部分发上来呗

主程序调用部分:
              display_time=display_time+1;                                                       
              if(display_time>3)
                  {
                        display_time=0;  //0¡¢1¡¢2¡¢3 ËĸöÑ­»·
                  }               
             display_ADC(adc,display_time);       
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:02:35 | 显示全部楼层
变成子程序后会不会是某些变量的公用、私有方面的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 09:03:20 | 显示全部楼层
ww5223017240 发表于 2021-9-7 08:58
把你主程序的调用部分发上来呗

刚开始子程序没有 display_time这个参数,只显示最后一位,加上之后只显示第二位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 09:05:23 | 显示全部楼层
慕名而来 发表于 2021-9-7 09:02
变成子程序后会不会是某些变量的公用、私有方面的问题。

可能吧,我把子程序里的变量改一下试试,不过子程序中没有改变变量的值,我觉得影响不大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 09:10:19 | 显示全部楼层
慕名而来 发表于 2021-9-7 09:02
变成子程序后会不会是某些变量的公用、私有方面的问题。


上面是子程序,下面是主程序中调用部分

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:26:32 | 显示全部楼层
显示要循环调用
同意上楼的,延时要合适
如果是中断计时,查查时间间隔合适不。
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:29:06 | 显示全部楼层
数码管扫描显示是吧,那扫描延时在哪儿呢?每次显示之间加20毫秒延时再试试
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:29:41 | 显示全部楼层
unsigned char adc,unsigned char display_time
我看传参都是char ,下面计算都是数字
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:32:05 | 显示全部楼层
toudaozhe 发表于 2021-9-7 09:29
unsigned char adc,unsigned char display_time
我看传参都是char ,下面计算都是数字

这个没错,你不常写单片机程序吧
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:34:11 | 显示全部楼层
iritwq 发表于 2021-9-7 09:10
上面是子程序,下面是主程序中调用部分

你这个display_time写的就有问题,+1要写在调用的后面啊,否则肯定从第1次开始不是从第0次开始啊,看你的描述怎么好像这个调用没加for循环的样子?
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:47:26 | 显示全部楼层
iritwq 发表于 2021-9-7 08:55
问题是内容都没变,只是从主程序移出去变成子程序,然后从主程序调用就不行了,所以想不通呀
这是主程序部 ...

你把time==0的判断里面&&加上小括号分开,
回复 支持 反对

使用道具 举报

发表于 2021-9-7 09:52:06 来自手机浏览器 | 显示全部楼层
ww5223017240 发表于 2021-9-7 09:34
你这个display_time写的就有问题,+1要写在调用的后面啊,否则肯定从第1次开始不是从第0次开始啊,看你的 ...

看子程序里就是从1开始的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 10:15:53 | 显示全部楼层
帝都老司机 发表于 2021-9-7 09:29
数码管扫描显示是吧,那扫描延时在哪儿呢?每次显示之间加20毫秒延时再试试 ...

加延时之后闪的很厉害,而且也是主程序里四位都显示,做成子程序调用就只有能显示一位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 10:17:13 | 显示全部楼层
ww5223017240 发表于 2021-9-7 09:34
你这个display_time写的就有问题,+1要写在调用的后面啊,否则肯定从第1次开始不是从第0次开始啊,看你的 ...

display_time从0开始,用的是1,2,3,4,所以先+1,调用后判断,超过4就归0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 10:19:02 | 显示全部楼层
chenlei1910 发表于 2021-9-7 09:47
你把time==0的判断里面&&加上小括号分开,

这个是在显示3位数时屏蔽第一位用的(比如0123显示成123好看些),实测显示没有问题
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-15 13:22 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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