痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
12
返回列表 發新帖
樓主: antlu

野人獻曝: 十段定時器

  [複製鏈接]
發表於 2014-9-3 00:50:03 | 顯示全部樓層
本帖最後由 jojoling 於 2014-9-3 12:51 AM 編輯
antlu 發表於 2014-9-3 12:12 AM static/image/common/back.gif
jojoling大;

   主程式與副程式(ALARM_WORK())都使用相同的變數,這時編譯會出問題,可以解決嗎? 他會說重 ...


global variables:
1. 只能宣告在一隻裏面,另一隻宣告 extern 來使用,我底下直接用正規方法來說明,所謂正規方法就是把 global variables 獨立成一隻特定的檔案。事實上你可以宣告在主程式 OR 副程式裏面。

(1) global_defined.c => 全域變數放置的地方
  1. int timer_count;
複製代碼
(2) global_defined.h => 全域變數的原形宣告
  1. extern int timer_count;
複製代碼
(3) main.c/ func1.c 主程式 or 副程式所在地,在使用前,只要 #include "global_defined.h" 及可

  1. #include "global_defined.h"
  2. void main()
  3. {
  4. ......
  5.    timer_count = 3;
  6. ......
  7. }
複製代碼
2. static variables:
靜態變數,我先在這裏只說明在檔案的全域裏宣告靜態變數,在一隻檔案裏的全域變數宣告為靜態變數,有幾個特性:
1)初使值為 0。
2)在同一隻檔案裏所有function 裏都可讀取這個變數。
3)其它別的檔案,都無法直接讀取這個變數。
4)如有2隻檔案裏面都宣告同名的靜態變數,此變數是各自獨立。
5)很多時後,很常見又不重要,但又需要容易記,會使用相同的靜態變數名稱定義與不同的檔案裏。
example:

(1)  func1.c 裏有一個靜態變數 key:
  1. static int key;
複製代碼
(2) main.c 裏如要直接讀取 func1.c 的靜態變變會產生錯誤
(3) main.c 裏也存在一個靜態變數,此在系統裏,是另一個記憶體空間。


3. local variables 就不詳述了。

4. library 裏的全域變數,這是比較特殊的用法,如此 library code 裏有2隻檔各自定義相同名稱的全域變數,系統是可以正確被編譯過,但實際上真實的記憶體是指同一個,這裏我只是指出,但....初學者不要看這一點。



 樓主| 發表於 2014-9-3 09:56:37 | 顯示全部樓層
jojoling 發表於 2014-9-3 12:50 AM static/image/common/back.gif
global variables:
1. 只能宣告在一隻裏面,另一隻宣告 extern 來使用,我底下直接用正規方法來說明,所 ...

JOJOLING大:
   感恩!! 昨晚找了一晚沒有結果!! 今天在慢慢消化!! 再次感謝!!
 樓主| 發表於 2014-9-4 00:15:09 | 顯示全部樓層
本帖最後由 antlu 於 2014-9-4 12:17 AM 編輯
jojoling 發表於 2014-9-3 12:50 AM static/image/common/back.gif
global variables:
1. 只能宣告在一隻裏面,另一隻宣告 extern 來使用,我底下直接用正規方法來說明,所 ...


