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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1679|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)大電容緩下電掉EEPROM數(shù)據(jù)的問題

[復(fù)制鏈接]
回帖獎勵 200 黑幣 回復(fù)本帖可獲得 10 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
求助,輝芒微FT62F211在開啟觸摸功能的時候,下電到2.5V在重新上電就會清除EEPROM數(shù)據(jù),但是程序也是正常跑沒什么問題啥。關(guān)閉觸摸功能就不掉數(shù)據(jù)了

下面是代碼
  1. /**********************************************************************************
  2.   * @芯片資源
  3.   * 1. Device: FT62F21X
  4.   * 2. Memory: Flash 1KX14b, SRAM:64X8b EEPROM 256X8b
  5.   *
  6.   * 3.  文件名:main.c   
  7.   *
  8. //*********************************************************************************/

  9. #include "Touch.h"
  10. unsigned int    led1_pwm;           //led1_pwm值

  11. unsigned char    key1_cnt;          //key1按鍵計(jì)數(shù)

  12. unsigned char   key1_short_flag;    //key1按鍵短按標(biāo)志

  13. unsigned char   led1_short_state;   //led1短按狀態(tài)


  14. unsigned char   key1_long_flag; //key1按鍵長按標(biāo)志

  15. unsigned char   led1_long_state;    //led1長按狀態(tài)

  16. unsigned char   led1_long_darkness_lock;    //led1熄滅長按狀態(tài)


  17. unsigned char   led1_pwm_h;
  18. unsigned char   led1_pwm_l;

  19. unsigned char TK_REVal;    //觸摸按鍵返回值

  20. unsigned char EEPROMread(unsigned char EEAddr);
  21. void EEPROMwrite(unsigned char EEAddr , unsigned char Data);

  22. void scann_key(unsigned char  ucKeySingle)
  23. {
  24.     switch(ucKeySingle)
  25.     {
  26.     /******************************** case 0 *************************************/
  27.         case 0:
  28.             /* 按鍵松開,結(jié)束計(jì)數(shù)*/
  29.             key1_cnt = 0;      

  30.             /*key1按鍵短按處理*/
  31.             if(key1_short_flag)     
  32.             {                  
  33.                 if(led1_short_state == 0)//led1熄滅時點(diǎn)亮
  34.                 {
  35.                     led1_pwm = led1_pwm + 100;
  36.                     if(led1_pwm > 10000)
  37.                     {
  38.                         key1_short_flag = 0;//清除key1短按標(biāo)志
  39.                         led1_short_state = 1; //led1切換短按狀態(tài)

  40.                         EEPROMwrite(0x00,P1ADTH );
  41.                         EEPROMwrite(0x01,P1ADTL );
  42.                         EEPROMwrite(0x02,key1_short_flag );
  43.                         EEPROMwrite(0x03,led1_short_state  );
  44.                         EEPROMwrite(0x04,key1_long_flag );
  45.                         EEPROMwrite(0x05,led1_long_state  );
  46.                     }
  47.                 }

  48.                 if(led1_short_state == 1)//led1點(diǎn)亮?xí)r熄滅
  49.                 {
  50.                     if(led1_pwm < 100)
  51.                     {
  52.                         led1_pwm = 0;
  53.                         key1_short_flag = 0;//清除key1短按標(biāo)志
  54.                         led1_short_state = 0; //led1切換短按狀態(tài)
  55.                         led1_long_state   = 0;//清除led1長按狀態(tài)
  56.                         key1_long_flag      = 0;
  57.                         EEPROMwrite(0x00,(led1_pwm>>8) );
  58.                         EEPROMwrite(0x01,led1_pwm );
  59.                         EEPROMwrite(0x02,key1_short_flag );
  60.                         EEPROMwrite(0x03,led1_short_state  );
  61.                     }
  62.                     else
  63.                         led1_pwm = led1_pwm - 100;
  64.                 }

  65.             }

  66.             /*key1按鍵長按處理*/
  67.             if(key1_long_flag)
  68.             {
  69.                 key1_long_flag = 0;//清除key1長按標(biāo)志
  70.                 led1_long_state = led1_long_state ^ 0x01; //切換led1長按狀態(tài)

  71.                 EEPROMwrite(0x00,P1ADTH );
  72.                 EEPROMwrite(0x01,P1ADTL );
  73.                 EEPROMwrite(0x04,key1_long_flag );
  74.                 EEPROMwrite(0x05,led1_long_state  );
  75.             }

  76.             if(led1_long_darkness_lock)
  77.             {
  78.                 led1_long_darkness_lock = 0;
  79.                 led1_short_state = 1;
  80.                 if(led1_long_state)
  81.                     led1_long_state =0;
  82.                 EEPROMwrite(0x00,P1ADTH );
  83.                 EEPROMwrite(0x01,P1ADTL );               
  84.                 EEPROMwrite(0x03,led1_short_state );
  85.                 EEPROMwrite(0x06,led1_long_darkness_lock );
  86.             }

  87.             break;

  88.     /******************************** case 1 *************************************/
  89.         case 1:
  90.             /*按鍵按下,開始計(jì)數(shù)*/
  91.             key1_cnt++;

  92.             /*計(jì)數(shù)100毫秒消抖,大約150毫秒為按鍵短按*/
  93.             if(key1_cnt > 20)
  94.                 key1_short_flag = 1;

  95.             /*計(jì)數(shù)大于1秒為按鍵長按*/
  96.             if(key1_cnt > 150)
  97.             {
  98.                 key1_cnt = 150;
  99.                 key1_short_flag = 0;//清除按鍵短按標(biāo)志


  100.                 if(led1_short_state)//檢查led1狀態(tài)
  101.                 {
  102.                     if(!led1_long_state)//長按減亮度
  103.                     {
  104.                         if(led1_pwm < 100)
  105.                             led1_pwm = 100;
  106.                         else                           
  107.                             led1_pwm = led1_pwm - 20;   

  108.                         key1_long_flag = 1;
  109.                     }



  110.                     else if(led1_long_state)//長按加亮度
  111.                     {
  112.                         if(led1_pwm > 10000)
  113.                             led1_pwm = 10000;
  114.                         else
  115.                             led1_pwm = led1_pwm + 20;   

  116.                         key1_long_flag = 1;
  117.                     }
  118.                 }

  119.                 else if(!led1_short_state)//用以led1熄滅時長按亮起
  120.                 {
  121.                     if(led1_pwm > 10000)
  122.                         led1_pwm = 10000;
  123.                     else
  124.                         led1_pwm = led1_pwm + 20;

  125.                     led1_long_darkness_lock = 1;    //通知短按函數(shù) led1 已經(jīng)亮起         
  126.                 }
  127.             }
  128.             break;

  129.     }
  130. }
  131. /*-------------------------------------------------
  132. * 函數(shù)名:DelayUs
  133. * 功能:  短延時函數(shù) --16M-4T--大概快1%左右.
  134. * 輸入:  Time延時時間長度 延時時長Time*2Us
  135. * 輸出:  無
  136. -------------------------------------------------*/
  137. void DelayUs(unsigned char Time)
  138. {
  139.     unsigned char a;
  140.     for(a=0;a<Time;a++)
  141.     {
  142.         NOP();
  143.     }
  144. }
  145. /*-------------------------------------------------
  146. * 函數(shù)名:DelayMs
  147. * 功能:  短延時函數(shù) 快1%
  148. * 輸入: Time延時時間長度 延時時長Time ms
  149. * 輸出: 無
  150. -------------------------------------------------*/
  151. void DelayMs(unsigned char Time)
  152. {
  153.     unsigned char a,b;
  154.     for(a=0;a<Time;a++)
  155.     {
  156.         for(b=0;b<5;b++)
  157.         {
  158.             DelayUs(98);
  159.         }
  160.     }
  161. }
  162. /*-------------------------------------------------
  163. *  函數(shù)名稱:interrupt ISR
  164. *  功能:   定時器中斷處理函數(shù)
  165. *  輸入?yún)?shù):無
  166. *  返回參數(shù):無
  167. -------------------------------------------------*/

  168. void interrupt ISR(void)//PIC_HI-TECH使用
  169. {
  170.     if(TMR2IE && TMR2IF)            //10ms中斷一次
  171.     {
  172.         TMR2IF = 0;
  173.         TSC_Start();
  174.         TSC_DataProcessing();
  175.         TK_REVal = TSC_GetSingle();
  176.     }
  177. }

  178. /*-------------------------------------------------
  179. *  函數(shù)名:SYS_INITIAL
  180. *  功能:  上電系統(tǒng)初始化
  181. *  輸入:  無
  182. *  輸出:  無
  183. --------------------------------------------------*/   

  184. void SYS_INITIAL (void)
  185. {
  186.     //時鐘先8M 寫完P(guān)CON (bit7),OPTION(all bit),LVDCON(bit2),后換回16M
  187.     OSCCON = 0B01100000;   
  188.     //WDT 32KHZ IRCF=110=8MHZ/4=4MHZ,0.25US/T
  189.     //Bit0=1,系統(tǒng)時鐘為內(nèi)部振蕩器
  190.     //Bit0=0,時鐘源由FOSC<2:0>決定即編譯選項(xiàng)時選擇

  191.     OPTION = 0B00000100;   
  192.     //Bit5 T0CS Timer0時鐘源選擇
  193.     //1-外部引腳電平變化T0CKI 0-內(nèi)部時鐘(FOSC/2)
  194.     //Bit4 T0CKI引腳觸發(fā)方式 1-下降沿 0-上升沿
  195.     //Bit3 PSA 預(yù)分頻器分配位 0-Timer0 1-WDT
  196.     //Bit2:0 PS2 8個預(yù)分頻比 100 - 1:32

  197.     LVDCON  = 0x03;         
  198. //    //bit2 0:不經(jīng)過去抖電路  bit[1:0] 00:vdd 01:pa5 10:pa4 11:touch
  199. //   
  200.     PCON = 0x88;               
  201.     //開LVD  bit3 低電壓偵測使能   bit[7:4]=1xxx 1.2v

  202.     OSCCON = SYS_OSCCON;   
  203.     //WDT 32KHZ IRCF=110=16MHZ/4=4MHZ,0.25US/T

  204.     T0CON0 = 0;                  
  205.     //復(fù)位上T0ON默認(rèn)為1,所以需要清0

  206.     MSCON = 0;                  
  207.     //軟件關(guān)閉LVREN不然低功耗電流會變大(Options下必須選擇LVREN=SLVREN)

  208.     INTCON = 0;                 
  209.     //暫禁止所有中斷

  210.     PORTA = 0;
  211.     ///////////特別注意與TKCAP合打線的PIN//////////////////////////
  212.     //對于6pin 封裝, TKCAP 與PA2 共用引腳3。
  213.     //對于DFN8 封裝, TKCAP 與PA4 共用引腳2。
  214.     //引腳用作TKCAP 功能時,則PA2/PA4 必須相應(yīng)地設(shè)置為輸入;
  215.     //當(dāng)關(guān)閉Touch模塊功能時,則PA2/PA4 為通用IO功能。

  216.     TRISA = TRISA_CONFIG;   
  217.     // 0-輸出 1-輸入  
  218.     ///////////特別注意與TKCAP合打線的PIN//////////////////////////

  219.     WPUA = 0B00000000;   
  220.     //PA端口上拉控制 1-開上拉 0-關(guān)上拉

  221.     PSRCA = 0B00000000;   
  222.     //PA4,PA5源電流能力設(shè)置為0                             
  223. }

  224. /*-------------------------------------------------
  225. * 函數(shù)名:TIMER2_INITIAL
  226. * 功能:  初始化設(shè)置定時器1
  227. * 設(shè)置Timer2定時時長 = (1/系統(tǒng)時鐘頻率)*4*預(yù)分頻值*后分頻值*PR2
  228. *                    = (1/16000000)*4*4*1*10000=10ms
  229. -------------------------------------------------*/
  230. void TIMER2_INITIAL (void)
  231. {
  232.     T2CON0 = 0B00000001;
  233.     //Bit[6:3]=0000,T2時鐘后分頻比1:1
  234.     //Bit[1:0]=01,T2時鐘預(yù)分頻比1:4

  235.     T2CON1 = 0B00000000;            //Bit[2:0] 000: 指令周期 100:HIRC Timer2時鐘源選擇   


  236.     TMR2H = 0;
  237.     TMR2L = 0;                      //TMR2賦初    0010 0001 0011 0100

  238.     PR2H = 0x27;
  239.     PR2L = 0x10;                    //設(shè)置PR2=10000

  240.     //pwm初始化
  241.     P1ADTH=0;                       //P1ADT賦值
  242.     P1ADTL=0;
  243.     P1OE=0B00000001;                //P1A0輸出使能
  244.     P1POL=0B00000000;               //P1A0高電平有效
  245.     P1CON=0B00000000;

  246.     TMR2IF = 0;                     //清TIMER2中斷標(biāo)志
  247.     TMR2IE = 1;                     //使能TIMER2的中斷
  248.     TMR2ON = 1;                     //使能TIMER2啟動

  249.     PEIE=1;                         //使能外設(shè)中斷
  250.     GIE = 1;                        //使能全局中斷
  251. }

  252. /*-------------------------------------------------
  253. * 函數(shù)名:EEPROMread
  254. * 功能:  讀EEPROM數(shù)據(jù)
  255. * 輸入:  需要讀取數(shù)據(jù)的地址 EEAddr
  256. * 輸出:  對應(yīng)地址讀出的數(shù)據(jù) ReEEPROMread
  257. --------------------------------------------------*/
  258. unsigned char EEPROMread(unsigned char EEAddr)
  259. {
  260.     unsigned char ReEEPROMread;
  261.     EEADR = EEAddr;
  262.     RD=1;
  263.     NOP();
  264.     NOP();
  265.     NOP();
  266.     NOP();
  267.     ReEEPROMread =EEDAT;
  268.     return ReEEPROMread;
  269. }
  270. /*-------------------------------------------------
  271. * 函數(shù)名:EEPROMwrite
  272. * 功能:  寫數(shù)據(jù)到EEPROM
  273. * 輸入:  需要讀取數(shù)據(jù)的地址 EEAddr
  274.            需要寫入的數(shù)據(jù)  Data
  275. * 輸出:  無
  276. --------------------------------------------------*/
  277. void EEPROMwrite(unsigned char EEAddr , unsigned char Data)
  278. {
  279.     GIE = 0;                    //寫數(shù)據(jù)必須關(guān)閉中斷
  280.     while(GIE);                 //等待GIE為0
  281.     EEADR = EEAddr;             //EEPROM的地址
  282.     EEDAT = Data;               //EEPROM的寫數(shù)據(jù)  EEDATA = Data;
  283.     EEIF = 0;
  284.     EECON1 |= 0x34;             //置位WREN1,WREN2,WREN3三個變量.
  285.     WR = 1;                     //置位WR啟動
  286.     NOP();
  287.     NOP();
  288.     NOP();
  289.     NOP();
  290.     while(WR);                  //等待EE寫入完成
  291.     GIE = 1;
  292. }

  293. /*------------------------------------------------------------------------------------------
  294. *  函數(shù)名:  main
  295. *  功能:  主函數(shù)
  296. *  輸入:  無
  297. *  輸出:  無
  298. ----------------------------------------------------------------------------------------------*/

  299. void main(void)
  300. {
  301.     /* 系統(tǒng)初始化 */
  302.     SYS_INITIAL();  
  303.     /* 按鍵初始化 */
  304.     TOUCH_INITIAL();
  305.     /* 定時器2初始化 */
  306.     TIMER2_INITIAL();

  307.     led1_pwm_h = EEPROMread(0x00);
  308.     led1_pwm_l  = EEPROMread(0x01);

  309.     led1_pwm =  led1_pwm_l | (unsigned int)(led1_pwm_h<<8) ;

  310.     key1_short_flag  = EEPROMread(0x02);
  311.     led1_short_state = EEPROMread(0x03);
  312.     key1_long_flag    = EEPROMread(0x04);
  313.     led1_long_state   = EEPROMread(0x05);
  314.     led1_long_darkness_lock = EEPROMread(0x06);




  315.     while(1)
  316.     {  
  317.         P1ADTH =  (led1_pwm>>8);
  318.         P1ADTL = (unsigned char)led1_pwm;              
  319.         scann_key(TK_REVal);
  320.         DelayMs(2);
  321.     }

  322. }
