99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

中興24004.3版電源用STM8單片機改裝輸出可調0-60V,0-50A

最近搞逆變,沒有合適的電池供電。又沒有大功率電源,關鍵是米不多,買不起大電源。。。所以就萌生了改裝個通訊電源可調輸出的想法。后來多次搜索終于確定了中興2400的電源,把別人測繪的原理圖看了看。這個電源用料真足。保護電路很完善,二手的一兩百一臺。后來看到很多改裝方案,基本都是加電位器調節電壓電流反饋基準電壓形式。但是總感覺這個不是很靠譜,在想能不能用單片機直接控制不是更安全準確么。。那么廢話不多說先上圖
全部回復(76)
正序查看
倒序查看
syf7150
LV.3
2
2016-05-02 16:22

PCB板子,一個主板。另外那個凸起是風扇控制板,上面用的是雙NMOS IC,控制風扇

花了幾個小時才焊接完畢,用了0603封裝,眼神不好焊起來有點困難。。。然后用個18V電源通電,顯示默認值。

這個是降壓模塊3R33。輸出5V,輸入可以到7-23V,不過看你裝的貼片濾波電容耐壓而定。

這是拆掉的2400控制板,原理圖網上可以找到。如果誰需要可以留下郵箱。

焊接線,一共8根。出去電源,就是電壓AD,DA:電流AD,DA;風扇溫度和控制。

NTC 10K熱敏電阻,負溫度系數,根據查表得到電阻值,然后計算電壓

這是裝到2400前面板下面,尺寸正好放進去!

初步調試,電壓校準好還是比較準的。電流校準后大約有20mA誤差。

本來拍了個調試視頻,發不上來。。。只能看圖了。昨晚上焊的時候,沒拍幾張照片,湊合看吧

0
回復
syf7150
LV.3
3
2016-05-02 16:29
@syf7150
[圖片][圖片]PCB板子,一個主板。另外那個凸起是風扇控制板,上面用的是雙NMOSIC,控制風扇[圖片][圖片]花了幾個小時才焊接完畢,用了0603封裝,眼神不好焊起來有點困難。。。然后用個18V電源通電,顯示默認值。[圖片]這個是降壓模塊3R33。輸出5V,輸入可以到7-23V,不過看你裝的貼片濾波電容耐壓而定。[圖片][圖片][圖片]這是拆掉的2400控制板,原理圖網上可以找到。如果誰需要可以留下郵箱。[圖片]焊接線,一共8根。出去電源,就是電壓AD,DA:電流AD,DA;風扇溫度和控制。[圖片]NTC10K熱敏電阻,負溫度系數,根據查表得到電阻值,然后計算電壓[圖片]這是裝到2400前面板下面,尺寸正好放進去![圖片]初步調試,電壓校準好還是比較準的。電流校準后大約有20mA誤差。本來拍了個調試視頻,發不上來。。。只能看圖了。昨晚上焊的時候,沒拍幾張照片,湊合看吧
我用的是中興2400 4.3版改裝的,輸出0-60V,0-50可調。STM8單片機,主要是電壓采樣,PWM電壓輸出控制,電流采樣,PWM電流輸出控制。溫度采樣,溫度輸出用NMOS輸出控制。輸出能保存9組自定義存儲電壓電流值,可以直接調用輸出。同時能隨意調節輸出電壓電流。用編碼開關,AD采樣600個點,每個點對應0.1V電壓。可以精確控制輸出電壓值,經過校準后精確度在0.1,并且可調。輸出限流500AD值對應0.1A輸出,也能精確限流。本程序參考了別人源代碼,如果有興趣的朋友可以一起討論下這個程序。因為寫的太完美了。。人性化。。所以拿來和大家一起分享下
0
回復
syf7150
LV.3
4
2016-05-02 17:06
最重要說一點,這個成本很低。改裝穩定可靠,顯示準確。不過我還是喜歡寫的代碼。。
0
回復
2016-05-03 09:53
帖子不錯哦,打賞5枚電源幣
0
回復
ruohan
LV.9
6
2016-05-03 14:04
@syf7150
最重要說一點,這個成本很低。改裝穩定可靠,顯示準確。不過我還是喜歡寫的代碼。。

數碼管的顯示用的是什么芯片,

0
回復
syf7150
LV.3
7
2016-05-03 21:20
@ruohan
數碼管的顯示用的是什么芯片,
數碼管用的74HC595,單片機用的STM8S103F3P,另外用了個風扇控制ME9926
0
回復
syf7150
LV.3
8
2016-05-03 21:31
@電源網-fqd
帖子不錯哦,打賞5枚電源幣
謝謝司令大駕光臨,出入茅廬。。還需要司令指導“槍”怎么打的準,“炮”怎么打的遠!以前混逆變專區的,在這兒我得吹一波,壽大師無私精神,祝愿他老人家身體健康!
0
回復
syf7150
LV.3
9
2016-05-03 21:37
搬來上個源代碼,發現2000多行,像刷屏。。
0
回復
syf7150
LV.3
10
2016-05-03 22:16

剛把視頻傳上來了。

先電流測試(短路電流),再電壓測試。最后是保存自定義電壓電流測試。

0
回復
lizlk
LV.10
11
2016-05-04 08:22
@syf7150
剛把視頻傳上來了。先電流測試(短路電流),再電壓測試。最后是保存自定義電壓電流測試。
樓主相當有才,支持一個!
0
回復
bbb201105
LV.1
12
2016-05-04 09:20
能分享下資料嗎,看你那視頻我也想搞個出來玩玩
0
回復
yanggbx
LV.4
13
2016-05-04 13:01
@syf7150
[圖片][圖片]PCB板子,一個主板。另外那個凸起是風扇控制板,上面用的是雙NMOSIC,控制風扇[圖片][圖片]花了幾個小時才焊接完畢,用了0603封裝,眼神不好焊起來有點困難。。。然后用個18V電源通電,顯示默認值。[圖片]這個是降壓模塊3R33。輸出5V,輸入可以到7-23V,不過看你裝的貼片濾波電容耐壓而定。[圖片][圖片][圖片]這是拆掉的2400控制板,原理圖網上可以找到。如果誰需要可以留下郵箱。[圖片]焊接線,一共8根。出去電源,就是電壓AD,DA:電流AD,DA;風扇溫度和控制。[圖片]NTC10K熱敏電阻,負溫度系數,根據查表得到電阻值,然后計算電壓[圖片]這是裝到2400前面板下面,尺寸正好放進去![圖片]初步調試,電壓校準好還是比較準的。電流校準后大約有20mA誤差。本來拍了個調試視頻,發不上來。。。只能看圖了。昨晚上焊的時候,沒拍幾張照片,湊合看吧
能分享一下軟硬件嗎?
0
回復
2016-05-04 14:32
@bbb201105
能分享下資料嗎,看你那視頻我也想搞個出來玩玩
關注,視頻呢?
0
回復
2016-05-04 18:40
@心如刀割
關注,視頻呢?
非常好,
0
回復
zhangjunhai
LV.6
16
2016-05-04 21:33
@syf7150
剛把視頻傳上來了。先電流測試(短路電流),再電壓測試。最后是保存自定義電壓電流測試。
樓主你是不是買電源的,你這么一搞2400電源要漲價呀
0
回復
syf7150
LV.3
17
2016-05-04 22:20
@yanggbx
能分享一下軟硬件嗎?
硬件就是個小PCB板子,上面貼了出來了。代碼有,準備分享出來
0
回復
syf7150
LV.3
18
2016-05-04 22:22
@zhangjunhai
樓主你是不是買電源的,你這么一搞2400電源要漲價呀
沒TB店,這個也是沒事自己做著玩的,目前 沒時間精力搞店鋪啥的。。只是給大家分享下。。
0
回復
syf7150
LV.3
19
2016-05-04 22:25
#include "iostm8s103f3.h"
#include "F:\學習筆記\單片機\stm8\my.h"


/*
    【選項字節設置】
    需要激活:AFR0
*/

/*
    【74HC595與數碼管連接的腳位定義】
    第1級74HC595的Q0對應0x0001<<0
    第1級74HC595的Q7對應0x0001<<7
    第2級74HC595的Q0對應0x0001<<8
    第2級74HC595的Q7對應0x0001<<15  以此類推
*/

/*
    【EEPROM空間分配情況】
    0-7         開機默認電壓電流         8字節
    8-79        9組存儲電壓電流          72字節
    80-119      工廠模式的顯式參數       40字節
    120-151     工廠模式的隱式參數       32字節




*/


#define _Dpy_wei_0 (0x0001<<9)
#define _Dpy_wei_1 (0x0001<<12)
#define _Dpy_wei_2 (0x0001<<13)
#define _Dpy_wei_3 (0x0001<<3)
#define _Dpy_wei_4 (0x0001<<0)
#define _Dpy_wei_5 (0x0001<<2)
#define _Dpy_wei_6 (0x0001<<1)
#define _Dpy_duan_A (0x0001<<10)
#define _Dpy_duan_B (0x0001<<11)
#define _Dpy_duan_C (0x0001<<4)
#define _Dpy_duan_D (0x0001<<6)
#define _Dpy_duan_E (0x0001<<7)
#define _Dpy_duan_F (0x0001<<8)
#define _Dpy_duan_G (0x0001<<14)
#define _Dpy_duan_DP (0x0001<<5)

