久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4612|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国 | 亚洲国产精品第一区二区 | 亚洲国产精品一区二区久久 | 99这里只有精品视频 | 一级片免费视频 | 国产精品日韩高清伦字幕搜索 | 国产大毛片 | 国产一区在线免费观看 | 秋霞精品| 九九精品视频在线 | 国精产品一品二品国精在线观看 | 青青青伊人 | 久久99精品久久久久婷婷 | 国产成年人小视频 | 精品三级在线观看 | 亚州精品天堂中文字幕 | 久久久高清 | 国产日韩一区二区三免费 | 一级黄色av电影 | 久久男人 | 成人av网站在线观看 | 久久99精品国产麻豆婷婷 | 国产精品国产三级国产播12软件 | 久久久999免费视频 999久久久久久久久6666 | 国产精品久久久久久婷婷天堂 | 国产激情在线看 | 免费精品 | 在线区| 久久久精品视频一区二区三区 | www.天天操.com | 久久福利电影 | 国产一区二区自拍 | 隔壁老王国产在线精品 | 午夜欧美 | 亚洲+变态+欧美+另类+精品 | 国产精品视频一二三区 | 亚洲在线免费观看 | 久久99精品久久久97夜夜嗨 | 日韩精品中文字幕一区二区三区 | 在线观看 亚洲 | 日韩1区2区|