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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2135|回復: 6
打印 上一主題 下一主題
收起左側

求教C語言子函數中靜態變量的運用問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:42969 發表于 2020-8-17 18:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    求教各位大神,我編寫了一個簡單的獨立按鍵防抖的子函數,程序如下,在定時中斷中調用這個函數沒有效果。然后我把這段程序直接寫到中斷函數中,它是起作用的。
bit INDRIVER(bit x)
{
        bit back;
        bit y;
        static uchar keybuf = 0xff;
        keybuf = (keybuf<<1) | x;                   //掃描一次,左移輸入一位
                if (keybuf == 0x00)                     //8次掃描均為0
                {
                y = 0;                                       //按鍵彈起狀態
                }
                else if (keybuf==0xff)
                {
                y = 1;                                      //按鍵按下狀態
                }
                else
                {}
                back = y;
                return back;
}

定時中斷函數:
void  T1_ISR(void) interrupt 3
{
TH1=0xF8;
TL1=0xCD;
        Ms5_Time++;
        if(20>Ms5_Time && Ms5_Time>0)
        {
                IN2=1;                         //關閉第二片245
                OUT_QS1=0;              //關閉第一片573
                OUT_QS2=0;             //關閉第二片573
                 IN1=0;                            // 選中第一片245
//                P1=0XFF;
                _nop_();                                
                Input0=INDRIVER(Data0);                  //掃描按鍵狀態1
                Input1=INDRIVER(Data1);
                Input2=INDRIVER(Data2);        
                Input3=INDRIVER(Data3);
                Input4=INDRIVER(Data4);
                Input5=INDRIVER(Data5);
        }

是不是因為在子函數中定義了靜態變量,所以不能多次調用?  還是我的設計思路就是有問題的?把子函數直接寫在中斷中,定義多個靜態變量,程序重復寫多次,是可以運行的。因為硬件上有很多路輸入,實在不想重復寫防抖程序,求教各位大神,到底哪里出問題了。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2020-8-18 00:29 | 只看該作者
這是作用域的問題,調用時是重新分配存儲單元的,調用函數運行完后就釋放了,中斷程序是與主程序并行的,不存在調用問題,只是程序運行指針的轉移
回復

使用道具 舉報

板凳
ID:42969 發表于 2020-8-18 13:29 | 只看該作者
靜態變量是只在第一次運行時賦一個初始值,如果在子函數中定義了一個靜態變量,在中斷中調用這個函數,那么這個靜態變量還是會釋放,是不是問題就出在這了?
回復

使用道具 舉報

地板
ID:42969 發表于 2020-8-18 13:45 | 只看該作者
    謝謝大神,那是不是在我這個樣例的子函數中不能使用靜態變量? 我這個子函數需要多次調用,運行完就釋放,那么在子函數中定義了靜態變量還是不起作用,還是會釋放掉?
   
回復

使用道具 舉報

5#
ID:235200 發表于 2020-8-19 00:08 | 只看該作者
理論上靜態變量等同于全局變量,你可以定義一個全局變量試試
回復

使用道具 舉報

6#
ID:804115 發表于 2020-8-19 13:31 | 只看該作者
這個靜態局部變量相當于全局變量,只要不掉電,這個變量的分配的RAM則不被釋放。
但它又與全局變量不同,因為其在函數體內被定義,所以,它只能用于此函數體,不能被其它函數體所使用。
另外就是其初值0xff只會在最開始分配時賦值一次,之后每次進入此函數后,不會再對其進行0XFF的賦值了,而是保留上一次退出此函數時的值。
如果你把static去掉的話,就變成普通的局部變量了,分配內存時會被分配到棧里,也就是說,此函數執行完畢退出后,相應的RAM就會被釋放了,下次再進會再重新分配,且會被重新初始化為0xff。
回復

使用道具 舉報

7#
ID:42969 發表于 2020-8-20 16:20 | 只看該作者
1692483014 發表于 2020-8-19 13:31
這個靜態局部變量相當于全局變量,只要不掉電,這個變量的分配的RAM則不被釋放。
但它又與全局變量不同, ...

想把按鍵消抖做成一個子函數,后面按鍵消抖都調用這個函數,還是沒成功,最后老老實實的每個按鍵單獨寫了一段消抖程序
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线精品 | av网站在线播放 | 韩日av片 | 涩涩视频在线观看免费 | 国精久久 | 本道综合精品 | 免费人成激情视频在线观看冫 | 国产在线精品一区二区 | 91看片在线观看 | 网络毛片 | 一区二区在线免费观看 | 国产精品久久一区二区三区 | 亚洲永久在线 | 国产一区欧美一区 | 一区欧美 | 国产91丝袜 | 亚洲成人中文字幕 | 成人在线视频网站 | 亚洲精品久久久久久久久久久久久 | 国产精品久久久久久久久免费桃花 | 日本一卡精品视频免费 | 国产一区二区免费电影 | www.中文字幕| 中文字幕亚洲一区 | 久久99精品国产 | 亚洲欧美成人影院 | 久久一区二区三区免费 | 韩日中文字幕 | 国产成人免费视频网站视频社区 | 亚洲乱码一区二区三区在线观看 | 蜜桃视频在线观看免费视频网站www | 欧美一区二区在线 | 99精品在线 | 在线观看不卡av | 国产成人精品一区二区三区四区 | 亚洲精品综合 | 国产精品无码专区在线观看 | 亚洲午夜久久久 | 国产欧美一区二区精品忘忧草 | 久久久久久久国产 | 日韩av免费在线观看 |