/*
    單個數碼管數字的字段數據,多種字段可用邏輯與運算結合顯示(示例:Dpy_duan_0 & Dpy_duan_dp 就是顯示“0.”)
*/
#define Dpy_duan_0      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F                         ))
#define Dpy_duan_1      (~(            _Dpy_duan_B|_Dpy_duan_C                                                             ))
#define Dpy_duan_2      (~(_Dpy_duan_A|_Dpy_duan_B            |_Dpy_duan_D|_Dpy_duan_E            |_Dpy_duan_G             ))
#define Dpy_duan_3      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D                        |_Dpy_duan_G             ))
#define Dpy_duan_4      (~(            _Dpy_duan_B|_Dpy_duan_C                        |_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_5      (~(_Dpy_duan_A            |_Dpy_duan_C|_Dpy_duan_D            |_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_6      (~(_Dpy_duan_A            |_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_7      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C                                                             ))
#define Dpy_duan_8      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_9      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D            |_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_all    (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G|_Dpy_duan_DP))
#define Dpy_duan_null   (~(0x0000                                                                                          ))
#define Dpy_duan_negative (~(                                                                      _Dpy_duan_G             ))
#define Dpy_duan_dp     (~(                                                                                    _Dpy_duan_DP))
#define Dpy_duan_o      (~(                        _Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E            |_Dpy_duan_G             ))
#define Dpy_duan_f      (~(_Dpy_duan_A                                    |_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_s      Dpy_duan_5
#define Dpy_duan_e      (~(_Dpy_duan_A                        |_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_t      (~(                                    _Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_v      (~(                        _Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E                                     ))
#define Dpy_duan_r      (~(                                                _Dpy_duan_E            |_Dpy_duan_G             ))
#define Dpy_duan_a      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C            |_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_c      (~(_Dpy_duan_A                        |_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F                         ))
#define Dpy_duan_n      (~(                        _Dpy_duan_C            |_Dpy_duan_E            |_Dpy_duan_G             ))
#define Dpy_duan_l      (~(                                    _Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F                         ))
#define Dpy_duan_y      (~(            _Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D            |_Dpy_duan_F|_Dpy_duan_G             ))
#define Dpy_duan_d      (~(            _Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E            |_Dpy_duan_G             ))
#define Dpy_duan_m      (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C            |_Dpy_duan_E|_Dpy_duan_F                         ))

/*
    數碼管的字位選通數據,Dpy_wei_0 是最左邊的數碼管,Dpy_wei_6 是最右邊的數碼管(示例:Dpy_wei_2 & Dpy_duan_0 & Dpy_duan_dp 就是在最左邊第3個數碼管顯示“0.”)
*/
#define Dpy_wei_0 (_Dpy_wei_0|(~Dpy_duan_all))
#define Dpy_wei_1 (_Dpy_wei_1|(~Dpy_duan_all))
#define Dpy_wei_2 (_Dpy_wei_2|(~Dpy_duan_all))
#define Dpy_wei_3 (_Dpy_wei_3|(~Dpy_duan_all))
#define Dpy_wei_4 (_Dpy_wei_4|(~Dpy_duan_all))
#define Dpy_wei_5 (_Dpy_wei_5|(~Dpy_duan_all))
#define Dpy_wei_6 (_Dpy_wei_6|(~Dpy_duan_all))

const u2 duanma[]={
   Dpy_duan_0
  ,Dpy_duan_1
  ,Dpy_duan_2
  ,Dpy_duan_3
  ,Dpy_duan_4
  ,Dpy_duan_5
  ,Dpy_duan_6
  ,Dpy_duan_7
  ,Dpy_duan_8
  ,Dpy_duan_9
  ,Dpy_duan_negative//橫杠
};

const u2 str_0[]={
   19//這是字符串本組字符串的長度
  ,Dpy_duan_f
  ,Dpy_duan_a
  ,Dpy_duan_c
  ,Dpy_duan_t
  ,Dpy_duan_o
  ,Dpy_duan_r
  ,Dpy_duan_y
  ,Dpy_duan_null
  ,Dpy_duan_m & Dpy_duan_dp//兩個數碼管合并顯示成“M”
  ,Dpy_duan_m              //兩個數碼管合并顯示成“M”
  ,Dpy_duan_o
  ,Dpy_duan_d
  ,Dpy_duan_e
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
};
const u2 str_1[]={
   17//這是字符串本組字符串的長度
  ,Dpy_duan_s
  ,Dpy_duan_e
  ,Dpy_duan_t
  ,Dpy_duan_null
  ,Dpy_duan_0 & Dpy_duan_dp
  ,Dpy_duan_5
  ,Dpy_duan_v
  ,Dpy_duan_null
  ,Dpy_duan_r
  ,Dpy_duan_e
  ,Dpy_duan_f
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
};

const u2 str_2[]={
   19//這是字符串本組字符串的長度
  ,Dpy_duan_s
  ,Dpy_duan_e
  ,Dpy_duan_t
  ,Dpy_duan_null
  ,Dpy_duan_9
  ,Dpy_duan_negative
  ,Dpy_duan_6
  ,Dpy_duan_0
  ,Dpy_duan_v
  ,Dpy_duan_null
  ,Dpy_duan_r
  ,Dpy_duan_e
  ,Dpy_duan_f
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
};

const u2 str_3[]={
   17//這是字符串本組字符串的長度
  ,Dpy_duan_s
  ,Dpy_duan_e
  ,Dpy_duan_t
  ,Dpy_duan_null
  ,Dpy_duan_0 & Dpy_duan_dp
  ,Dpy_duan_5
  ,Dpy_duan_a
  ,Dpy_duan_null
  ,Dpy_duan_r
  ,Dpy_duan_e
  ,Dpy_duan_f
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
};

const u2 str_4[]={
   19//這是字符串本組字符串的長度
  ,Dpy_duan_s
  ,Dpy_duan_e
  ,Dpy_duan_t
  ,Dpy_duan_null
  ,Dpy_duan_9
  ,Dpy_duan_negative
  ,Dpy_duan_4
  ,Dpy_duan_0
  ,Dpy_duan_a
  ,Dpy_duan_null
  ,Dpy_duan_r
  ,Dpy_duan_e
  ,Dpy_duan_f
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
  ,Dpy_duan_null
};

const u2 str_5[]={
   6//這是字符串本組字符串的長度
  ,Dpy_duan_s
  ,Dpy_duan_a
  ,Dpy_duan_v
  ,Dpy_duan_e
  ,Dpy_duan_null
  ,Dpy_duan_null
};

const u2 str_6[]={
   6//這是字符串本組字符串的長度
  ,Dpy_duan_c
  ,Dpy_duan_a
  ,Dpy_duan_n
  ,Dpy_duan_s
  ,Dpy_duan_e
  ,Dpy_duan_l
};

const u2 *str_list[]={
   str_1
  ,str_2
  ,str_3
  ,str_4
  ,str_5
  ,str_6
};


u2 showing_data[7]={0};
u2 HC595_data;
u2 HC595_data_mask[]={0xFFFF,0xFFFF};

v hc595_update(){
  PD4O=0;
  if(HIGH(HC595_data)&0x80)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x40)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x20)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x10)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x08)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x04)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x02)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(HIGH(HC595_data)&0x01)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x80)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x40)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x20)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x10)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x08)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x04)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x02)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PD4O=0;
  if(LOW(HC595_data)&0x01)PD4O=1;
  PA2O=0;
  PA2O=1;
  
  PA1O=1;
  PA1O=0;
}

u1 smg_scan=0;
u1 smg_scan2=0;

u1 bmq_status1=1;
u1 bmq_status2=1;
u1 bmq_turning=0;
u1 bmq_frist_down;
u1 bmq_last_up;
u1 bmq_idel_time=0xFF;
u2 bmq_last_time=0x8000;
u2 bmq_last2_time=0x8000;
/*
#define coefficient_V_show 62700//數值越小,顯示越高
#define offset_V_show 1693//數值越小,顯示越高

#define coefficient_I_show 57957//數值越小,顯示越高
#define offset_I_show 2471//數值越小,顯示越高

#define coefficient_V_set 9880//數值越大,設定越高

#define coefficient_I_set 8270//數值越大,設定越高
//*/
//工廠模式的參數
s2 PWM_V_bias;
u2 PWM_V_coefficient;
s2 PWM_I_bias;
u2 PWM_I_coefficient;
s2 ADC_V_bias;
u2 ADC_V_coefficient;
s2 ADC_I_bias;
u2 ADC_I_coefficient;


u1 UI_time_out;

u1 btn_status=1;
u1 btn_down_time=0;

u1 btn_event=0;//按鈕事件,0x01=編碼器正轉,0xFF=編碼器反轉,02=按鈕短按,03=按鈕長按

u2 PWM=0;
u1 output_PWM_update=0;//此變量置1即可更新輸出PWM,自動清零
u1 is_output_ON=0;
u2 _setV=0;//TIM4線程專用
u2 _setI=0;//TIM4線程專用
u2 setV=0;//main線程專用,最終由TIM4實行
u2 setI=0;//main線程專用,最終由TIM4實行
u2 nowV_16bit_ADC_result=0;
u2 nowV=0;//比例:537=53.7V
u2 nowI_16bit_ADC_result=0;
u2 nowI=0;//比例:125=12.5A
u2 output_I_limit=500;



s2 seting_data[11];

u1 *eep_addr;

u2 _adc_buf[4];
u2 adc_buf=0;
u1 adc_now_ch=0;//0是主溫度,1是電壓,2是電流,3是整流溫度
u1 adc_step=0;
u1 adc_count;

u1 is_fan_need_to_speed_up=0;

u1 factory_mode_setV_or_setI;//工廠模式專用變量,0=設置電壓(對應菜單項1和2),5=設置電流(對應菜單項3和4)。FLASH空間不足了,逼我做成代碼復用....
u1 flashing_style[2]={2,2};//flashing_style[1]常年=2,flashing_style[0]=0是滅<->亮循環,=1是半亮<->全亮循環


u1 tim4_timer1=250;
u1 user_timer1=0;//此處放入非0值即可每25mS自動遞減一次
u1 tim4_timer2=0;//此處放入非0值即可每25mS自動遞減一次(TIM4專用)
u1 tim4_timer3=0;//此處放入非0值即可每25mS自動遞減一次(TIM4專用)

