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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1293|回復: 4
打印 上一主題 下一主題
收起左側

求解答,看看我的C語言switch變量寫法有沒問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1005692 發表于 2022-3-9 20:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用的是輝芒微單片機 AD檢測 分壓檢測以確定是正常工作的,但是switch變量,我調電壓工作貌似只執行第一個 case 0:

單片機源程序如下:
/*-------------------------------------------------
*  函數名: 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)
    {
                 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
}

/*-------------------------------------------------
*  函數名:  main
*        功能:  主函數
*  輸入:  無
*  輸出:  無
--------------------------------------------------*/
void main()
{

         POWER_INITIAL();                //系統初始化

//     WDT_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;

   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)  
                {      

                     switch(device_state)
                       {
                                 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;
                                                         
                                                 }
                           
                                                                                                                                                         

                }

//----------------------------------------------------------------



部分代碼求指點 ,我剛學不知道這樣有沒有問題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-3-9 21:28 | 只看該作者
單看現有代碼
device_state只在GET_ADC_DATA()內更新
找不到你在哪里用了GET_ADC_DATA()
所以device_state維持為0

你還是把所有代碼貼上來吧
回復

使用道具 舉報

板凳
ID:1005692 發表于 2022-3-10 08:35 | 只看該作者
lkc8210 發表于 2022-3-9 21:28
單看現有代碼
device_state只在GET_ADC_DATA()內更新
找不到你在哪里用了GET_ADC_DATA()

那應該是我沒有把變量拿出來用,我參照別人的代碼修改了一下 你看下這樣寫有沒問題, 所有源碼如下*                      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();       
                    }                                                        
                                }
//----------------------------------------------------------------                               

        }




}

}


回復

使用道具 舉報

地板
ID:1005692 發表于 2022-3-10 08:38 | 只看該作者
*                      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();       
                    }                                                        
                                }
//----------------------------------------------------------------                               
               
        }
        
     
     

}
  
}
回復

使用道具 舉報

5#
ID:824490 發表于 2022-3-10 20:46 | 只看該作者
表面上看,switch的用法是對的,但邏輯不對:
                          default:
                                    LED1=0;
                                    LED2=0;
                                    LED3=0;  
                                    LED4=!LED4;   
                         break;
這里,當第一次default, LED4=0,當第2次default時LED4=1了。所以直接
default:
                                    LED1=0;
                                    LED2=0;
                                    LED3=0;  
                                    LED4=0;   //或 LED4=1;
                         break;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一二三视频在线观看 | 国产一区二区在线视频 | 国产美女在线免费观看 | 四虎在线视频 | 不卡一区| 亚洲一区二区三区在线 | 久久亚洲二区 | 久久久久久一区 | 日本视频在线 | 国产97色 | 亚洲区一区二区 | 欧美一区二| 国产男女猛烈无遮掩视频免费网站 | 九九热在线免费观看 | 九九伊人sl水蜜桃色推荐 | 中文字幕精品一区 | 美女啪啪国产 | 一区二区日韩 | 91精品国产综合久久精品 | 国产色黄 | 国产在线精品一区二区三区 | av网站在线免费观看 | 99精品国产一区二区青青牛奶 | 精精精精xxxx免费视频 | 亚洲精选一区二区 | 视频一区二区三区中文字幕 | 中文字幕 国产 | 中国大陆高清aⅴ毛片 | 久久久精品亚洲 | 午夜视频网站 | 综合一区二区三区 | 久久久久久久一区 | 一区二区三区免费观看 | 国产乱码精品一品二品 | 亚洲小视频在线观看 | 一区二区av | 日韩视频在线播放 | 精品国产精品 | 日韩精品一区二区三区视频播放 | 天天射视频 | 91色在线|