jojoling大:
   我今天試過,結果 設定一個 GLOBAL_DEFINED.C 和 GLOBAL_DEFINED.H 上去但是沒成功!!!
   我把 ALARM_WORK.C 和 ALARM_WORK.H 然後加上 EXTERN 就可以但是有一點限制就是 不能先設為零
  1. #include "stm8s_alarm_work.h"
  2. #include "stm8s_gpio.h"
  3. #include "stm8s_delay.h"
  4. //#include "global_defined.h"

  5. #define BUZZER GPIO_PIN_0

  6. extern u8 Alarm_flag;//alarm use
  7. extern u8 Sec_alarm_flag;//alarm use
  8. extern u8 Alarm_Time_count;//1 minutes
  9. extern u8 Finish_flag;

  10. void Alarm_Work(void)
  11. {
  12.                 if(Finish_flag==1)//alarm function
  13.                 {
  14.                         Alarm_flag=1;
  15.                         if(Sec_alarm_flag==1)
  16.                                 {
  17.                                         Sec_alarm_flag=0;                       
  18.                                         Alarm_Time_count++;
  19.                                 }
  20.                         if(Alarm_Time_count ==20)
  21.                         {
  22.                                 Alarm_Time_count =0;
  23.                                 Alarm_flag=0;
  24.                                 Finish_flag=0;
  25.                         }
  26.                 }
  27.                 if(Alarm_flag!=0)
  28.                         {
  29.                                 GPIO_WriteLow(GPIOD,BUZZER);
  30.                                 delay(30);
  31.                                 GPIO_WriteHigh(GPIOD,BUZZER);
  32.                                 delay(30);
  33.                         }
  34. }
複製代碼
extern u8 Finish_flag=0;   <---這樣會異常
發表於 2014-9-4 01:03:48 | 顯示全部樓層
antlu 發表於 2014-9-4 12:15 AM static/image/common/back.gif
jojoling大:
   我今天試過,結果 設定一個 GLOBAL_DEFINED.C 和 GLOBAL_DEFINED.H 上去但是沒成功!!!
    ...

1.一定行的, 你的是其它問題,你跟本沒有把其它的 c 加進入這個 project 吧....
2.extern u8 Finish_flag=0; <= 當然不行
extern 是說明,這個變數在別的地方宣告。
你在宣告的地方 assign 值及可。
你有 extern u8 Finish_flag 就應該有一個地方寫  u8 Fishish_flag , 這後面這個 assign 值及可。
 樓主| 發表於 2014-9-4 10:44:52 | 顯示全部樓層
本帖最後由 antlu 於 2014-9-4 10:50 AM 編輯
jojoling 發表於 2014-9-3 12:50 AM static/image/common/back.gif
global variables:
1. 只能宣告在一隻裏面,另一隻宣告 extern 來使用,我底下直接用正規方法來說明,所 ...


jojoling大:
   感謝您的指導!! 點出了問題點!! 就是 extern 變數不能有指定值(=0),可以在 global_define.c 裡面設定,我已經試出來了請過目,再次感謝!!
  1. unsigned char Hundreds,Tens,Units;//顯示百位十位個位
  2. unsigned int Display_Data;//
  3. unsigned char count6;//timer 6
  4. unsigned char display_time;//interrupt for display
  5. unsigned char Menu=0;//菜單選擇按鍵-------------
  6. unsigned char One_Sec_Flag;
  7. unsigned char One_Tenth_Count;//1/10 second
  8. unsigned char One_Sec_Count;
  9. unsigned char One_Minute_Count;
  10. unsigned char One_Tenth_Flag;
  11. unsigned char One_Minute_Flag;
  12. unsigned char One_Hour_Flag;
  13. unsigned char Step_count;//record lamp on/off 次數
  14. unsigned char rec_Step_On_Time[10];
  15. unsigned char rec_Step_Off_Time[10];
  16. unsigned char rec_Out_MOS[10];
  17. unsigned char Step_On_Time;//current step of on time
  18. unsigned char Step_Off_Time;//current off time
  19. unsigned char Out_MOS;//out put port define
  20. unsigned char Start_Run_Flag;//start stop clear
  21. unsigned char Step_On_Time_finish;//flag
  22. unsigned char Step_Off_Time_finish;//flag
  23. unsigned char Stop_Run_count=0;//for clear------------
  24. unsigned char Running_Flag=0;//正在倒數---------------
  25. unsigned char Display_Change_Flag;//變換顯示步驟與時間
  26. unsigned char Display_Change_count;
  27. unsigned char Load_Data_flag;//first load data
  28. unsigned char Alarm_flag;//alarm use
  29. unsigned char Sec_alarm_flag;//alarm use
  30. unsigned char Alarm_Time_count=0;//1 minutes---------
  31. unsigned char Finish_flag=0;//------------------------