u1 main_x;//此變量為臨時多用變量,只能在main線程內使用,不允許跨函數使用
u2 main_u2x;//此變量為臨時多用變量,只能在main線程內使用,不允許跨函數使用






v set_V_PWM(){//用main_u2x全局變量做傳入參數
  TIM1_CCR3H = 0;
  TIM1_CCR3L = PWM%100;
  TIM1_CCR4H = 0;
  TIM1_CCR4L = PWM/100%100;
}
#pragma optimize=low
v setV_update(){
  PWM=0;
  if(is_output_ON && _setV){
    PWM=(u4)_setV*PWM_V_coefficient/(600);
    PWM+=(PWM_V_bias);
    if((s2)PWM<0){
      PWM=0;
    }
  }
  set_V_PWM();
}
v set_I_PWM(){//用main_u2x全局變量做傳入參數
  TIM1_CCR1H = 0;
  TIM1_CCR1L = PWM%100;
  TIM1_CCR2H = 0;
  TIM1_CCR2L = PWM/100%100;
}
#pragma optimize=low
v setI_update(){
  PWM=0;
  if(_setI){
    PWM=(u4)_setI*PWM_I_coefficient/(600);
    PWM+=(PWM_I_bias);
    if((s2)PWM<0){
      PWM=0;
    }
  }
  set_I_PWM();
}



#pragma vector=TIM4_OVR_UIF_vector
__interrupt v TIM4_Init(){
  {//數碼管管理
    hc595_update();
    
    smg_scan2=!smg_scan2;
    HC595_data=showing_data[smg_scan] & HC595_data_mask[smg_scan2];
    
    smg_scan++;
    if(smg_scan>=7)smg_scan=0;
  }
  {//編碼器管理
    if(bmq_idel_time!=0xFF)bmq_idel_time++;
    if(bmq_idel_time==6){
      //完成了一次轉動
      bmq_turning=0;
      btn_event=bmq_last_up-bmq_frist_down;
      bmq_last2_time=bmq_last_time;
      bmq_last_time=0;
    }
    if((HIGH(bmq_last_time)&0x80)==0)bmq_last_time++;
  }
  {//按鍵去抖動
    if(PA3I){//沒按
      if(btn_status){
        if(btn_status<10)btn_status=1;
        btn_status--;
      }
    }else{//正在按
      if(btn_status!=0xFF){
        if(btn_status>=10)btn_status=0xFE;
        btn_status++;
      }
    }
  }
  {//通用定時器
    if(--tim4_timer1==0){
      //每25mS進入一次
      if(user_timer1)user_timer1--;
      if(tim4_timer2)tim4_timer2--;
      if(tim4_timer3)tim4_timer3--;
      tim4_timer1=250;
      
      {//按鍵判斷
        if(btn_status>=10){//正在按
          if(btn_down_time!=0xFF)btn_down_time++;
          if(btn_down_time==20){//發現是長按
            btn_event=0x03;
          }
        }else{//沒按
          if(btn_down_time){
            if(btn_down_time<20){//是短按
              btn_event=0x02;
            }
            btn_down_time=0;
          }
        }
      }
    }
  }
  {//ADC
    switch(adc_step){
    case 0://要切換通道
      switch(adc_now_ch){
      case 0:
        //之前是主溫度ADC
        //adc_buf數值 17316=4.1V,2111=0.5V
        if(adc_buf>=17316 || adc_buf<2111){
          is_fan_need_to_speed_up|=1;
        }
        adc_now_ch=1;//切換到電壓ADC
        ADC_CSR=0x06;//選定ch6
        break;
      case 1:
        //之前是電壓ADC
        nowV_16bit_ADC_result=adc_buf;
        if(adc_buf>=ADC_V_bias){
          nowV=(((u4)(adc_buf-ADC_V_bias))*600)/ADC_V_coefficient;
        }else{
          nowV=1+~((((u4)(ADC_V_bias-adc_buf))*600)/ADC_V_coefficient);
        }
        adc_now_ch=2;//切換到電流ADC
        ADC_CSR=0x05;//選定ch5
        break;
      case 2:
        //之前是電流ADC
        nowI_16bit_ADC_result=adc_buf;
        if(adc_buf>=ADC_I_bias){
          nowI=(((u4)adc_buf-ADC_I_bias)*600)/ADC_I_coefficient;
        }else{
          nowI=1+~(((ADC_I_bias-(u4)adc_buf)*600)/ADC_I_coefficient); 
        }
        adc_now_ch=3;//切換到整流溫度ADC
        ADC_CSR=0x03;//選定ch3
        break;
      default:
        //之前是整流溫度ADC
        
        if(adc_buf>63000){//整流測溫二極管開路
          if(nowI>50 && nowI>nowV && nowV<400){
            is_fan_need_to_speed_up|=1;
            
            if(tim4_timer2==0){
              output_I_limit=400;//限流40A
              tim4_timer3=200;
            }
          }else{
            if(tim4_timer3==0){
              output_I_limit=500;//限流50A
              tim4_timer2=200;
            }
          }
        }else{//整流測溫二極管正常
          
          //精度為5度左右
          //8400=75度
          //9718=70度
          //11244=65度
          //13004=60度
          //15019=55度
          //17309=50度
          
          if(adc_buf<17309){//大于50度加強風扇
            is_fan_need_to_speed_up|=1;
          }else{//小于50度
            if(tim4_timer2==0){
              output_I_limit=500;//限流50A
              tim4_timer2=200;
            }
          }
          if(tim4_timer2==0){
            if(adc_buf<8400){//大于75度
              if(output_I_limit!=0){
                output_I_limit=0;//禁止輸出
                tim4_timer2=200;
              }
            }else if(adc_buf<9718){//大于70度
              if(output_I_limit!=100){
                output_I_limit=100;//限流10A
                tim4_timer2=200;
              }
            }else if(adc_buf<11244){//大于65度
              if(output_I_limit!=200){
                output_I_limit=200;//限流20A
                tim4_timer2=200;
              }
            }else if(adc_buf<13004){//大于60度
              if(output_I_limit!=300){
                output_I_limit=300;//限流30A
                tim4_timer2=200;
              }
            }else if(adc_buf<15019){//大于55度
              if(output_I_limit!=400){
                output_I_limit=400;//限流40A
                tim4_timer2=200;
              }
            }
          }
        }
        
        if(is_fan_need_to_speed_up){
          if(TIM2_CCR1H!=0xFF)TIM2_CCR1H++;
          TIM2_CCR1L=0xFF;
        }else{
          if(TIM2_CCR1H)TIM2_CCR1H--;
          TIM2_CCR1L=0;
        }
        is_fan_need_to_speed_up=0;
        
        
        adc_now_ch=0;//切換到主溫度ADC
        ADC_CSR=0x04;//選定ch4
        break;
      }
      adc_step=1;
      break;
    case 1://預啟動ADC
      ADC_CR1_ADON=1;//啟動ADC
      _adc_buf[0]=
      _adc_buf[1]=
      _adc_buf[2]=
      _adc_buf[3]=0;
      adc_count=64;
      adc_step=2;
      
      _setV=setV;
      
      if(output_I_limit=6){
          adc_buf=((u4)_adc_buf[0]+(u4)_adc_buf[1]+(u4)_adc_buf[2]+(u4)_adc_buf[3])/4;
          adc_step=0;
        }
      }
      break;
    }
  }
  
  
  TIM4_SR_UIF=0;//取消本次中斷請求
}

v set_brightness(u1 brightness,u2 mask){
  if(brightness<=1){
    HC595_data_mask[1]=~mask;
  }else{
    HC595_data_mask[0]=
    HC595_data_mask[1]=0xFFFF;
    return;
  }
  if(brightness==0){
    HC595_data_mask[0]=HC595_data_mask[1];
    return;
  }
  HC595_data_mask[0]=0xFFFF;
}

#pragma optimize=low
s2 calculation_factory_bias(u2 a,u2 b,u2 c){
  return 
  a
  -
  (s2)(
  (u4)(c-a)//差值
  *
  5//下余縫
  /
  (b-5)//電壓差
  );
}
#pragma optimize=low
u2 calculation_factory_coefficient(u2 a,u2 b,u2 c){
  return 
  (c-a)//差值
  +
  (u2)(
  (u4)(c-a)//差值
  *
  (600-b+5)//上下余縫
  /
  (b-5)//電壓差
  );
}

#pragma optimize=low
v calculation_factory_parameters(){
  PWM_V_bias=calculation_factory_bias(
  seting_data[1]
 ,seting_data[3]
 ,seting_data[4]
  );
  
  PWM_V_coefficient=calculation_factory_coefficient(
  seting_data[1]
 ,seting_data[3]
 ,seting_data[4]
  );
  //PWM_V_coefficient+=(PWM_V_coefficient/2400);//微調補償
  PWM_V_bias+=(PWM_V_coefficient/2400);//微調補償
  
  ADC_V_bias=calculation_factory_bias(
  seting_data[2]
 ,seting_data[3]
 ,seting_data[5]
  );
  
  ADC_V_coefficient=calculation_factory_coefficient(
  seting_data[2]
 ,seting_data[3]
 ,seting_data[5]
  );
  //ADC_V_coefficient-=(ADC_V_coefficient/2400);//微調補償
  ADC_V_bias-=(ADC_V_coefficient/2400);//微調補償
  
  PWM_I_bias=calculation_factory_bias(
  seting_data[1+5]
 ,seting_data[3+5]
 ,seting_data[4+5]
  );
  
  PWM_I_coefficient=calculation_factory_coefficient(
  seting_data[1+5]
 ,seting_data[3+5]
 ,seting_data[4+5]
  );
  //PWM_I_coefficient+=(PWM_I_coefficient/2400);//微調補償
  PWM_I_bias+=(PWM_I_coefficient/2400);//微調補償
  
  ADC_I_bias=calculation_factory_bias(
  seting_data[2+5]
 ,seting_data[3+5]
 ,seting_data[5+5]
  );
  
  ADC_I_coefficient=calculation_factory_coefficient(
  seting_data[2+5]
 ,seting_data[3+5]
 ,seting_data[5+5]
  );
  //ADC_I_coefficient-=(ADC_I_coefficient/2400);//微調補償
  ADC_I_bias-=(ADC_I_coefficient/2400);//微調補償
}


