* FT61F022A SOP14
* ----------------
* VDD-----------|1(VDD) (VSS)14|------------GND
* LED1----------|2(PA7) (PA0)13|------------NC
* KEY-----------|3(PA6) (PA1)12|------------EN
* ADEN----------|4(PA5) (PA2)11|------------CH1
* ZD-------------|5(PC3) (PA3)10|------------CH2
* ADC------------|6(PC2) (PC0)9|-------------LED3
* LED2-----------|7(PC4) (PC1)8|-------------LED4
* ----------------
*/
//*********************************************************
#include "SYSCFG.h"
//*********************************************************
#define OSC_16M 0X70
#define OSC_8M 0X60
#define OSC_4M 0X50
#define OSC_2M 0X40
#define OSC_1M 0X30
#define OSC_500K 0X20
#define OSC_250K 0X10
#define OSC_32K 0X00
#define WDT_256K 0X80
#define WDT_32K 0X00
//*********************************************************
//***********************宏定義*****************************
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define CH RA3 //CH2
//#define ZD RC3
#define EN RA1//
#define AD PC2 // RA0
#define LED1 RA7
#define LED2 RC4
#define LED3 RC0
#define LED4 RC1
#define SW1 RA6
#define ADEN RA5
//**********************************************************
#define CD 1 //
#define FD 0 //
unchar tmcn_5min=0,tm5,
tmcn_1s=0,
tmcn_5s=0;
bit ln_flag;
bit time_5s_ok,
time_500ms_ok,time_5s_fag,
time_5min_ok;
unchar ReadAPin,le_tab,led_leev;
unchar key_down;
unchar key_tice,key_time;
//----------------------------------------------------
unchar device_state; //設備狀態
unchar key_flag;
unchar key_counter;
unchar time_flag; //
unchar sw1_time_en;
unchar sw1_time_count;
unchar sw1_time_flag;
//----------------------------------------------------
/*-------------------------------------------------
* 函數名:POWER_INITIAL
* 功能: 上電系統初始化
* 輸入: 無
* 輸出: 無 00010110
--------------------------------------------------*/
//********************************************************
//**************中斷處理**********************************
void interrupt ISR(void) //PIC_HI-TECH使用
{
//PA電平變化中斷**********************
if(PAIE && PAIF)
{
ReadAPin = PORTA; //讀取PORTA數據清PAIF標志
PAIF = 0; //清PAIF標志位
PAIE = 0; //暫先禁止PA2中斷
IOCA1 =0;
IOCA6=0; //禁止PA2電平變化中斷
}
//定時器0的中斷處理**********************
if(T0IE && T0IF) //2.04ms //1M-4T
{
//TMR0 = 100; //注意:對TMR0重新賦值TMR0在兩個周期內不變化
T0IF = 0;
key_time++;
if(tm5++>250) //500ms
{
tm5=0;
// LED=~LED;
time_500ms_ok=1;
tmcn_1s++;
tmcn_5s++;
}
if(tmcn_1s>2) //1000ms = 1s
{
tmcn_1s=0;
if(tmcn_5min++>180) //
{
tmcn_5min=0;
time_5min_ok=1;
}
}
if(tmcn_5s>6) //4s
{
tmcn_5s=0;
time_5s_ok=1;
time_5s_fag=1;
}
}
}
/*-------------------------------------------------
* 函數名:POWER_INITIAL
* 功能: 上電系統初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = WDT_32K|OSC_1M|0X01; //INROSC
//OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系統時鐘為內部振蕩器
//Bit0=0,時鐘源由FOSC<2:0>決定即編譯選項時選擇
INTCON = 0; //暫禁止所有中斷
PORTA = 0B00000000;
TRISA = 0B01001100; //PA輸入輸出 0-輸出 1-輸入 PA7-0 PA6-1 PA4~5-0 PA3-1 PA2-1 PA0~1-0
//PA0->輸出
PORTC = 0B00000000;
TRISC = 0B00000100; //PC輸入輸出 0-輸出 1-輸入 PC4~7-0 PC2~3-1 PC0~1-0
WPUA = 0B11001100; //PA端口上拉控制 1-開上拉 0-關上拉
//開PA6上拉
WPUC = 0B0000000; //PC端口上拉控制 1-開上拉 0-關上拉
//60系列PC口無上拉
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCKCON = 0B00000000; //Bit6->0,禁止PA4,PC5穩壓輸出
//Bit5->0,TIMER2時鐘為Fosc
//Bit4->0,禁止LVR
CMCON0 = 0B00000111; //關閉比較器,CxIN為數字IO口
ANSEL =0x00;
}
/*-------------------------------------------------
* 函數名稱:DelayUs
* 功能: 短延時函數 --16M-4T--大概快1%左右.
* 輸入參數:Time 延時時間長度 延時時長Time*2 Us
* 返回參數:無
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
CLRWDT();//NOP();
}
}
/*-------------------------------------------------
* 函數名稱: DelayMs
* 功能: 短延時函數
* 輸入參數: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); //快1%
}
}
}
/*-------------------------------------------------
* 函數名稱:DelayS
* 功能: 短延時函數
* 輸入參數:Time 延時時間長度 延時時長Time S
* 返回參數:無
-------------------------------------------------*/
void DelayS(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<10;b++)
{
DelayMs(100);
}
}
}
/*-------------------------------------------------
* 函數名: PA2_Level_Change_INITIAL
* 功能: PA端口(PA2)電平變化中斷初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void PA0_Level_Change_INITIAL(void)
{
//ANSEL = 0B11111011; //關閉中斷引腳模擬輸入功能
TRISA1 =1; //SET PA2 INPUT
TRISA6 =1;
ReadAPin = PORTA; //清PA電平變化中斷
PAIF =0; //清PA INT中斷標志位
IOCA1 =1;
IOCA6 =1;
PAIE =1; //使能PA INT中斷
//GIE =1; //使能全局中斷
}
/*----------------------------------------------------
* 函數名稱: TIMER0_INITIAL
* 功能: 初始化設置定時器v
* 相關寄存器:T0CS T0SE PSA
* 設置TMR0定時時長16.384ms=(1/16000000)*4*256*255(16M-4T-PSA 1:256- TMR0=255溢出)
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
OPTION = 0B00000000;
//Bit5 T0CS Timer0時鐘源選擇
//1-外部引腳電平變化T0CKI 0-內部時鐘(FOSC/2)
//Bit4 T0CKI引腳觸發方式 1-下降沿 0-上升沿
//Bit3 PSA 預分頻器分配位 0-Timer0 1-WDT
//Bit2:0 PS2 8個預分頻比 111 - 1:256
T0IF = 0; //清空T0軟件中斷
}
/*-------------------------------------------------
* 函數名: ADC_INITIAL
* 功能: ADC初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void ADC_INITIAL (void)
{
//ADCON1 = 0B00010000; //DIVS=0,時鐘選FOSC
//ADCS[2:0]=001,分頻FOSC/8
//ADCON1 = 0B01010000; //DIVS=0,時鐘選FOSC
//ADCS[2:0]=101,分頻FOSC/16
ADCON1 = 0B01100000; //DIVS=0,時鐘選FOSC
//ADCS[2:0]=110,分頻FOSC/64
ADCON0 = 0B11011001; //B7,ADFM=1,結果右對齊 //AN6
//B6:5,VCFG=00,參考電壓VDD
//B6:5,VCFG=01,參考電壓內部2V
//B6:5,VCFG=11,參考電壓Vref
//B6:5,VCFG=10,參考電壓3V
//B4:2,CHS=010,選擇AN2通道
//B1,GO,AD轉換狀態位
//B0,ADON=1,ADC使能
ANSEL = 0B01000000; //使能AN1為模擬輸入
}
/*-------------------------------------------------
* 函數名: GET_ADC_DATA
* 功能: 讀取通道ADC值
* 輸入: AN_CN 通道序號
* 輸出: INT類型AD值(單次采樣無濾波)
--------------------------------------------------*/
unchar GET_ADC_DATA (unchar C_FD)
{
unchar AN_CH;
unchar i, leev;
unchar ADCON0Buff;
unint tBuffer = 0;
unint ADC_DATA=0;
//AN_CH=6; // AD6
ADCON0Buff = ADCON0 & 0B11100011; //清空通道值
AN_CH <<=2;
ADCON0Buff |= AN_CH; //(BIT4-BIT2)CHS=010,選擇AN6通道
ADCON0 = ADCON0Buff; //重新加載通道值
DelayUs(20);
GO_DONE = 1; //啟動ADC
while( GO_DONE==1 ); //等待ADC轉換完成
ADC_DATA = ADRESH;
ADC_DATA <<=8;
ADC_DATA |= ADRESL; //10Bit ADC值整合
tBuffer = ADC_DATA;
//----------------------------------------
if(C_FD) //CD=1
{
if(tBuffer>0x2ba) //4.1V
{
device_state=0;
}
else if(tBuffer>0x299) //3.9V
{
device_state=1;
}
else if(tBuffer>0x290)//3.85V
{
device_state=2;
}
else if(tBuffer>0x26e)//3.65V
{
device_state=3;
}
else
{
device_state=4; //low 3.5
}
}
return device_state;
//---------------------------------------------
}
void WDT_INITIAL (void)
{
CLRWDT(); //清看門狗
PSA=1; //時鐘分頻分給WDT
WDTCON = 0B00001110; //WDTPS=1010=1:32768,PS=000=1:1
//定時時間=(32768*1)/32000=1024ms
}
void IO_init(void)
{
PA3=0;
PA1=0;
}
/*-------------------------------------------------
* 函數名: main
* 功能: 主函數
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); //系統初始化
ADC_INITIAL();
TIMER0_INITIAL();
GIE = 1; //開中斷
T0IE = 1; //開定時器/計數器0中斷
IO_init();
ADEN=0;
/* 參數初始化*/
device_state =0;
key_tice =0;
sw1_time_en = 0;
sw1_time_count = 0;
sw1_time_flag = 0;
led_leev =0;
le_tab =0;
while(1)
{
CLRWDT(); //清看門狗
ADON=1;
ANSEL = 0B01000000; //使能AN1為模擬輸入
/*按鍵開機*/
//---------------------------------------------------------
if(( SW1 == 0 ) && ( key_flag == 0 ))
{
key_flag =1;
sw1_time_en = 1;
sw1_time_count = 0;
}
if( ( SW1 == 1 ) && ( key_flag == 1 ) ) //松手檢測
{
key_flag = 0;
sw1_time_en = 0;
}
if( sw1_time_en ) //消抖檢測
{
sw1_time_en = 0;
sw1_time_flag = 1;
}
if(sw1_time_flag)
{
CLRWDT();
sw1_time_flag = 0;
// LED4=1;
key_down=1;
key_tice=~key_tice;
if(key_tice)
{
if( time_500ms_ok )
{
time_500ms_ok=0;
device_state=GET_ADC_DATA(6);
if(led_leev< device_state)
{
led_leev= device_state;
}
//==============LED ====================
switch(led_leev)
{
case 0:
LED1=1;
LED2=1;
LED3=1;
LED4=1;
break;
case 1:
LED1=0;
LED2=1;
LED3=1;
LED4=1;
break;
case 2:
LED1=0;
LED2=0;
LED3=1;
LED4=1;
break;
case 3:
LED1=0;
LED2=0;
LED3=0;
LED4=1;
break;
default:
LED1=0;
LED2=0;
LED3=0;
LED4=!LED4;
break;
}
}
}
//----------------------------------------------------------------
else
{
ADON=0;
ANSEL = 0B00000000; //使能AN1為模擬輸入
LED1=0;
LED2=0;
LED3=0;
LED4=0;
CLRWDT();
if(time_5s_ok)
{
time_5s_ok=0;
SWDTEN=0; //close WDT
PA0_Level_Change_INITIAL();
GIE = 1;
NOP();
NOP();
NOP();
SLEEP(); //進入睡眠
NOP();
NOP();
SWDTEN=1;
NOP();
CLRWDT();
}
}
//----------------------------------------------------------------
}
}
}
|