久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
關于單片機大電容緩下電掉EEPROM數據的問題
[打印本頁]
作者:
maiooo
時間:
2024-2-28 23:41
標題:
關于單片機大電容緩下電掉EEPROM數據的問題
求助,輝芒微FT62F211在開啟觸摸功能的時候,下電到2.5V在重新上電就會清除EEPROM數據,但是程序也是正常跑沒什么問題啥。關閉觸摸功能就不掉數據了
下面是代碼
/**********************************************************************************
* @芯片資源
* 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按鍵計數
unsigned char key1_short_flag; //key1按鍵短按標志
unsigned char led1_short_state; //led1短按狀態
unsigned char key1_long_flag; //key1按鍵長按標志
unsigned char led1_long_state; //led1長按狀態
unsigned char led1_long_darkness_lock; //led1熄滅長按狀態
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:
/* 按鍵松開,結束計數*/
key1_cnt = 0;
/*key1按鍵短按處理*/
if(key1_short_flag)
{
if(led1_short_state == 0)//led1熄滅時點亮
{
led1_pwm = led1_pwm + 100;
if(led1_pwm > 10000)
{
key1_short_flag = 0;//清除key1短按標志
led1_short_state = 1; //led1切換短按狀態
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點亮時熄滅
{
if(led1_pwm < 100)
{
led1_pwm = 0;
key1_short_flag = 0;//清除key1短按標志
led1_short_state = 0; //led1切換短按狀態
led1_long_state = 0;//清除led1長按狀態
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長按標志
led1_long_state = led1_long_state ^ 0x01; //切換led1長按狀態
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:
/*按鍵按下,開始計數*/
key1_cnt++;
/*計數100毫秒消抖,大約150毫秒為按鍵短按*/
if(key1_cnt > 20)
key1_short_flag = 1;
/*計數大于1秒為按鍵長按*/
if(key1_cnt > 150)
{
key1_cnt = 150;
key1_short_flag = 0;//清除按鍵短按標志
if(led1_short_state)//檢查led1狀態
{
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; //通知短按函數 led1 已經亮起
}
}
break;
}
}
/*-------------------------------------------------
* 函數名:DelayUs
* 功能: 短延時函數 --16M-4T--大概快1%左右.
* 輸入: Time延時時間長度 延時時長Time*2Us
* 輸出: 無
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
/*-------------------------------------------------
* 函數名:DelayMs
* 功能: 短延時函數 快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);
}
}
}
/*-------------------------------------------------
* 函數名稱:interrupt ISR
* 功能: 定時器中斷處理函數
* 輸入參數:無
* 返回參數:無
-------------------------------------------------*/
void interrupt ISR(void)//PIC_HI-TECH使用
{
if(TMR2IE && TMR2IF) //10ms中斷一次
{
TMR2IF = 0;
TSC_Start();
TSC_DataProcessing();
TK_REVal = TSC_GetSingle();
}
}
/*-------------------------------------------------
* 函數名:SYS_INITIAL
* 功能: 上電系統初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void SYS_INITIAL (void)
{
//時鐘先8M 寫完PCON (bit7),OPTION(all bit),LVDCON(bit2),后換回16M
OSCCON = 0B01100000;
//WDT 32KHZ IRCF=110=8MHZ/4=4MHZ,0.25US/T
//Bit0=1,系統時鐘為內部振蕩器
//Bit0=0,時鐘源由FOSC<2:0>決定即編譯選項時選擇
OPTION = 0B00000100;
//Bit5 T0CS Timer0時鐘源選擇
//1-外部引腳電平變化T0CKI 0-內部時鐘(FOSC/2)
//Bit4 T0CKI引腳觸發方式 1-下降沿 0-上升沿
//Bit3 PSA 預分頻器分配位 0-Timer0 1-WDT
//Bit2:0 PS2 8個預分頻比 100 - 1:32
LVDCON = 0x03;
// //bit2 0:不經過去抖電路 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;
//復位上T0ON默認為1,所以需要清0
MSCON = 0;
//軟件關閉LVREN不然低功耗電流會變大(Options下必須選擇LVREN=SLVREN)
INTCON = 0;
//暫禁止所有中斷
PORTA = 0;
///////////特別注意與TKCAP合打線的PIN//////////////////////////
//對于6pin 封裝, TKCAP 與PA2 共用引腳3。
//對于DFN8 封裝, TKCAP 與PA4 共用引腳2。
//引腳用作TKCAP 功能時,則PA2/PA4 必須相應地設置為輸入;
//當關閉Touch模塊功能時,則PA2/PA4 為通用IO功能。
TRISA = TRISA_CONFIG;
// 0-輸出 1-輸入
///////////特別注意與TKCAP合打線的PIN//////////////////////////
WPUA = 0B00000000;
//PA端口上拉控制 1-開上拉 0-關上拉
PSRCA = 0B00000000;
//PA4,PA5源電流能力設置為0
}
/*-------------------------------------------------
* 函數名:TIMER2_INITIAL
* 功能: 初始化設置定時器1
* 設置Timer2定時時長 = (1/系統時鐘頻率)*4*預分頻值*后分頻值*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時鐘預分頻比1:4
T2CON1 = 0B00000000; //Bit[2:0] 000: 指令周期 100:HIRC Timer2時鐘源選擇
TMR2H = 0;
TMR2L = 0; //TMR2賦初 0010 0001 0011 0100
PR2H = 0x27;
PR2L = 0x10; //設置PR2=10000
//pwm初始化
P1ADTH=0; //P1ADT賦值
P1ADTL=0;
P1OE=0B00000001; //P1A0輸出使能
P1POL=0B00000000; //P1A0高電平有效
P1CON=0B00000000;
TMR2IF = 0; //清TIMER2中斷標志
TMR2IE = 1; //使能TIMER2的中斷
TMR2ON = 1; //使能TIMER2啟動
PEIE=1; //使能外設中斷
GIE = 1; //使能全局中斷
}
/*-------------------------------------------------
* 函數名:EEPROMread
* 功能: 讀EEPROM數據
* 輸入: 需要讀取數據的地址 EEAddr
* 輸出: 對應地址讀出的數據 ReEEPROMread
--------------------------------------------------*/
unsigned char EEPROMread(unsigned char EEAddr)
{
unsigned char ReEEPROMread;
EEADR = EEAddr;
RD=1;
NOP();
NOP();
NOP();
NOP();
ReEEPROMread =EEDAT;
return ReEEPROMread;
}
/*-------------------------------------------------
* 函數名:EEPROMwrite
* 功能: 寫數據到EEPROM
* 輸入: 需要讀取數據的地址 EEAddr
需要寫入的數據 Data
* 輸出: 無
--------------------------------------------------*/
void EEPROMwrite(unsigned char EEAddr , unsigned char Data)
{
GIE = 0; //寫數據必須關閉中斷
while(GIE); //等待GIE為0
EEADR = EEAddr; //EEPROM的地址
EEDAT = Data; //EEPROM的寫數據 EEDATA = Data;
EEIF = 0;
EECON1 |= 0x34; //置位WREN1,WREN2,WREN3三個變量.
WR = 1; //置位WR啟動
NOP();
NOP();
NOP();
NOP();
while(WR); //等待EE寫入完成
GIE = 1;
}
/*------------------------------------------------------------------------------------------
* 函數名: main
* 功能: 主函數
* 輸入: 無
* 輸出: 無
----------------------------------------------------------------------------------------------*/
void main(void)
{
/* 系統初始化 */
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);
}
}
復制代碼
電路圖
430d178afbfe50af99f3df5689b5625.png
(54.49 KB, 下載次數: 72)
下載附件
2024-2-28 23:39 上傳
圖
作者:
Hephaestus
時間:
2024-3-1 16:56
單片機應該是支持brownout,比如AVR單片機可以通過熔絲位設定當電源電壓下降到4.3V或者2.7V鎖定單片機,不讓單片機低壓時候程序亂飛,避免這種錯誤的發生。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久亚洲国产精品
|
亚洲午夜在线
|
五月婷色
|
日韩欧美高清
|
狠狠操夜夜操
|
久久久久一区二区三区
|
欧美午夜精品一区二区三区
|
国内精品国产成人国产三级
|
国产视频一区二区在线播放
|
国产午夜视频在线观看
|
久久久综合
|
中文字幕理伦片免费看
|
日韩在线观看中文字幕
|
亚洲淫片
|
国产理论在线
|
蜜桃精品视频
|
成年人免费在线观看
|
欧美成人精品一区二区
|
播播激情网
|
国产在线视频一区二区
|
天天拍天天操
|
99re视频
|
日韩一区二区三
|
日韩在线免费视频
|
亚洲欧洲综合
|
97国产精品视频
|
久久动态图
|
亚洲精品成人
|
精品一区二区三区视频
|
一级毛片免费播放视频
|
一级片aa
|
91福利在线观看
|
亚洲视频在线看
|
亚洲经典一区二区
|
精品影院
|
2018天天操
|
欧美a一级
|
日韩一区二区三区在线
|
草逼视频免费看
|
三级av在线
|
精品欧美一区二区精品久久
|