u1 mod(){//求模運算,用main_u2x傳參
  u1 result;
  result=main_u2x%10;
  main_u2x/=10;
  return result;
}

u1 show_str(const u2 *str,u1 t3){//str是字符串指針,t3是字符串的當前要顯示的字符位置
  main_x=str[0];//main_x = 字符串長度
  if(main_x>6){
    showing_data[1]=showing_data[2] & (~_Dpy_wei_2) | _Dpy_wei_1;
    showing_data[2]=showing_data[3] & (~_Dpy_wei_3) | _Dpy_wei_2;
    showing_data[3]=showing_data[4] & (~_Dpy_wei_4) | _Dpy_wei_3;
    showing_data[4]=showing_data[5] & (~_Dpy_wei_5) | _Dpy_wei_4;
    showing_data[5]=showing_data[6] & (~_Dpy_wei_6) | _Dpy_wei_5;
    showing_data[6]=Dpy_wei_6 & str[t3+1];
    t3++;
    if(t3>=main_x)t3=0;
  }else{
    showing_data[1]=Dpy_wei_1 & str[1];
    showing_data[2]=Dpy_wei_2 & str[2];
    showing_data[3]=Dpy_wei_3 & str[3];
    showing_data[4]=Dpy_wei_4 & str[4];
    showing_data[5]=Dpy_wei_5 & str[5];
    showing_data[6]=Dpy_wei_6 & str[6];
    t3=0;
  }

  return t3;

}

u1 UI_timeout_timer(){
  return ++UI_time_out>=20;
}
u1 flashing_FSM=1;//數碼管閃爍專用狀態機,0=暗,1=亮
v FSM_Reverse(){
  flashing_FSM=!flashing_FSM;
}

v display_left_1_digital(){//用main_u2x傳參要顯示的數值,用main_x傳參亮度
  showing_data[0]=Dpy_wei_0 & duanma[(u1)main_u2x];
  
  set_brightness(main_x,_Dpy_wei_0);
}

v display_left_3_digital(){//用main_u2x傳參要顯示的數值,用main_x傳參亮度
  if(main_u2x & 0x8000){//是負數
    main_u2x=(~main_u2x)+1;
    showing_data[1]=Dpy_wei_1 & Dpy_duan_negative;
  }else{
    showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
  }
  showing_data[3]=Dpy_wei_3 & duanma[mod()];
  showing_data[2]=Dpy_wei_2 & duanma[mod()] & Dpy_duan_dp;
  
  if(LOW(main_u2x)=mod()){
    showing_data[1]=Dpy_wei_1 & duanma[LOW(main_u2x)];
  }
  
  set_brightness(main_x,_Dpy_wei_1 | _Dpy_wei_2 | _Dpy_wei_3);
}
v display_right_3_digital(){//用main_u2x傳參要顯示的數值,用main_x傳參亮度
  if(main_u2x & 0x8000){//是負數
    main_u2x=(~main_u2x)+1;
    showing_data[4]=Dpy_wei_4 & Dpy_duan_negative;
  }else{
    showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
  }
  showing_data[6]=Dpy_wei_6 & duanma[mod()];
  showing_data[5]=Dpy_wei_5 & duanma[mod()] & Dpy_duan_dp;
  
  if(LOW(main_u2x)=mod()){
    showing_data[4]=Dpy_wei_4 & duanma[LOW(main_u2x)];
  }
  
  set_brightness(main_x,_Dpy_wei_4 | _Dpy_wei_5 | _Dpy_wei_6);
}

v (*fp_display_PWM_value)();
v display_PWM_value(){//用main_u2x傳參要顯示的數值,用main_x傳參亮度
  if(fp_display_PWM_value){
    PWM=main_u2x;
    fp_display_PWM_value();//用此函數設置PWM輸出
  }
  showing_data[6]=Dpy_wei_6 & duanma[mod()];
  showing_data[5]=Dpy_wei_5 & duanma[mod()];
  showing_data[4]=Dpy_wei_4 & duanma[mod()];
  showing_data[3]=Dpy_wei_3 & duanma[mod()];
  
  set_brightness(main_x,_Dpy_wei_3 | _Dpy_wei_4 | _Dpy_wei_5 | _Dpy_wei_6);
  
}
v chkbmq(){//判斷編碼器狀態
  if(bmq_turning){
    if(PB4I==0){
      bmq_status1=0;
      bmq_last_up=0;
      bmq_idel_time=0;
    }else if(PB5I==0){
      bmq_status2=0;
      bmq_last_up=1;
      bmq_idel_time=0;
    }
  }else{
    if(PB4I==0){
      bmq_turning=1;
      bmq_status1=0;
      bmq_frist_down=0;
      bmq_last_up=0;
      bmq_idel_time=0;
    }else if(PB5I==0){
      bmq_turning=1;
      bmq_status2=0;
      bmq_frist_down=1;
      bmq_last_up=1;
      bmq_idel_time=0;
    }
  }
}

#pragma optimize=low
v bmq_wait_event(){
  btn_event=0;
  user_timer1=10;
  do{
    chkbmq();
    if(btn_event)return;
  }while(user_timer1);
}

s2 bmq_turn_mgr_seting_data;
u1 bmq_turn_mgr_speed_coefficient;
s2 bmq_turn_mgr_number_upper_limit;
s2 bmq_turn_mgr_number_lower_limit;
v (*fp_bmq_turn_mgr_display)();

