STM32 按键

2019-10-15 20:20发布

要求通过三个按键随时选择不同的执行三个不同的传感器程序,传感器程序最后都带有循环,带有循环是因为需要每隔一定的时间读一次传感器的程序(如果没有按键输入),那么这按键部分的程序该怎么写好?该怎么使用中断能满足要求?下面是其中一个传感器的程序
一个传感器程序 一个传感器程序

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
jermy_z
1楼-- · 2019-10-16 01:38
在中断里  while 还delay 800 ms  简直作死啊 。。。。    有两个方法:1、设置标志位,外部中断改变标志位,在主程序里调用不同的逻辑  2、用OS,挂起任务,恢复任务
龙之谷
2楼-- · 2019-10-16 02:22
参照楼上大神
小陀螺爱炒蛋
3楼-- · 2019-10-16 02:47
ISR中不要做延时之类的操作,越短越好~如果希望达到一个舒服的应用程序开发环境,可以上OS,在ISR中触发后,给对应的响应任务发一个信号,响应任务来做处理
TinyBoy
4楼-- · 2019-10-16 06:59
#include "BH1750FVI.h"
   

/***********************************************
function name:        iic_delay()
function:       
input:
output:
describe:
***********************************************/
static void iic_delay()
{
        delay_us(2);
}
/***********************************************
function name:        I2CStart()
function:       
input:
output:
describe:
***********************************************/

void I2CStart()
{      
        if(BH1750_SDIO()==0x00)
        {
                BH1750_SDIO_Output_Set();
        }
        iic_delay();
        BH1750_SCK=positive;
        BH1750_SDO=positive;
        iic_delay();
        BH1750_SDO=negative;
           

}
/***********************************************
function name:        I2CStop()
function:       
input:
output:
describe:
***********************************************/
void I2CStop(void)
{
        if(BH1750_SDIO()==0x00)
        {
                BH1750_SDIO_Output_Set();
        }
        iic_delay();
        BH1750_SCK=positive;
        BH1750_SDO=negative;
        iic_delay();
        BH1750_SDO=positive;

}
/***********************************************
function name:        write_BH1750()
function:       
input:
output:
describe:
***********************************************/
uchar write_BH1750(uchar data)
{
        uchar i;
        if(BH1750_SDIO()==0x00)
        {
                BH1750_SDIO_Output_Set();
        }
        BH1750_SCK=negative;
        iic_delay();
        for(i=0;i<8;i++)
        {
                if(data&0x80)
                        BH1750_SDO=positive;
                else
                        BH1750_SDO=negative;
                BH1750_SCK=positive;
                iic_delay();
                BH1750_SCK=negative;
                iic_delay();
                data<<=1;
        }
        if(BH1750_SDIO())
        {
                BH1750_SDIO_Input_Set();
        }
        BH1750_SCK=positive;
        for(i=1;i<100;i++)
        {
                if(BH1750_SDI==0)
                {
                        i=0;
                        break;
                }
        }
        BH1750_SCK=negative;
        return i;
}
/***********************************************
function name:        read_BH1750()
function:       
input:
output:
describe:
***********************************************/
uchar read_BH1750(uchar ack)
{
        uchar i,data=0;
        if(BH1750_SDIO()!=0)
        {
                BH1750_SDIO_Input_Set();
        }
        BH1750_SCK=negative;
        iic_delay();
        for(i=0;i<8;i++)
        {
                BH1750_SCK=positive;
                data<<=1;
                iic_delay();
                data|=BH1750_SDI;
                BH1750_SCK=negative;
                iic_delay();
        }
        if(BH1750_SDIO()==0x00)
        {
                BH1750_SDIO_Output_Set();
        }
        iic_delay();   
        BH1750_SDO=ack;
        BH1750_SCK=positive;
        iic_delay();
        BH1750_SCK=negative;
        return data;
}
/***********************************************
function name:        init_BH1750
function:       
input:
output:
describe:
***********************************************/
// void init_BH1750()
// {
//        I2CStart();
//        write_BH1750(SLAVE_ADDRESS);
//        write_BH1750(0x01);
//        I2CStop();
//        I2CStart();
//        write_BH1750(SLAVE_ADDRESS);
//        write_BH1750(0x01);
//        I2CStop();
// }
/***********************************************
function name:        getBH1750Sensor
function:       
input:
output:
describe:
***********************************************/
uchar  getBH1750Sensor(u16 *lightSensorVal,u16 adcTimes,u16 abortVal,u16 delay)
{
        u16 tmp=0;
        u16 v0,v1;
        static u16      cnt=0;
        static u16      adcTimeCnt=0;
        static u16      *adc=NULL;
        while(1)
        {
                if(cnt<delay)
                {
                                ++cnt;      
                }
                else  if(cnt==delay)
                {      
                                if(adc)
                                {
                                                        free(adc);
                                                        adc=NULL;
                                }
                                I2CStart(); //init BH1750
                                if(write_BH1750(SLAVE_ADDRESS))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                if(write_BH1750(0x01))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                I2CStop();
                                I2CStart(); //open BH1750 power
                                if(write_BH1750(SLAVE_ADDRESS))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                if(write_BH1750(0x01))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                I2CStop();
                                I2CStart();//startup BH1750 convert
                                if(write_BH1750(SLAVE_ADDRESS))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                if(write_BH1750(0x10))
                                {
                                        adcTimeCnt=0;
                                        break;
                                }
                                I2CStop();
                                if(adc==NULL)
                                {
                                        adc=(u16*)calloc(adcTimes,sizeof(u16));
                                }
                                if(adc)
                                {
                                        ++cnt;
                                }
                                      
                }
                else
                {
                                ++cnt;
                                if(cnt>=delay+25)//(delay+25)*节拍时间到
                                {
                                        I2CStart();
                                        if(write_BH1750(SLAVE_ADDRESS+1))
                                        {
                                                cnt=delay;
                                                adcTimeCnt=0;
                                            
                                            
                                                break;
                                        }
                                        v0=read_BH1750(0);
                                        v1=read_BH1750(1);
                                        I2CStop();
                                        *(adc+adcTimeCnt)=(((v0<<8)|v1)/1.2f);
                                        if(*(adc+adcTimeCnt)>5000)
                                                *(adc+adcTimeCnt)=5000;        
                                        cnt=0;
                                        adcTimeCnt++;
                                        if(adcTimeCnt==adcTimes)
                                        {
                                                for(adcTimeCnt=0;adcTimeCnt<adcTimes-1;adcTimeCnt++)//排序
                                                {
                                                        for(cnt=adcTimeCnt+1;cnt<adcTimes;cnt++)
                                                        {
                                                                if(*(adc+adcTimeCnt)>*(adc+cnt))//升序排列
                                                                {
                                                                        tmp=*(adc+adcTimeCnt);
                                                                        *(adc+adcTimeCnt)=*(adc+cnt);
                                                                        *(adc+cnt)=tmp;
                                                                }
                                                        }
                                                }
                                                tmp=0;          
                                                for(adcTimeCnt=abortVal;adcTimeCnt<adcTimes-abortVal;adcTimeCnt++)
                                                        tmp+=*(adc+adcTimeCnt);
                                                *lightSensorVal=tmp/(adcTimes-2*abortVal);
                                                adcTimeCnt=0;
                                                cnt=0;
                                                if(adc)
                                                {
                                                        free(adc);
                                                        adc=NULL;
                                                }
                                                tmp = 1;
                                        }         
                                }
                }
                break;
        }
        return tmp;
}