復(fù)制代碼
電路圖

430d178afbfe50af99f3df5689b5625.png (54.49 KB, 下載次數(shù): 72)

圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:883242 發(fā)表于 2024-3-1 16:56 | 只看該作者
單片機(jī)應(yīng)該是支持brownout,比如AVR單片機(jī)可以通過熔絲位設(shè)定當(dāng)電源電壓下降到4.3V或者2.7V鎖定單片機(jī),不讓單片機(jī)低壓時候程序亂飛,避免這種錯誤的發(fā)生。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99免费看 | 青青久久| 久久精品国产一区老色匹 | 国产在线小视频 | 羞羞视频网站免费观看 | 久久久久国产 | 老外几下就让我高潮了 | 美日韩精品 | 亚洲高清视频在线 | 天天插天天操 | 91视频网址 | 精品国产精品三级精品av网址 | 91极品视频| 亚洲免费av一区 | 亚洲精品高清视频在线观看 | 一道本视频 | 中文字幕视频在线观看 | 欧美久久久网站 | 国产日韩在线观看一区 | 一区在线观看视频 | 婷婷福利视频导航 | 欧美国产一区二区 | 亚洲免费在线 | www久久99 | 国产一区二区 | 久久亚洲国产精品日日av夜夜 | 中文字幕av在线 | 国产精品视频一区二区三 | 91精品国产91久久综合桃花 | 欧美在线a | 免费在线性爱视频 | 精品国产乱码久久久久久蜜柚 | 久久久区 | 狠狠操你 | 国产在线一区观看 | www.操com| 亚洲精品成人av久久 | 国产精品久久久久久久久图文区 | xxx.在线观看 | 日本精品一区二区三区视频 | 青青草网|