複製代碼
  1. //#include "global_defined.h"
  2. #ifndef __GLOBAL_DEFINED_H__
  3. #define __GLOBAL_DEFINED_H__


  4. extern unsigned char Hundreds,Tens,Units;//顯示百位十位個位
  5. extern unsigned int Display_Data;//
  6. extern unsigned char count6;//timer 6
  7. extern unsigned char display_time;//interrupt for display
  8. extern unsigned char Menu;//菜單選擇按鍵
  9. extern unsigned char One_Sec_Flag;
  10. extern unsigned char One_Tenth_Count;//1/10 second
  11. extern unsigned char One_Sec_Count;
  12. extern unsigned char One_Minute_Count;
  13. extern unsigned char One_Tenth_Flag;
  14. extern unsigned char One_Minute_Flag;
  15. extern unsigned char One_Hour_Flag;
  16. extern unsigned char Step_count;//record lamp on/off 次數
  17. extern unsigned char rec_Step_On_Time[10];
  18. extern unsigned char rec_Step_Off_Time[10];
  19. extern unsigned char rec_Out_MOS[10];
  20. extern unsigned char Step_On_Time;//current step of on time
  21. extern unsigned char Step_Off_Time;//current off time
  22. extern unsigned char Out_MOS;//out put port define
  23. extern unsigned char Start_Run_Flag;//start stop clear
  24. extern unsigned char Step_On_Time_finish;//flag
  25. extern unsigned char Step_Off_Time_finish;//flag
  26. extern unsigned char Stop_Run_count;//for clear
  27. extern unsigned char Running_Flag;//正在倒數
  28. extern unsigned char Display_Change_Flag;//變換顯示步驟與時間
  29. extern unsigned char Display_Change_count;
  30. extern unsigned char Load_Data_flag;//first load data
  31. extern unsigned char Alarm_flag;//alarm use
  32. extern unsigned char Sec_alarm_flag;//alarm use
  33. extern unsigned char Alarm_Time_count;//1 minutes
  34. extern unsigned char Finish_flag;

  35. #endif
複製代碼
MAIN.C 內容
  1. #include "stm8s.h"
  2. #include "stm8s_tim1.h"
  3. #include "stm8s_tim5.h"
  4. #include "stm8s_tim6.h"
  5. #include "stm8s_adc1.h"
  6. #include "stm8s_delay.h"
  7. #include "stm8s_alarm_work.h"
  8. #include "global_defined.h"

  9. #define S 10
  10. #define T 11
  11. #define P 12
  12. #define D 13
  13. #define O 14
  14. #define F 15
  15. #define BUZZER GPIO_PIN_0
  16. //---------20140815-----------------
  17. #define Out0PORT GPIOB
  18. #define Out1PORT GPIOB
  19. #define Out2PORT GPIOA
  20. #define Out3PORT GPIOF
  21. #define Out0 GPIO_PIN_6  //小TRIAC
  22. #define Out1 GPIO_PIN_7  //大TRIAC
  23. #define Out2 GPIO_PIN_2  //大TRIAC
  24. #define Out3 GPIO_PIN_4  //繼電器


  25. u8 pcdis[]={0xd6,0x14,0xcc,0x5c,0x1e,0x5a,0xda,0x14,0xde,0x5e,0x52,0xca,0x8e,0x08,0xd8,0x8a};//定義pc port 顯示的值
  26. u8 pedis[]={0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00,0x01};//定義pe port 顯示的值對應于7段顯示
  27. // 增加了stpdop等字段
  28. /*
  29. u8 Hundreds,Tens,Units;//顯示百位十位個位
  30. u16 Display_Data;//
複製代碼
因為 pcdis[]= 內容只用在 主程式的顯示程式內又有等號內容所以乾脆就不放入 global_defined.c內了
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-5-18 09:13 PM , Processed in 0.047957 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.