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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2046|回復: 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免费观看 | 天天操天天干天天爽 | 中文字幕日韩欧美一区二区三区 | 亚洲欧美综合精品另类天天更新 | 九色在线观看 | 色婷婷亚洲 | 色综合久 | 一级黄a视频 | 成人免费视频在线观看 | 日韩中文字幕 | 亚洲一区二区久久 | 国产精品色 | 欧美日韩在线观看一区 | 91在线看片 | 精品乱码一区二区三四区视频 | 久久久精品视频免费 | 福利视频一区二区三区 | 亚洲一区 | 亚洲一区二区三区免费观看 | 精品一区二区三区四区视频 | 欧美中文字幕 | 在线观看成人小视频 | 国产精品18久久久久久白浆动漫 | 日韩中文字幕免费在线 | 伊人二区| 国产精品视频久久久 | 精品久久电影 | a精品视频 | 少妇久久久 | 欧美一二三四成人免费视频 | 成人国产在线视频 | 成人在线免费观看视频 | 欧美国产日韩在线观看 | 午夜私人影院 | 亚洲一在线 | 99精品视频在线观看 |