|
求助,輝芒微FT62F211在開啟觸摸功能的時候,下電到2.5V在重新上電就會清除EEPROM數(shù)據(jù),但是程序也是正常跑沒什么問題啥。關(guān)閉觸摸功能就不掉數(shù)據(jù)了
下面是代碼
- /**********************************************************************************
- * @芯片資源
- * 1. Device: FT62F21X
- * 2. Memory: Flash 1KX14b, SRAM:64X8b EEPROM 256X8b
- *
- * 3. 文件名:main.c
- *
- //*********************************************************************************/
- #include "Touch.h"
- unsigned int led1_pwm; //led1_pwm值
- unsigned char key1_cnt; //key1按鍵計(jì)數(shù)
- unsigned char key1_short_flag; //key1按鍵短按標(biāo)志
- unsigned char led1_short_state; //led1短按狀態(tài)
- unsigned char key1_long_flag; //key1按鍵長按標(biāo)志
- unsigned char led1_long_state; //led1長按狀態(tài)
- unsigned char led1_long_darkness_lock; //led1熄滅長按狀態(tài)
- unsigned char led1_pwm_h;
- unsigned char led1_pwm_l;
- unsigned char TK_REVal; //觸摸按鍵返回值
- unsigned char EEPROMread(unsigned char EEAddr);
- void EEPROMwrite(unsigned char EEAddr , unsigned char Data);
- void scann_key(unsigned char ucKeySingle)
- {
- switch(ucKeySingle)
- {
- /******************************** case 0 *************************************/
- case 0:
- /* 按鍵松開,結(jié)束計(jì)數(shù)*/
- key1_cnt = 0;
- /*key1按鍵短按處理*/
- if(key1_short_flag)
- {
- if(led1_short_state == 0)//led1熄滅時點(diǎn)亮
- {
- led1_pwm = led1_pwm + 100;
- if(led1_pwm > 10000)
- {
- key1_short_flag = 0;//清除key1短按標(biāo)志
- led1_short_state = 1; //led1切換短按狀態(tài)
- EEPROMwrite(0x00,P1ADTH );
- EEPROMwrite(0x01,P1ADTL );
- EEPROMwrite(0x02,key1_short_flag );
- EEPROMwrite(0x03,led1_short_state );
- EEPROMwrite(0x04,key1_long_flag );
- EEPROMwrite(0x05,led1_long_state );
- }
- }
- if(led1_short_state == 1)//led1點(diǎn)亮?xí)r熄滅
- {
- if(led1_pwm < 100)
- {
- led1_pwm = 0;
- key1_short_flag = 0;//清除key1短按標(biāo)志
- led1_short_state = 0; //led1切換短按狀態(tài)
- led1_long_state = 0;//清除led1長按狀態(tài)
- key1_long_flag = 0;
- EEPROMwrite(0x00,(led1_pwm>>8) );
- EEPROMwrite(0x01,led1_pwm );
- EEPROMwrite(0x02,key1_short_flag );
- EEPROMwrite(0x03,led1_short_state );
- }
- else
- led1_pwm = led1_pwm - 100;
- }
- }
- /*key1按鍵長按處理*/
- if(key1_long_flag)
- {
- key1_long_flag = 0;//清除key1長按標(biāo)志
- led1_long_state = led1_long_state ^ 0x01; //切換led1長按狀態(tài)
- EEPROMwrite(0x00,P1ADTH );
- EEPROMwrite(0x01,P1ADTL );
- EEPROMwrite(0x04,key1_long_flag );
- EEPROMwrite(0x05,led1_long_state );
- }
- if(led1_long_darkness_lock)
- {
- led1_long_darkness_lock = 0;
- led1_short_state = 1;
- if(led1_long_state)
- led1_long_state =0;
- EEPROMwrite(0x00,P1ADTH );
- EEPROMwrite(0x01,P1ADTL );
- EEPROMwrite(0x03,led1_short_state );
- EEPROMwrite(0x06,led1_long_darkness_lock );
- }
- break;
- /******************************** case 1 *************************************/
- case 1:
- /*按鍵按下,開始計(jì)數(shù)*/
- key1_cnt++;
- /*計(jì)數(shù)100毫秒消抖,大約150毫秒為按鍵短按*/
- if(key1_cnt > 20)
- key1_short_flag = 1;
- /*計(jì)數(shù)大于1秒為按鍵長按*/
- if(key1_cnt > 150)
- {
- key1_cnt = 150;
- key1_short_flag = 0;//清除按鍵短按標(biāo)志
- if(led1_short_state)//檢查led1狀態(tài)
- {
- if(!led1_long_state)//長按減亮度
- {
- if(led1_pwm < 100)
- led1_pwm = 100;
- else
- led1_pwm = led1_pwm - 20;
- key1_long_flag = 1;
- }
- else if(led1_long_state)//長按加亮度
- {
- if(led1_pwm > 10000)
- led1_pwm = 10000;
- else
- led1_pwm = led1_pwm + 20;
- key1_long_flag = 1;
- }
- }
- else if(!led1_short_state)//用以led1熄滅時長按亮起
- {
- if(led1_pwm > 10000)
- led1_pwm = 10000;
- else
- led1_pwm = led1_pwm + 20;
- led1_long_darkness_lock = 1; //通知短按函數(shù) led1 已經(jīng)亮起
- }
- }
- break;
- }
- }
- /*-------------------------------------------------
- * 函數(shù)名:DelayUs
- * 功能: 短延時函數(shù) --16M-4T--大概快1%左右.
- * 輸入: Time延時時間長度 延時時長Time*2Us
- * 輸出: 無
- -------------------------------------------------*/
- void DelayUs(unsigned char Time)
- {
- unsigned char a;
- for(a=0;a<Time;a++)
- {
- NOP();
- }
- }
- /*-------------------------------------------------
- * 函數(shù)名:DelayMs
- * 功能: 短延時函數(shù) 快1%
- * 輸入: Time延時時間長度 延時時長Time ms
- * 輸出: 無
- -------------------------------------------------*/
- void DelayMs(unsigned char Time)
- {
- unsigned char a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<5;b++)
- {
- DelayUs(98);
- }
- }
- }
- /*-------------------------------------------------
- * 函數(shù)名稱:interrupt ISR
- * 功能: 定時器中斷處理函數(shù)
- * 輸入?yún)?shù):無
- * 返回參數(shù):無
- -------------------------------------------------*/
- void interrupt ISR(void)//PIC_HI-TECH使用
- {
- if(TMR2IE && TMR2IF) //10ms中斷一次
- {
- TMR2IF = 0;
- TSC_Start();
- TSC_DataProcessing();
- TK_REVal = TSC_GetSingle();
- }
- }
- /*-------------------------------------------------
- * 函數(shù)名:SYS_INITIAL
- * 功能: 上電系統(tǒng)初始化
- * 輸入: 無
- * 輸出: 無
- --------------------------------------------------*/
- void SYS_INITIAL (void)
- {
- //時鐘先8M 寫完P(guān)CON (bit7),OPTION(all bit),LVDCON(bit2),后換回16M
- OSCCON = 0B01100000;
- //WDT 32KHZ IRCF=110=8MHZ/4=4MHZ,0.25US/T
- //Bit0=1,系統(tǒng)時鐘為內(nèi)部振蕩器
- //Bit0=0,時鐘源由FOSC<2:0>決定即編譯選項(xiàng)時選擇
- OPTION = 0B00000100;
- //Bit5 T0CS Timer0時鐘源選擇
- //1-外部引腳電平變化T0CKI 0-內(nèi)部時鐘(FOSC/2)
- //Bit4 T0CKI引腳觸發(fā)方式 1-下降沿 0-上升沿
- //Bit3 PSA 預(yù)分頻器分配位 0-Timer0 1-WDT
- //Bit2:0 PS2 8個預(yù)分頻比 100 - 1:32
- LVDCON = 0x03;
- // //bit2 0:不經(jīng)過去抖電路 bit[1:0] 00:vdd 01:pa5 10:pa4 11:touch
- //
- PCON = 0x88;
- //開LVD bit3 低電壓偵測使能 bit[7:4]=1xxx 1.2v
- OSCCON = SYS_OSCCON;
- //WDT 32KHZ IRCF=110=16MHZ/4=4MHZ,0.25US/T
- T0CON0 = 0;
- //復(fù)位上T0ON默認(rèn)為1,所以需要清0
- MSCON = 0;
- //軟件關(guān)閉LVREN不然低功耗電流會變大(Options下必須選擇LVREN=SLVREN)
- INTCON = 0;
- //暫禁止所有中斷
- PORTA = 0;
- ///////////特別注意與TKCAP合打線的PIN//////////////////////////
- //對于6pin 封裝, TKCAP 與PA2 共用引腳3。
- //對于DFN8 封裝, TKCAP 與PA4 共用引腳2。
- //引腳用作TKCAP 功能時,則PA2/PA4 必須相應(yīng)地設(shè)置為輸入;
- //當(dāng)關(guān)閉Touch模塊功能時,則PA2/PA4 為通用IO功能。
- TRISA = TRISA_CONFIG;
- // 0-輸出 1-輸入
- ///////////特別注意與TKCAP合打線的PIN//////////////////////////
- WPUA = 0B00000000;
- //PA端口上拉控制 1-開上拉 0-關(guān)上拉
- PSRCA = 0B00000000;
- //PA4,PA5源電流能力設(shè)置為0
- }
- /*-------------------------------------------------
- * 函數(shù)名:TIMER2_INITIAL
- * 功能: 初始化設(shè)置定時器1
- * 設(shè)置Timer2定時時長 = (1/系統(tǒng)時鐘頻率)*4*預(yù)分頻值*后分頻值*PR2
- * = (1/16000000)*4*4*1*10000=10ms
- -------------------------------------------------*/
- void TIMER2_INITIAL (void)
- {
- T2CON0 = 0B00000001;
- //Bit[6:3]=0000,T2時鐘后分頻比1:1
- //Bit[1:0]=01,T2時鐘預(yù)分頻比1:4
- T2CON1 = 0B00000000; //Bit[2:0] 000: 指令周期 100:HIRC Timer2時鐘源選擇
- TMR2H = 0;
- TMR2L = 0; //TMR2賦初 0010 0001 0011 0100
- PR2H = 0x27;
- PR2L = 0x10; //設(shè)置PR2=10000
- //pwm初始化
- P1ADTH=0; //P1ADT賦值
- P1ADTL=0;
- P1OE=0B00000001; //P1A0輸出使能
- P1POL=0B00000000; //P1A0高電平有效
- P1CON=0B00000000;
- TMR2IF = 0; //清TIMER2中斷標(biāo)志
- TMR2IE = 1; //使能TIMER2的中斷
- TMR2ON = 1; //使能TIMER2啟動
- PEIE=1; //使能外設(shè)中斷
- GIE = 1; //使能全局中斷
- }
- /*-------------------------------------------------
- * 函數(shù)名:EEPROMread
- * 功能: 讀EEPROM數(shù)據(jù)
- * 輸入: 需要讀取數(shù)據(jù)的地址 EEAddr
- * 輸出: 對應(yīng)地址讀出的數(shù)據(jù) ReEEPROMread
- --------------------------------------------------*/
- unsigned char EEPROMread(unsigned char EEAddr)
- {
- unsigned char ReEEPROMread;
- EEADR = EEAddr;
- RD=1;
- NOP();
- NOP();
- NOP();
- NOP();
- ReEEPROMread =EEDAT;
- return ReEEPROMread;
- }
- /*-------------------------------------------------
- * 函數(shù)名:EEPROMwrite
- * 功能: 寫數(shù)據(jù)到EEPROM
- * 輸入: 需要讀取數(shù)據(jù)的地址 EEAddr
- 需要寫入的數(shù)據(jù) Data
- * 輸出: 無
- --------------------------------------------------*/
- void EEPROMwrite(unsigned char EEAddr , unsigned char Data)
- {
- GIE = 0; //寫數(shù)據(jù)必須關(guān)閉中斷
- while(GIE); //等待GIE為0
- EEADR = EEAddr; //EEPROM的地址
- EEDAT = Data; //EEPROM的寫數(shù)據(jù) EEDATA = Data;
- EEIF = 0;
- EECON1 |= 0x34; //置位WREN1,WREN2,WREN3三個變量.
- WR = 1; //置位WR啟動
- NOP();
- NOP();
- NOP();
- NOP();
- while(WR); //等待EE寫入完成
- GIE = 1;
- }
- /*------------------------------------------------------------------------------------------
- * 函數(shù)名: main
- * 功能: 主函數(shù)
- * 輸入: 無
- * 輸出: 無
- ----------------------------------------------------------------------------------------------*/
- void main(void)
- {
- /* 系統(tǒng)初始化 */
- SYS_INITIAL();
- /* 按鍵初始化 */
- TOUCH_INITIAL();
- /* 定時器2初始化 */
- TIMER2_INITIAL();
- led1_pwm_h = EEPROMread(0x00);
- led1_pwm_l = EEPROMread(0x01);
- led1_pwm = led1_pwm_l | (unsigned int)(led1_pwm_h<<8) ;
- key1_short_flag = EEPROMread(0x02);
- led1_short_state = EEPROMread(0x03);
- key1_long_flag = EEPROMread(0x04);
- led1_long_state = EEPROMread(0x05);
- led1_long_darkness_lock = EEPROMread(0x06);
- while(1)
- {
- P1ADTH = (led1_pwm>>8);
- P1ADTL = (unsigned char)led1_pwm;
- scann_key(TK_REVal);
- DelayMs(2);
- }
- }
復(fù)制代碼 電路圖
|
|