////////////////////



void TaskDelay()
{
          if(Ticker)//5ms节拍到,扫描任务,任务中最多有些几个us或者几十个us级别的delay,
          {
                if(fTask1Start)
                {      
                        
                        backupKeyKeep=scan_key();//扫描按键      
                                         
                }  
                if(fTask2Start)
                {
                        if(getBH1750Sensor(&lightSensorVal,7,2,4))//采样完成
                        {
                                if(lightSensorVal>500)
                                        lightSensorVal=500;
                                if(((lightSensorVal>PWMVal*5u)&&((lightSensorVal-PWMVal*5u)<10))||(((lightSensorVal<PWMVal*5u))&&((PWMVal*5u-lightSensorVal)<10)))
                                        lightSensorVal=PWMVal*5u;
                        }
                        
                              
                }
  
                Ticker=0;  
          }
}

  


/*


                          

*/
void main(void)
{      
        while(1)
        {   
              TaskDelay();

            
                  
        }
你可以用一个定时器做个节拍,做几个任务,每个任务是独立的,每个节拍每个任务都能扫描到,给你一个BH1750的例程给你看看,希望对你有所帮助。
lwehui
5楼-- · 2019-10-16 11:59
 精彩回答 2  元偷偷看……
lwehui
6楼-- · 2019-10-16 12:40
小陀螺爱炒蛋 发表于 2016-11-7 12:15
ISR中不要做延时之类的操作,越短越好~如果希望达到一个舒服的应用程序开发环境,可以上OS,在ISR中触发后 ...

嗯嗯,好热心,感动,一开始还不了解,现在已经找到解决方法了,没有用OS,还不会用OS,采用的是方法是设置标志变量,外部中断改变这个变量的方法

一周热门 更多>