#pragma optimize=low
v bmq_turn_mgr(){
  if(fp_bmq_turn_mgr_display){
    main_u2x=bmq_turn_mgr_seting_data;//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    fp_bmq_turn_mgr_display();
  }
  bmq_wait_event();
  switch(btn_event){
  case 0x01://編碼器正轉
    
    
    if(bmq_last2_time>252){
      main_x=252;
    }else{
      main_x=bmq_last2_time;
    }
    
    bmq_turn_mgr_seting_data+=((252-main_x)/bmq_turn_mgr_speed_coefficient)+1;
    if(bmq_turn_mgr_seting_data>bmq_turn_mgr_number_upper_limit){
      bmq_turn_mgr_seting_data=bmq_turn_mgr_number_upper_limit;
    }
    
    flashing_FSM=1;
    UI_time_out=0;
    return;
  case 0xFF://編碼器反轉
    
    
    if(bmq_last2_time>252){
      main_x=252;
    }else{
      main_x=bmq_last2_time;
    }

    bmq_turn_mgr_seting_data-=((252-main_x)/bmq_turn_mgr_speed_coefficient)+1;
    if(bmq_turn_mgr_seting_data全亮閃爍模式
  
  bmq_turn_mgr_seting_data=factory_mode_seting_PWM_PWMdata;
  bmq_turn_mgr_speed_coefficient=1;
  bmq_turn_mgr_number_upper_limit=9999;
  bmq_turn_mgr_number_lower_limit=0;
  fp_bmq_turn_mgr_display=display_PWM_value;
  
  if(factory_mode_setV_or_setI){//電流PWM
    PWM=800;//輸出5V左右
    set_V_PWM();//用main_u2x做傳入參數
    fp_display_PWM_value=set_I_PWM;
  }else{//電壓PWM
    PWM=5000;//輸出25A左右
    set_I_PWM();//用main_u2x做傳入參數
    fp_display_PWM_value=set_V_PWM;
  }
  
  while(1){
    bmq_turn_mgr();
    
    if(btn_event==0x02){
      factory_mode_seting_PWM_PWMdata=bmq_turn_mgr_seting_data;
      
      
      PWM=0;
      set_I_PWM();//用main_u2x做傳入參數
      set_V_PWM();
      
      return;
    }
    
  }
}





s2 eeprom_buf1;
s2 eeprom_buf2;
v eeprom_read_addrx8(){//用main_x傳參確定地址
  eep_addr=(u1 *)(EEPROM_ADDRESS+(8*main_x));
  
  eeprom_buf1=*(s2 *)eep_addr;
  if(eeprom_buf1 != ((*(s2 *)(eep_addr+2))^0xADB5)){
    eeprom_buf1=0;
  }
  
  eeprom_buf2=*(s2 *)(eep_addr+4);
  if(eeprom_buf2 != ((*(s2 *)(eep_addr+6))^0xADB5)){
    eeprom_buf2=0;
  }
}
v eeprom_write_unlock_addrx8(){//用main_x傳參確定地址
  FLASH_DUKR = 0xAE;//EEPROM解鎖密碼
  FLASH_DUKR = 0x56;//EEPROM解鎖密碼
  while(FLASH_IAPSR_DUL==0);//等待解密就緒

  eep_addr=(u1 *)(EEPROM_ADDRESS+(8*main_x));
}
v eeprom_write(){
  FLASH_CR2_WPRG=1;//啟用字(4字節)寫入模式
  FLASH_NCR2_NWPRG=0;//啟用字(4字節)寫入模式
  *eep_addr++=HIGH(eeprom_buf1);
  *eep_addr++=LOW(eeprom_buf1);
  *eep_addr++=HIGH(eeprom_buf1)^0xAD;
  *eep_addr++=LOW(eeprom_buf1)^0xB5;
}
#define eeprom_write_lock() FLASH_IAPSR_DUL=0


u1 t1,t3;

#pragma optimize=low
v main(){
  CLK_CKDIVR_HSIDIV=0;//主時鐘不分頻


  {//初始化TIM1(用于PWM輸出,控制電壓電流)
    TIM1_PSCRH = 0;//計數器不分頻
    TIM1_PSCRL = 0;//計數器不分頻
    
    //初始化自動裝載寄存器,決定PWM的頻率,PWM頻率=計數器頻率/100
    TIM1_ARRH = 0;
    TIM1_ARRL = (100-1);
    
    {//ch1
      TIM1_CCMR1_OC1M=7;//PWM模式2(比較輸出方式)
      TIM1_CCER1_CC1P=1;//PWM極性(1=正相輸出,0=反相輸出)
      TIM1_CCER1_CC1E=1;//開啟輸出引腳
      
      //初始化比較寄存器,決定PWM的占空比
      TIM1_CCR1H = 0;
      TIM1_CCR1L = 0;
    }
    
    {//ch2
      TIM1_CCMR2_OC2M=7;//PWM模式2(比較輸出方式)
      TIM1_CCER1_CC2P=1;//PWM極性(1=正相輸出,0=反相輸出)
      TIM1_CCER1_CC2E=1;//開啟輸出引腳
      
      //初始化比較寄存器,決定PWM的占空比
      TIM1_CCR2H = 0;
      TIM1_CCR2L = 0;
    }
    
    {//ch3
      TIM1_CCMR3_OC3M=7;//PWM模式2(比較輸出方式)
      TIM1_CCER2_CC3P=1;//PWM極性(1=正相輸出,0=反相輸出)
      TIM1_CCER2_CC3E=1;//開啟輸出引腳
      
      //初始化比較寄存器,決定PWM的占空比
      TIM1_CCR3H = 0;
      TIM1_CCR3L = 0;
    }
    
    {//ch4
      TIM1_CCMR4_OC4M=7;//PWM模式2(比較輸出方式)
      TIM1_CCER2_CC4P=1;//PWM極性(1=正相輸出,0=反相輸出)
      TIM1_CCER2_CC4E=1;//開啟輸出引腳
      
      //初始化比較寄存器,決定PWM的占空比
      TIM1_CCR4H = 0;
      TIM1_CCR4L = 0;
    }
    TIM1_BKR_MOE=1;//TIM1主輸出使能
    TIM1_CR1_CEN=1;//啟動計數
  }
  
  {//初始化TIM2(用于PWM輸出,控制風扇速度)
    TIM2_PSCR = 0;//計數器不分頻
    
    //初始化自動裝載寄存器,決定PWM的頻率,PWM頻率=計數器頻率/255
    TIM2_ARRH = 0xFF;
    TIM2_ARRL = 0xFF;
    
    {//ch1
      TIM2_CCMR1_OC1M=7;//PWM模式2(比較輸出方式)
      TIM2_CCER1_CC1P=1;//PWM極性(1=正相輸出,0=反相輸出)
      TIM2_CCER1_CC1E=1;//開啟輸出引腳
      
      //初始化比較寄存器,決定PWM的占空比
      TIM2_CCR1H = 0;
      TIM2_CCR1L = 0;
    }
    TIM2_CR1_CEN=1;//啟動計數
  }
  //*
  {//初始化TIM4(用于時間基準)
    TIM4_PSCR_PSC = 3;//8分頻
    TIM4_CNTR = 0; // 計數器初值
    TIM4_ARR = 200-1;// 自動裝載(每秒溢出1萬次)
    TIM4_IER_UIE = 1;// 啟用更新中斷
    TIM4_CR1_CEN = 1; // 啟動計數
    
//    ITC_VECT23SPR=0;//TIM4中斷優先級2/3
  }
  //*/
  
  {//初始化ADC
    ADC_TDRL=HEXTOBIT(0x01111000);//ch3、ch4、ch5、ch6關閉施密特輸入
    ADC_CR1_SPSEL=4;//ADC時鐘8分頻
    //ADC_CR1_CONT=1;//連續模式
    ADC_CR2_ALIGN=1;//數據右對齊
    //ADC_CR3_DBUF=1;//使用緩存模式
    //ADC_CSR=0x04;//選定ch4
    ADC_CR1_ADON=1;//打開ADC電源
    //ADC_CR1_ADON=1;//啟動ADC
  }
  
  {//初始化74HC595
    PBinit(A,1,1,1,0);//SCLK
    PBinit(A,2,1,1,0);//CLK
    PBinit(D,4,1,1,1);//DATA
    
    PA1O=1;
    PA2O=1;
    PD4O=1;
    
    HC595_data=0;
    hc595_update();
  }
  {//初始化編碼器、按鍵
    PBinit(B,4,0,0,0);//編碼器1
    PBinit(B,5,0,0,0);//編碼器2
    PBinit(A,3,0,1,0);//按鍵
  }//*
  {//初始化其他IO
    PBinit(C,5,1,1,0);//風扇控制
    PC5O=0;
  }//*/
  
  asm("rim");//開全局中斷
  
  //goto factory_mode;
  
  {//一秒鐘內全亮數碼管
    showing_data[0]=Dpy_wei_0 & Dpy_duan_all;
    showing_data[1]=Dpy_wei_1 & Dpy_duan_all;
    showing_data[2]=Dpy_wei_2 & Dpy_duan_all;
    showing_data[3]=Dpy_wei_3 & Dpy_duan_all;
    showing_data[4]=Dpy_wei_4 & Dpy_duan_all;
    showing_data[5]=Dpy_wei_5 & Dpy_duan_all;
    showing_data[6]=Dpy_wei_6 & Dpy_duan_all;
      user_timer1=40;
      do{
      }while(user_timer1);
  }
  
  
  if(PA3I==0){//按住編碼器再開機的,跳到工廠模式
    t3=0;
    showing_data[0]=0x0000;
    showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
    showing_data[2]=Dpy_wei_2 & Dpy_duan_null;
    showing_data[3]=Dpy_wei_3 & Dpy_duan_null;
    showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
    showing_data[5]=Dpy_wei_5 & Dpy_duan_null;
    showing_data[6]=Dpy_wei_6 & Dpy_duan_null;
    while(1){
      t3=show_str(str_0,t3);
      
      user_timer1=10;
      do{
        if(btn_event==0)continue;
        switch(btn_event){
        case 0x02://短按
          
          goto factory_mode;
        case 0x03://長按
          if(PA3I){
            btn_event=0;
            goto factory_mode;
          }
          break;
        default:
          btn_event=0;
        }
      }while(user_timer1);
    }
  }

start_up:
  
  {//讀取EEPROM工廠模式的參數
    main_x=15;
    eeprom_read_addrx8();
    PWM_V_bias=eeprom_buf1;
    PWM_V_coefficient=eeprom_buf2;
    
    main_x=16;
    eeprom_read_addrx8();
    PWM_I_bias=eeprom_buf1;
    PWM_I_coefficient=eeprom_buf2;
    
    main_x=17;
    eeprom_read_addrx8();
    ADC_V_bias=eeprom_buf1;
    ADC_V_coefficient=eeprom_buf2;
    
    main_x=18;
    eeprom_read_addrx8();
    ADC_I_bias=eeprom_buf1;
    ADC_I_coefficient=eeprom_buf2;
  }
  
  {//讀取EEPROM默認電壓電流
    main_x=0;
    eeprom_read_addrx8();
    setV=eeprom_buf1;
    setI=eeprom_buf2;
    output_PWM_update=1;
  }
  
  //flashing_style[0]=0;//滅<->亮閃爍模式
  flashing_FSM=1;
  UI_time_out=0;
  showing_data[0]=0x0000;
  
  main_x=2;//傳參給下面這個函數
  main_u2x=setV;//傳參給下面這個函數
  display_left_3_digital();
  main_u2x=setI;//傳參給下面這個函數
  display_right_3_digital();
  
  while(1){//開機延遲5秒再輸出電壓
    
    if(flashing_FSM){//亮
      HC595_data_mask[0]=0xFFFF;
      HC595_data_mask[1]=0xFFFF;
    }else{//滅
      HC595_data_mask[0]=0x0000;
      HC595_data_mask[1]=0x0000;
    }
    
    bmq_wait_event();
    if(btn_event){
      if(btn_event==0x02){//按鈕短按
        
      }
      goto main_UI;
    }
    
    
    FSM_Reverse();
    
    if(UI_timeout_timer()){
      //5秒無動作,啟動輸出,跳到主菜單
      is_output_ON=1;
      output_PWM_update=1;
      goto main_UI;
    }
  }
  
  
main_UI:
  
  
  flashing_FSM=0;//閃爍狀態機
  flashing_style[0]=0;//滅<->亮閃爍模式
  UI_time_out=0;
  t3=0;
  while(1){//默認主界面
    showing_data[0]=0x0000;
    
    main_x=2;//傳參給下面這個函數
    main_u2x=nowV;//傳參給下面這個函數
    display_left_3_digital();
    
    if(is_output_ON){
      flashing_FSM=1;
      
      if(_setI!=setI){//限流保護狀態,電流閃爍指示
        t3++;
        if(!(t3&0x05)){
          flashing_FSM=0;
        }
      }
      
      main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
      main_u2x=nowI;//傳參給下面這個函數
      display_right_3_digital();
      
    }else{
      showing_data[4]=Dpy_wei_4&Dpy_duan_o;
      showing_data[5]=Dpy_wei_5&Dpy_duan_f;
      showing_data[6]=Dpy_wei_6&Dpy_duan_f;
    }
    //HC595_data_mask[0]=0xFFFF;
    //HC595_data_mask[1]=0xFFFF;
    
    btn_event=0;
    user_timer1=6;
    do{
      chkbmq();
      if(btn_event==0)continue;
      switch(btn_event){
      case 0x01://編碼器正轉
        
        goto set_I;
      case 0x02://按鈕短按 = 開啟輸出/關閉輸出
        
        is_output_ON=!is_output_ON;//打開輸出/關閉輸出
        output_PWM_update=1;
        goto main_UI;
      case 0xFF://編碼器反轉
        
        goto set_V;
      case 0x03://按鈕長按
        
        goto seting_storage_write;
      //default:
        
      }
    }while(user_timer1);
  }
  
continuous_adjustment_mode_V:
  showing_data[0]=0x0000;
  is_output_ON=1;
  UI_time_out=0;
  t3=0;
  
  flashing_FSM=1;//閃爍狀態機
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  
  bmq_turn_mgr_seting_data=setV;
  bmq_turn_mgr_speed_coefficient=12;
  bmq_turn_mgr_number_upper_limit=600;
  bmq_turn_mgr_number_lower_limit=0;
  
  while(1){
    setV=bmq_turn_mgr_seting_data;
    output_PWM_update=1;
    
    main_x=2;
    main_u2x=nowI;//傳參給下面這個函數
    display_right_3_digital();
    
    fp_bmq_turn_mgr_display=display_left_3_digital;
    if(++UI_time_out>=8){
      UI_time_out=8;
      fp_bmq_turn_mgr_display=NULL;
      
      main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
      main_u2x=nowV;//傳參給下面這個函數
      display_left_3_digital();
    }
    bmq_turn_mgr();
    switch(btn_event){
    case 0x02://短按
      
      main_x=0;
      eeprom_write_unlock_addrx8();
      eeprom_buf1=setV;
      eeprom_write();
      eeprom_write_lock();
      
      goto main_UI;
    }
  }
  
continuous_adjustment_mode_I:
  showing_data[0]=0x0000;
  is_output_ON=1;
  UI_time_out=0;
  t3=0;
  
  flashing_FSM=1;//閃爍狀態機
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  
  bmq_turn_mgr_seting_data=setI;
  bmq_turn_mgr_speed_coefficient=12;
  bmq_turn_mgr_number_upper_limit=500;
  bmq_turn_mgr_number_lower_limit=0;
  
  while(1){
    setI=bmq_turn_mgr_seting_data;
    output_PWM_update=1;
    
    main_x=2;
    main_u2x=nowV;//傳參給下面這個函數
    display_left_3_digital();
    
    fp_bmq_turn_mgr_display=display_right_3_digital;
    if(++UI_time_out>=8){
      UI_time_out=8;
      fp_bmq_turn_mgr_display=NULL;
      
      main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
      main_u2x=nowI;//傳參給下面這個函數
      display_right_3_digital();
    }
    bmq_turn_mgr();
    switch(btn_event){
    case 0x02://短按
      
      main_x=0;
      eeprom_write_unlock_addrx8();
      eep_addr+=4;
      eeprom_buf1=setI;
      eeprom_write();
      eeprom_write_lock();
      
      goto main_UI;
    }
  }
  
  
  
  
set_storage://選中存取位
  main_x=2;//傳參給下面這個函數
  main_u2x=setV;//傳參給下面這個函數
  display_left_3_digital();
  main_u2x=setI;//傳參給下面這個函數
  display_right_3_digital();
  
  //showV(setV,0);
  //showI(setI,0);
  flashing_FSM=0;//閃爍狀態機
  flashing_style[0]=0;//滅<->亮閃爍模式
  UI_time_out=0;
  while(1){
    main_u2x=10;
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_left_1_digital();
    
    bmq_wait_event();
    switch(btn_event){
    case 0x01://編碼器正轉
      
      goto set_V;
    case 0xFF://編碼器反轉
      
      goto set_I;
    case 0x02://短按
      
      goto seting_storage_read;
    }
    FSM_Reverse();
    
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
seting_storage_read:
  showing_data[0]=
  showing_data[1]=
  showing_data[2]=
  showing_data[5]=
  showing_data[6]=0x0000;
  t1=0;
  t3=0;
  while(1){//讀取提示動畫
    switch(t3){//動畫處理
    case 0:
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_C);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_E);
      t3=1;
      break;
    case 1:
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_B);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_F);
      t3=2;
      break;
    case 2:
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_A);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_A);
      t3=3;
      break;
    case 3:
      showing_data[3]=0x0000;
      showing_data[4]=0x0000;
      showing_data[3]=Dpy_wei_2&(~_Dpy_duan_A);
      showing_data[4]=Dpy_wei_5&(~_Dpy_duan_A);
      t3=4;
      break;
    case 4:
      showing_data[2]=0x0000;
      showing_data[5]=0x0000;
      showing_data[3]=Dpy_wei_1&(~_Dpy_duan_A);
      showing_data[4]=Dpy_wei_6&(~_Dpy_duan_A);
      t3=5;
      break;
    default:
      showing_data[1]=0x0000;
      showing_data[6]=0x0000;
      goto seting_storage_read2;
    }
    btn_event=0;
    user_timer1=5;
    do{
      chkbmq();
      if(btn_event==0)continue;
      switch(btn_event){
      case 0x01://編碼器正轉
      case 0xFF://編碼器反轉
        goto seting_storage_read2;
      }
      
    }while(user_timer1);
  }
