找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机C语言(函数的嵌套调用)

[复制链接]
跳转到指定楼层
楼主
ID:324844 发表于 2018-6-12 17:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
calc(keyscan());
上面的calc()调用keyscan()函数,
是不是calc()可以调用keyscan()函数里面的所有
变量,求解答
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2018-6-13 08:32 | 只看该作者
keyscan()有个返回值,相当于一个数值,calc()使用的是一个数值

评分

参与人数 1黑币 +5 收起 理由
hedianzi + 5 很给力!

查看全部评分

回复

使用道具 举报

板凳
ID:350952 发表于 2018-6-13 11:36 | 只看该作者
这个案例里面,calc()只能调用keyscan()的返回值,如果需要用到keyscan()函数里的所有变量,需要在函数返回值里增加所需要的变量。

评分

参与人数 1黑币 +5 收起 理由
hedianzi + 5 很给力!

查看全部评分

回复

使用道具 举报

地板
ID:324844 发表于 2018-6-13 13:19 | 只看该作者
zhanghyg 发表于 2018-6-13 08:32
keyscan()有个返回值,相当于一个数值,calc()使用的是一个数值

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char//宏替换        //段选和位选
uchar LA[8],j,m;
sbit M=P3^5;           //数组8位LA
uchar code wetable[]={  
0x80,0x40,0x20,0x10,
0x08,0x04,0x02,0x01};     //数组编码(位选从高位向低位逐位送0)(为共阴数码管)
uchar code dutable[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
//段选0~9   //段选编码(0到9)
long int num1,num2,num,numi;
uchar temp;//按键需要的中间变量
uchar flag;//标记是否为数字键
uchar ch;//保存当前按下的符号标记按键的次数,按下"+-*/"
uchar date,count;//date保存按键得到的数字,count标记是第几个数字
uchar p;//p为指针,为了消除数字之前多余的0
uchar mark;
void delay(uint z)      //延迟函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=0;y<=112;y++);
}
void init()        //定义初值{
{
count=0;
flag=0;
mark=0;
num1=0;
num2=0;
num=0;
}
uchar keyscan()//判断按下那个键//扫键函数
{
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(20);//消除抖动
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
{
temp=P2;
switch(temp)
{
case 0xee:flag=1;date=7;
break;
case 0xde:flag=1;date=8;
break;
case 0xbe:flag=1;date=9;
break;
case 0x7e:flag=2;ch='/';
break;
}
if(temp!=0xf0)
{
delay(20);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//等待按键松开
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(20);//消除抖动
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
{
temp=P2;
switch(temp)
{
case 0xed:flag=1;date=4;
break;
case 0xdd:flag=1;date=5;
break;
case 0xbd:flag=1;date=6;
break;
case 0x7d:flag=2;ch='*';
break;
}
if(temp!=0xf0)
{
delay(20);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//等待按键松开
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(20);//消除抖动
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
{
temp=P2;
switch(temp)
{
case 0xeb:flag=1;date=1;
break;
case 0xdb:flag=1;date=2;
break;
case 0xbb:flag=1;date=3;
break;
case 0x7b:flag=2;ch='-';
break;
}
if(temp!=0xf0)
{
delay(20);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//等待按键松开
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(20);//消除抖动
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
{
temp=P2;
switch(temp)
{
case 0xe7:flag=4;ch='C';
break;
case 0xd7:flag=1;date=0;
break;
case 0xb7:flag=3;//ch='=';
break;
case 0x77:flag=2;ch='+';
break;
}
if(temp!=0xf0)
{
delay(20);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)//等待按键松开
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
return date;
}
void display(long int num)           //(总)显示函数(显示到第一次位的值不为0)(666)(显示一个完整数)
{
char i;
LA[7]=num%100000000/10000000;
LA[6]=num%10000000/1000000;
LA[5]=num%1000000/100000;
LA[4]=num%100000/10000;
LA[3]=num%10000/1000;
LA[2]=num%1000/100;
LA[1]=num%100/10;
LA[0]=num%10;
if(num==0)
{
P1=wetable[0];
P0=dutable[0];
delay(2);
P0=0xff;
}
else
{
for(i=7;i>=0;i--)
{
if(LA!=0)
{
p=i;
break;
}
}
for(i=0;i<=p;i++)
{
P1=wetable;
P0=dutable[LA];
delay(2);
P0=0xff;
}
}
}
void calc(uchar date)           //得数转换成数值
{
   if(flag==1)
    {
     if(count==0)//得到的第一个完整数字//第一个数连续使用count=0以得到数值;
      {
       num1=num1*10+date;
       flag=0;
       num=num1;
      }
     if(count==1)//得到的第二个完整数字//第二个数在使用flag2后开始连续使用,直至flag3的
      {
       num2=num2*10+date;
       flag=0;
       num=num2;
      }
    }
     if(count>1&&mark==1)
    {
      num1=num;
      flag=0;
      count=1;//讲num2置为第二个数
    }
     display(num);      
     if(flag==2)//如果得到符号位
    {
      count++;
      flag=0;
    }
     if(flag==3)
    {
       num=0;
       switch(ch)
      {
        case '+':num=num1+num2; break;
        case '-':num=num1-num2; break;
        case '*':num=num1*num2; break;
        case '/':num=num1/num2; break;
      }
      num1=0;
      num2=0;
      flag=0;
      mark=1;
      M=0;
      delay(100);
      M=1;
     
    }
   
    if(flag==4)
    {
      num1=0;
      num2=0;
      num=0;
      count=0;
      flag=0;
      mark=0;
    }
}

      
     
void main()
{
  init();
  while(1)
  {
   calc(keyscan());
  }
}
大佬,里面的void calc(uchar date)   函数为什么能调用 uchar keyscan()里面除了date以外的其他变量啊,如flag,和字符变量ch,不是只返回了一个date吗
回复

使用道具 举报

5#
ID:324844 发表于 2018-6-13 13:20 | 只看该作者
chew2018 发表于 2018-6-13 11:36
这个案例里面,calc()只能调用keyscan()的返回值,如果需要用到keyscan()函数里的所有变量,需要在函 ...

受教了,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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