找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 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 单片机教程网

快速回复 返回顶部 返回列表