seting_storage_read2:
  flashing_FSM=0;
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  UI_time_out=0;
  
  bmq_turn_mgr_seting_data=1;
  bmq_turn_mgr_speed_coefficient=255;
  bmq_turn_mgr_number_upper_limit=9;
  bmq_turn_mgr_number_lower_limit=1;
  fp_bmq_turn_mgr_display=display_left_1_digital;
  
  while(1){
    main_x=(u1)bmq_turn_mgr_seting_data;//傳參給下面這個函數
    eeprom_read_addrx8();
    
    main_x=2;//傳參給下面這個函數
    main_u2x=eeprom_buf1;//傳參給下面這個函數
    display_left_3_digital();
    main_u2x=eeprom_buf2;//傳參給下面這個函數
    display_right_3_digital();
    
    bmq_turn_mgr();
    
    switch(btn_event){
    case 0x02://短按
      
      setV=eeprom_buf1;
      setI=eeprom_buf2;
      output_PWM_update=1;
      
      main_x=0;
      eeprom_write_unlock_addrx8();
      eeprom_write();
      eeprom_buf1=eeprom_buf2;
      eeprom_write();
      eeprom_write_lock();
      goto main_UI;
    }
    
      
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
  
set_V://選中電壓
  showing_data[0]=Dpy_wei_0&Dpy_duan_negative;//橫杠
  
  main_u2x=setI;//傳參給下面這個函數
  main_x=2;//傳參給下面這個函數
  display_right_3_digital();
  
  flashing_FSM=0;//閃爍狀態機
  flashing_style[0]=0;//滅<->亮閃爍模式
  UI_time_out=0;
  while(1){
    main_u2x=setV;//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_left_3_digital();
    
    bmq_wait_event();
    switch(btn_event){
    case 0x01://編碼器正轉
      
      goto set_I;
    case 0xFF://編碼器反轉
      
      goto set_storage;
    case 0x02://短按
      
      goto seting_V;
    case 0x03://長按
      
      goto continuous_adjustment_mode_V;
    }
    
    FSM_Reverse();
    
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
seting_V://調節電壓
  flashing_FSM=1;//閃爍狀態機
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  UI_time_out=0;
  
  bmq_turn_mgr_seting_data=setV;
  bmq_turn_mgr_speed_coefficient=12;
  bmq_turn_mgr_number_upper_limit=600;
  bmq_turn_mgr_number_lower_limit=0;
  fp_bmq_turn_mgr_display=display_left_3_digital;
  
  while(1){
    bmq_turn_mgr();
    switch(btn_event){
    case 0x02://短按
      
      setV=bmq_turn_mgr_seting_data;
      output_PWM_update=1;
      
      main_x=0;
      eeprom_write_unlock_addrx8();
      eeprom_buf1=setV;
      eeprom_write();
      eeprom_write_lock();
      
      goto main_UI;
    }
    
    
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
set_I://選中電流
  showing_data[0]=Dpy_wei_0&Dpy_duan_negative;//橫杠
  
  main_u2x=setV;//傳參給下面這個函數
  main_x=2;//傳參給下面這個函數
  display_left_3_digital();
  
  //showV(setV,0);
  flashing_FSM=0;//閃爍狀態機
  flashing_style[0]=0;//滅<->亮閃爍模式
  UI_time_out=0;
  while(1){
    main_u2x=setI;//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_right_3_digital();
    
    bmq_wait_event();
    
    switch(btn_event){
    case 0x01://編碼器正轉
      
      goto set_storage;
    case 0xFF://編碼器反轉
      
      goto set_V;
    case 0x02://短按
      
      goto seting_I;
    case 0x03://長按
      
      goto continuous_adjustment_mode_I;
    }
    
    FSM_Reverse();
      
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
seting_I://調節電流
  flashing_FSM=1;//閃爍狀態機
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  UI_time_out=0;
  
  bmq_turn_mgr_seting_data=setI;
  bmq_turn_mgr_speed_coefficient=12;
  bmq_turn_mgr_number_upper_limit=500;
  bmq_turn_mgr_number_lower_limit=0;
  fp_bmq_turn_mgr_display=display_right_3_digital;
  while(1){
    bmq_turn_mgr();
    switch(btn_event){
    case 0x02://短按
      
      setI=bmq_turn_mgr_seting_data;
      output_PWM_update=1;
      
      main_x=0;
      eeprom_write_unlock_addrx8();
      eep_addr+=4;
      eeprom_buf1=setI;
      eeprom_write();
      eeprom_write_lock();
      
      goto main_UI;
    }
    
    
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
  
seting_storage_write:
  showing_data[0]=
  showing_data[2]=
  showing_data[3]=
  showing_data[4]=
  showing_data[5]=0x0000;
  t1=0;
  t3=0;
  while(1){//存儲提示動畫
    switch(t3){//動畫處理
    case 0:
      showing_data[1]=Dpy_wei_1&(~_Dpy_duan_A);
      showing_data[6]=Dpy_wei_6&(~_Dpy_duan_A);
      t3=1;
      break;
    case 1:
      showing_data[1]=0x0000;
      showing_data[6]=0x0000;
      showing_data[2]=Dpy_wei_2&(~_Dpy_duan_A);
      showing_data[5]=Dpy_wei_5&(~_Dpy_duan_A);
      
      t3=2;
      break;
    case 2:
      showing_data[2]=0x0000;
      showing_data[5]=0x0000;
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_A);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_A);
      t3=3;
      break;
    case 3:
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_B);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_F);
      t3=4;
      break;
    case 4:
      showing_data[3]=Dpy_wei_3&(~_Dpy_duan_C);
      showing_data[4]=Dpy_wei_4&(~_Dpy_duan_E);
      t3=5;
      break;
    default:
      showing_data[3]=0x0000;
      showing_data[4]=0x0000;
      goto seting_storage_write2;
    }
    btn_event=0;
    user_timer1=5;
    do{
      chkbmq();
      if(btn_event==0)continue;
      switch(btn_event){
      case 0x01://編碼器正轉
      case 0xFF://編碼器反轉
        goto seting_storage_write2;
      }
    }while(user_timer1);
  }
seting_storage_write2:
  flashing_FSM=0;
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  UI_time_out=0;
  
  main_x=2;
  main_u2x=setV;
  display_left_3_digital();
  main_u2x=setI;
  display_right_3_digital();
  
  bmq_turn_mgr_seting_data=1;
  bmq_turn_mgr_speed_coefficient=255;
  bmq_turn_mgr_number_upper_limit=9;
  bmq_turn_mgr_number_lower_limit=1;
  fp_bmq_turn_mgr_display=display_left_1_digital;
  
  while(1){
    bmq_turn_mgr();
    switch(btn_event){
    case 0x02://短按
      
      main_x=(u1)bmq_turn_mgr_seting_data;
      eeprom_write_unlock_addrx8();
      eeprom_buf1=setV;
      eeprom_write();
      eeprom_buf1=setI;
      eeprom_write();
      eeprom_write_lock();
      
      goto main_UI;
    }
    
    if(UI_timeout_timer()){
      //5秒無動作
      goto main_UI;
    }
  }
  
  
factory_mode://工廠模式
  seting_data[0]=1;//最左邊的數碼管的數字
  
  main_x=10;
  eeprom_read_addrx8();
  seting_data[1]=eeprom_buf1;
  seting_data[2]=eeprom_buf2;
  
  main_x=11;
  eeprom_read_addrx8();
  seting_data[3]=eeprom_buf1;
  seting_data[4]=eeprom_buf2;
  
  main_x=12;
  eeprom_read_addrx8();
  seting_data[5]=eeprom_buf1;
  seting_data[6]=eeprom_buf2;
  
  main_x=13;
  eeprom_read_addrx8();
  seting_data[7]=eeprom_buf1;
  seting_data[8]=eeprom_buf2;
  
  main_x=14;
  eeprom_read_addrx8();
  seting_data[9]=eeprom_buf1;
  seting_data[10]=eeprom_buf2;
  
  if(seting_data[3]<100 || seting_data[3]>600){
    seting_data[3]=600;
  }
  if(seting_data[8]<100 || seting_data[8]>400){
    seting_data[8]=100;
  }
  
  /*
  seting_data[1]=0;//0.5V對應的PWM值
  seting_data[2]=0;//0.5V對應的ADC值
  seting_data[3]=600;//9-60V之間選中的參考電壓(比例:600=60V)
  seting_data[4]=0;//9-60V之間選中的參考電壓對應的PWM值
  seting_data[5]=0;//9-60V之間選中的參考電壓對應的ADC值
  seting_data[6]=0;//0.5A對應的PWM值
  seting_data[7]=0;//0.5A對應的ADC值
  seting_data[8]=100;//9-40A之間選中的參考電流(比例:400=40A)
  seting_data[9]=0;//9-40A之間選中的參考電流對應的PWM值
  seting_data[10]=0;//9-40A之間選中的參考電流對應的ADC值
  //*/
  flashing_style[0]=0;//滅<->亮閃爍模式
factory_mode2:
  flashing_FSM=0;
factory_mode_:
  showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
  showing_data[2]=Dpy_wei_2 & Dpy_duan_null;
  showing_data[3]=Dpy_wei_3 & Dpy_duan_null;
  showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
  showing_data[5]=Dpy_wei_5 & Dpy_duan_null;
  showing_data[6]=Dpy_wei_6 & Dpy_duan_null;
  t3=0;
  while(1){
    main_u2x=seting_data[0];//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_left_1_digital();
    
    t3=show_str(str_list[LOW(seting_data[0])-1],t3);
    
    bmq_wait_event();
    switch(btn_event){
    case 0x01://編碼器正轉
      
      if(flashing_style[0]){//正在調節最左邊的數碼管
        t3=0;
        seting_data[0]++;
        if(seting_data[0]>6)seting_data[0]=6;
        flashing_FSM=1;
        goto factory_mode_;
      }else{
        switch(LOW(seting_data[0])){
        case 1:
          factory_mode_setV_or_setI=0;
          goto factory_mode_set_0_5v_or_0_5a_ref;
        case 2:
          factory_mode_setV_or_setI=0;
          goto factory_mode_set_9_60v_or_9_40a_ref;
        case 3:
          factory_mode_setV_or_setI=5;
          goto factory_mode_set_0_5v_or_0_5a_ref;
        case 4:
          factory_mode_setV_or_setI=5;
          goto factory_mode_set_9_60v_or_9_40a_ref;
        case 5:
          factory_mode_setV_or_setI=5;//代表要存儲參數
          goto factory_mode_save_or_cansel;
        default:
          factory_mode_setV_or_setI=0;//代表要放棄參數
          goto factory_mode_save_or_cansel;
        }
      }
      break;
    case 0xFF://編碼器反轉
      
      if(flashing_style[0]){//正在調節最左邊的數碼管
        t3=0;
        seting_data[0]--;
        if(seting_data[0]<1)seting_data[0]=1;
        flashing_FSM=1;
        goto factory_mode_;
      }else{
        switch(LOW(seting_data[0])){
        case 1:
          factory_mode_setV_or_setI=0;
          goto factory_mode_set_0_5v_or_0_5a_ref;
        case 2:
          factory_mode_setV_or_setI=0;
          goto factory_mode_set_9_60v_or_9_40a_ref2;
        case 3:
          factory_mode_setV_or_setI=5;
          goto factory_mode_set_0_5v_or_0_5a_ref;
        case 4:
          factory_mode_setV_or_setI=5;
          goto factory_mode_set_9_60v_or_9_40a_ref2;
        case 5:
          factory_mode_setV_or_setI=5;//代表要存儲參數
          goto factory_mode_save_or_cansel;
        default:
          factory_mode_setV_or_setI=0;//代表要放棄參數
          goto factory_mode_save_or_cansel;
        }
      }
      break;
    case 0x02://短按
      
      
      flashing_style[0]=!flashing_style[0];//切換:數值調整狀態 <--> 項目選擇狀態
      
      break;
    default:
      
      FSM_Reverse();
    }
  }
  
factory_mode_set_0_5v_or_0_5a_ref:
  flashing_FSM=0;//閃爍狀態機
  showing_data[1]=0x0000;
  showing_data[2]=0x0000;
  
  flashing_style[0]=0;//滅<->亮閃爍模式
  
  fp_display_PWM_value=NULL;
  
  while(1){
    main_u2x=seting_data[1+factory_mode_setV_or_setI];//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_PWM_value();
    
    bmq_wait_event();
    switch(btn_event){
    case 0x02://短按
      
      factory_mode_seting_PWM_PWMdata=seting_data[1+factory_mode_setV_or_setI];
      factory_mode_seting_PWM();
      if(factory_mode_setV_or_setI){//電流
        seting_data[1+5]=factory_mode_seting_PWM_PWMdata;
        seting_data[2+5]=nowI_16bit_ADC_result;
      }else{//電壓
        seting_data[1]=factory_mode_seting_PWM_PWMdata;
        seting_data[2]=nowV_16bit_ADC_result;
      }
      goto factory_mode_set_0_5v_or_0_5a_ref;
    case 0x01://編碼器正轉
    case 0xFF://編碼器反轉
      
      goto factory_mode2;
    default:
      FSM_Reverse();
    }
    
  }
  
factory_mode_set_9_60v_or_9_40a_ref:
  flashing_FSM=0;//閃爍狀態機
  if(factory_mode_setV_or_setI){//電流
    showing_data[4]=Dpy_wei_4 & Dpy_duan_a;
  }else{//電壓
    showing_data[4]=Dpy_wei_4 & Dpy_duan_v;
  }
  showing_data[5]=0x0000;
  showing_data[6]=Dpy_wei_6 & (~_Dpy_duan_D);
  
  flashing_style[0]=0;//滅<->亮閃爍模式
  
  while(1){
    main_u2x=seting_data[3+factory_mode_setV_or_setI];//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_left_3_digital();
    
    bmq_wait_event();
    switch(btn_event){
    case 0x02://短按
      
      goto factory_mode_set_9_60v_or_9_40a_ref_seting;
    case 0x01://編碼器正轉
      
      goto factory_mode_set_9_60v_or_9_40a_ref2;
    case 0xFF://編碼器反轉
      
      goto factory_mode2;
    default:
      FSM_Reverse();
    }
    
  }
  
factory_mode_set_9_60v_or_9_40a_ref_seting:
  flashing_FSM=1;//閃爍狀態機
  
  flashing_style[0]=1;//半亮<->全亮閃爍模式
  
  bmq_turn_mgr_seting_data=seting_data[3+factory_mode_setV_or_setI];
  bmq_turn_mgr_speed_coefficient=12;
  bmq_turn_mgr_number_upper_limit=600;
  if(factory_mode_setV_or_setI){
    bmq_turn_mgr_number_upper_limit=400;
  }
  bmq_turn_mgr_number_lower_limit=90;
  fp_bmq_turn_mgr_display=display_left_3_digital;
  
  while(1){
    bmq_turn_mgr();
    
    if(btn_event==0x02){
      seting_data[3+factory_mode_setV_or_setI]=bmq_turn_mgr_seting_data;
      
      goto factory_mode_set_9_60v_or_9_40a_ref;
    }
    
  }
  
factory_mode_set_9_60v_or_9_40a_ref2:
  flashing_FSM=0;//閃爍狀態機
  showing_data[1]=Dpy_wei_1 & (~_Dpy_duan_D);
  showing_data[2]=0x0000;
  
  flashing_style[0]=0;//滅<->亮閃爍模式
  
  fp_display_PWM_value=NULL;
  
  while(1){
    main_u2x=seting_data[4+factory_mode_setV_or_setI];//傳參給下面這個函數
    main_x=flashing_style[flashing_FSM];//傳參給下面這個函數
    display_PWM_value();
    
    bmq_wait_event();
    switch(btn_event){
    case 0x02://短按
      
      factory_mode_seting_PWM_PWMdata=seting_data[4+factory_mode_setV_or_setI];
      factory_mode_seting_PWM();
      if(factory_mode_setV_or_setI){//電流
        seting_data[4+5]=factory_mode_seting_PWM_PWMdata;
        seting_data[5+5]=nowI_16bit_ADC_result;
      }else{//電壓
        seting_data[4]=factory_mode_seting_PWM_PWMdata;
        seting_data[5]=nowV_16bit_ADC_result;
      }
      goto factory_mode_set_9_60v_or_9_40a_ref2;
    case 0x01://編碼器正轉
      
      goto factory_mode2;
    case 0xFF://編碼器反轉
      
      goto factory_mode_set_9_60v_or_9_40a_ref;
    default:
      FSM_Reverse();
    }
    
  }
  
factory_mode_save_or_cansel:
  flashing_FSM=0;//閃爍狀態機
  
  flashing_style[0]=0;//滅<->亮閃爍模式
  
  while(1){
    if(flashing_FSM){
      HC595_data_mask[0]=
      HC595_data_mask[1]=0xFFFF;
    }else{
      HC595_data_mask[0]=
      HC595_data_mask[1]=Dpy_wei_0;
    }
    
    bmq_wait_event();
    switch(btn_event){
    case 0x02://短按
      
      if(factory_mode_setV_or_setI==5){//存儲參數
        
        main_x=10;
        eeprom_write_unlock_addrx8();
        
        t3=1;
        do{
          eeprom_buf1=seting_data[t3];
          eeprom_write();
        }while(++t3<=10);
        
        
        calculation_factory_parameters();
        
        eeprom_buf1=PWM_V_bias;
        eeprom_write();
        eeprom_buf1=PWM_V_coefficient;
        eeprom_write();
        eeprom_buf1=PWM_I_bias;
        eeprom_write();
        eeprom_buf1=PWM_I_coefficient;
        eeprom_write();
        eeprom_buf1=ADC_V_bias;
        eeprom_write();
        eeprom_buf1=ADC_V_coefficient;
        eeprom_write();
        eeprom_buf1=ADC_I_bias;
        eeprom_write();
        eeprom_buf1=ADC_I_coefficient;
        eeprom_write();
        
        eeprom_write_lock();
      }
      
      goto start_up;
    case 0x01://編碼器正轉
    case 0xFF://編碼器反轉
      
      goto factory_mode2;
    default:
      FSM_Reverse();
    }
    
  }
  
}
0
回復
syf7150
LV.3
20
2016-05-04 22:27
@syf7150
#include"iostm8s103f3.h"#include"F:\學習筆記\單片機\stm8\my.h"/*【選項字節設置】需要激活:AFR0*//*【74HC595與數碼管連接的腳位定義】第1級74HC595的Q0對應0x0001
本層是源代碼,大家可以自己分享討論。其中可自己改動的空間非常大。只要把PCB換種參數就能支持多種電源模塊。不一定非要用2400電源。接下來準備改個0-120v,0-25A的2400。如果成功就移植到臺達電源模塊試試去。。大家動手多改造移植,才能保證電源不漲價,支持多種品牌型號的,避免技術屏蔽!
0
回復
syf7150
LV.3
21
2016-05-04 22:30
@心如刀割
關注,視頻呢?
10層有視頻鏈接,可以先看看效果
0
回復
syf7150
LV.3
22
2016-05-04 22:44
@syf7150
本層是源代碼,大家可以自己分享討論。其中可自己改動的空間非常大。只要把PCB換種參數就能支持多種電源模塊。不一定非要用2400電源。接下來準備改個0-120v,0-25A的2400。如果成功就移植到臺達電源模塊試試去。。大家動手多改造移植,才能保證電源不漲價,支持多種品牌型號的,避免技術屏蔽!
剛才問了一家賣2400的,說剛漲價了。。看來這個套件有一定影響價格!準備開始移植型號去。。
0
回復
release
LV.6
23
2016-05-05 15:01
@syf7150
#include"iostm8s103f3.h"#include"F:\學習筆記\單片機\stm8\my.h"/*【選項字節設置】需要激活:AFR0*//*【74HC595與數碼管連接的腳位定義】第1級74HC595的Q0對應0x0001
不錯,頂一個!
0
回復
lizlk
LV.10
24
2016-05-05 17:54
@syf7150
本層是源代碼,大家可以自己分享討論。其中可自己改動的空間非常大。只要把PCB換種參數就能支持多種電源模塊。不一定非要用2400電源。接下來準備改個0-120v,0-25A的2400。如果成功就移植到臺達電源模塊試試去。。大家動手多改造移植,才能保證電源不漲價,支持多種品牌型號的,避免技術屏蔽!

