欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 為什么keil的多文件工程就有問題 [打印本頁]

作者: 3038838599    時間: 2023-9-5 16:52
標題: 為什么keil的多文件工程就有問題
事情是這樣的,在keil上我用單文件功能能實現的功能。
再用多文件工程的時候,功能就實現不了了,就是一個外部中斷控制燈的程序。
用的是51單片機,普中的開發板。


實實在在搞了,兩天沒什么頭緒,工程的各種添加也都添加了,特來交流交流。

14、按鍵換擋模仿產品控制板 - 副本.rar

24.01 KB, 下載次數: 11

程序

普中-2&普中-3&普中-4開發板原理圖.pdf

151.73 KB, 下載次數: 8

原理圖


作者: lkc8210    時間: 2023-9-5 18:09


作者: Hephaestus    時間: 2023-9-5 22:26
你早說是C51啊??

我還以為是RVMDK,興沖沖的進來,掃興回去。
作者: changhz    時間: 2023-9-6 00:52
中斷就是等按鍵按下,你把按鍵放中斷里,永遠都進不去。
單玩玩的話,去掉按鍵部份,直接按P3.3就可以的,不過沒有消抖會跳,如下1和2。
1、exint1.c
void exti1() interrupt 2 //外部中斷1中斷函數
{
    mode++;       
    if(mode>=3)
                mode=0;       
}

2、exint1.h
sbit KEY4=P3^5;

想加個按鍵觸發的話如下3。
1、exint1.c
void exti1_init(void)
{
        IT1=1;//跳變沿觸發方式(下降沿)
        EX1=1;//打開INT1的中斷允許
        EA=1;//打開總中斷
}

void key(void)
{
        if(!KEY4)
        {
                delay_10us(2000);
                if(!KEY4)
                {          
                        Flag = 0;                               
                }
                while(!KEY4)
                Flag = 1;       
        }
}

void exti1() interrupt 2 //外部中斷1中斷函數
{
        mode++;
        if(mode>=3)
                        mode=0;                       
}


2、exint1.h
//定義獨立按鍵K4控制腳
sbit KEY4=P3^5;
sbit Flag=P3^3;


3、main.c
while(1)
        {               
            key();               
                        switch(mode)
                {
                        case 0: led1=1;led2=1;led3=1;break;
                        case 1: led1=0;led2=0;led3=0;break;
                        case 2: led1=0;led2=0;led3=1;break;
                        case 3: led1=0;led2=1;led3=1;break;
                }
               
        }       


作者: chxelc    時間: 2023-9-6 08:50
沙發說的對,mode全局變量只在exint1.h中定義為extern u8 mode;表示外部已經定義了,但我找遍工程都沒看到哪里有定義。建議在main.c中加入變量申明u8 mode;試試。
作者: sttt300    時間: 2023-9-6 08:59

我用你的文件建了個工程,問題如下:
1. 首先出現以下問題,這個只需要把庫文件路徑設置一下就好了,相信你肯定不是這個問題引起的


2. 已經成功編譯,但是一堆警告,問題點指向mode變量。


沒錯,就是這個變量的問題。
你在exint1.h文件中定義全局變量,但是用了extern u8 mode;這個是引用變量
應該這么改,在main()函數上面定義u8 mode,這樣就沒問題了
或者你把exint1.h文件中的extern u8 mode改成u8 mode,然后在main()函數上面寫上extern u8 mode,也是一樣的
還可以





作者: sttt300    時間: 2023-9-6 09:07
剛剛又試了一下,有一點說錯了,如果mode變量要放在exit文件中定義的話,放.h文件是不行的,要放.c文件中定義,也就是2樓的圖中那樣寫
main()函數中還是要加extern u8 mode的,不然mode變量傳不過去的
作者: joyb    時間: 2023-9-6 09:15
在keil4上,不能編譯
作者: 3038838599    時間: 2023-9-8 10:40
joyb 發表于 2023-9-6 09:15
在keil4上,不能編譯

用的是keil c51  而且一個全局變量有問題可能編譯不成功。
作者: 3038838599    時間: 2023-9-8 10:43
lkc8210 發表于 2023-9-5 18:09

是的  就是這個全局變量處理不好,已經解決了,感謝感謝
作者: 3038838599    時間: 2023-9-8 10:47
Hephaestus 發表于 2023-9-5 22:26
你早說是C51啊??

我還以為是RVMDK,興沖沖的進來,掃興回去。

下次在標題標明一下,現在只是在用51單片機,也不知道RVMDK這些東西
作者: 3038838599    時間: 2023-9-8 11:34
sttt300 發表于 2023-9-6 09:07
剛剛又試了一下,有一點說錯了,如果mode變量要放在exit文件中定義的話,放.h文件是不行的,要放.c文件中定 ...

對是的  我是想在.H文件里用extren定義了mode ,然后在main.c文件里再包含對應的.h文件就行了。實際上是不行的,而是要在main.c里面先定義mode,然后再在.h文件用extern聲明才可以用,其中的原因也不清楚。
  不知道是不是文件在多個文件夾的原因,因為在一個文件夾里就可以的。
  
作者: labview_mcu    時間: 2023-9-8 12:10
會不會是優化等級優化了 volatile 試試。
作者: Hephaestus    時間: 2023-9-8 16:39
labview_mcu 發表于 2023-9-8 12:10
會不會是優化等級優化了 volatile 試試。

c51與眾不同,假定其用戶都不懂volatile,所以不加都沒有問題。
作者: sttt300    時間: 2023-9-9 11:04
3038838599 發表于 2023-9-8 11:34
對是的  我是想在.H文件里用extren定義了mode ,然后在main.c文件里再包含對應的.h文件就行了。實際上是不 ...

跟文件在哪沒關系,文件在哪只影響你lib路徑的選擇
extern是引用其他文件中的變量,不是定義變量
一定要在一個.c文件中定義了全局變量
如果這個全局變量在另外一個.c文件中引用了的話,就要在那個.c文件也加上這個全局變量的聲明,并且要加extern
也就是這兩句“int mode”和“extern int mode”需要分別放在main.c和exit.c文件中
至于哪句放哪個文件?都可以,只要一個文件一句就行,效果一樣。





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1