支持!辛苦了樓主,這代碼寫的好辛苦,建議樓主 發個.C文件上來,不然一大樓啊,呵呵。

這個硬件接口是哪些呢?

0
回復
syf7150
LV.3
25
2016-05-05 18:58
@lizlk
支持!辛苦了樓主,這代碼寫的好辛苦,建議樓主發個.C文件上來,不然一大樓啊,呵呵。這個硬件接口是哪些呢?
不太會上傳文件,說不支持.C格式。另外是這個單片機端口全部用完了。。沒留下一個,沒啥接口,全是檢測和輸出了。。要說控制也就是譯碼器和風扇,其他的端口是檢測電壓值。要不回頭把SCH圖整理下,主要是外圍很簡單。所以直接畫的PCB圖。。
0
回復
dobetter
LV.7
26
2016-05-05 19:42
@syf7150
不太會上傳文件,說不支持.C格式。另外是這個單片機端口全部用完了。。沒留下一個,沒啥接口,全是檢測和輸出了。。要說控制也就是譯碼器和風扇,其他的端口是檢測電壓值。要不回頭把SCH圖整理下,主要是外圍很簡單。所以直接畫的PCB圖。。
這個其他論壇好像有人發過~
0
回復
av-rgb
LV.6
27
2016-05-05 20:14
@syf7150
#include"iostm8s103f3.h"#include"F:\學習筆記\單片機\stm8\my.h"/*【選項字節設置】需要激活:AFR0*//*【74HC595與數碼管連接的腳位定義】第1級74HC595的Q0對應0x0001

樓主好人,能人,雖然我沒有這個電源但也要感謝樓主!

估計奸商們會漲價。

0
回復
syf7150
LV.3
28
2016-05-05 20:40
@dobetter
這個其他論壇好像有人發過~
這個是我自己焊接測試的,程序原作者已經在賣套件了。我這算是搬運工吧。。個別東西添加了些自己的東東
0
回復
syf7150
LV.3
29
2016-05-05 20:42
@syf7150
這個是我自己焊接測試的,程序原作者已經在賣套件了。我這算是搬運工吧。。個別東西添加了些自己的東東
這帖子的圖和視頻是我自己拍的,個別參數有改動。程序有改動,大家也可以自己改改參數,滿足自己需要
0
回復
6735
LV.5
30
2016-05-06 02:05
@av-rgb
樓主好人,能人,雖然我沒有這個電源但也要感謝樓主!估計奸商們會漲價。

菜鳥一個,也感謝樓主無私分享,(本人只會改電阻改變電壓),通訊電源家里也有好幾個品種。

1
回復
xiucai147
LV.1
31
2016-05-06 08:17
@syf7150
這個是我自己焊接測試的,程序原作者已經在賣套件了。我這算是搬運工吧。。個別東西添加了些自己的東東
請問有這個套件的鏈接沒啊
0
回復
主站蜘蛛池模板: 超碰97人人爱 | 伊人精品成人久久综合软件 | 免费碰碰视频在线观看 | 国产v精品成人免费视频400条 | 日本无人区码suv | 高清国产一区二区三区在线 | 五月丁香综合激情六月久久 | 尤物国精品午夜福利视频 | 漂亮人妻中文字幕丝袜 | 亚洲国产果冻传媒av在线观看 | 日韩精品视频在线观看视频 | 日韩精品一区二区三区中文无码 | 国产激情视频网站 | 91久久国产综合久久91精品网站 | 国产一及片 | 白浆在线 | 国精产品一二二区视频 | 无码男男肉片在线观看 | 三区四区在线视频 | 亚洲欧美日韩国产精品一区 | 最新国产一区二区 | 久久蜜桃资源一区二区老牛 | 国产欧美日韩亚洲精品区 | 国产极品女主播国产区 | 一区二区三区四区五区中文字幕 | 午夜精品二区 | 让少妇爽到高潮视频 | 日本黄在线观看 | 中文字幕在线看 | 国产精品日韩欧美一区二区 | 少妇又色又爽又高潮 | 天堂а在线中文在线新版 | 国产乱码精品 | 大地资源在线观看免费高清一 | 日本波多野结衣在线 | 日韩精品一区二区三区四区视频 | 亚洲第一网站男人都懂 | 国产久艹 | 久久青青草原国产精品最新片 | 亚洲激情免费 | 亚洲欧美成人中文字幕在线 |