新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F103實(shí)現(xiàn)LED燈、按鍵、定時(shí)器編程

        STM32F103實(shí)現(xiàn)LED燈、按鍵、定時(shí)器編程

        作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
        #include "delay.h"
        #include "sys.h"
        #include "LED.h"
        #include "key.h"
        #include "timer2.h"
        /*
        程序功能:KEY0按下時(shí),LED0 每秒閃爍一下;同時(shí)LED1熄滅(LED0慢閃)。
        KEY1按下時(shí),LED1 每秒閃爍二下;同時(shí)LED0熄滅(LED0快閃)。
        WAKE_UP按下,LED0、LED1都熄滅。
        硬件:LED0----GPIOA.8
        LED1----GPIOD.2
        KEY0----GPIOC.5
        KEY1----GPIOA.15
        KEY_WAKEUP----GPIOA.0
        TIMER2定時(shí)器功能。
        軟件:KEIL5
        按鍵采用狀態(tài)機(jī)實(shí)現(xiàn)按鍵掃描。在定時(shí)器中對按鍵進(jìn)行處理。
        時(shí)間:2016.8.9
        */
        //全局變量 按鍵狀態(tài)機(jī) LED0燈閃爍頻率 LED1燈閃爍頻率
        unsigned char flag_20ms=0x0,flag_500ms=0,flag_250ms=0;
        // 按鍵KEY0按下標(biāo)志 按鍵KEY1按下標(biāo)志
        unsigned char flag_key0=0,flag_key1=0;
        int main(void)
        {
        Led_Init();//LED燈初始化
        key_init();//KEY按鍵初始化
        Timer2_config(71,2000); //定時(shí)兩毫秒
        while(1)
        {
        Led_Control(); //LED控制
        }
        }
        #include "sys.h"
        #include "delay.h"
        #include "key.h"
        extern unsigned char flag_20ms;
        extern unsigned char flag_key0,flag_key1;
        void key_init(void)
        {
        GPIO_InitTypeDef KEY_InitTypeDef;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
        KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_0;
        KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPD;
        KEY_InitTypeDef.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&KEY_InitTypeDef);
        KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_5;
        KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOC,&KEY_InitTypeDef);
        KEY_InitTypeDef.GPIO_Pin=GPIO_Pin_15;
        KEY_InitTypeDef.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOA,&KEY_InitTypeDef);
        KEY0=1;
        KEY1=1;
        WK_UP=0;
        }
        /*
        函數(shù)功能:按鍵掃描函數(shù)
        輸入?yún)?shù):無
        輸出參數(shù):返回鍵碼。無按鍵時(shí)返回0;
        外部變量:
        算法:采用軟件延時(shí)實(shí)現(xiàn)按鍵掃描。
        */
        unsigned char KeyScan(void)
        {
        unsigned char keynum=0;
        if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
        {
        delay_ms(10);
        if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
        {
        if(KEY0!=1)
        {
        while(KEY0!=1);
        keynum=1;return keynum;}
        else if(KEY1!=1)
        {while(KEY1!=1);
        keynum=2;return keynum;}
        else if(WK_UP!=0)
        {while(WK_UP!=0);
        keynum=3;return keynum;}
        else
        return 0;
        }
        else
        return keynum;
        }
        else
        return keynum;
        }
        /*
        函數(shù)功能:按鍵掃描函數(shù)
        輸入?yún)?shù):無
        輸出參數(shù):返回鍵碼。無按鍵時(shí)返回0;
        外部變量:flag_20ms
        算法:采用狀態(tài)機(jī)實(shí)現(xiàn)按鍵掃描。
        */
        unsigned char KeyScan2(void)
        {
        static unsigned char keynum=0,step1=0;
        if(flag_20ms==0x01)
        {
        flag_20ms=0;
        switch(step1)
        {
        case 0:{//狀態(tài)1:檢測是否有按鍵按下
        if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
        step1=1;
        else
        step1=0;
        return 0;
        break;
        }
        case 1:{//狀態(tài)2:檢測是否真的有按鍵按下
        if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
        {
        if(KEY0!=1)
        {step1=2; keynum=1;}
        else if(KEY1!=1)
        {step1=2; keynum=2;}
        else if(WK_UP!=0)
        {step1=2; keynum=3;}
        else
        {step1=0; }
        }
        return 0;
        break;
        }
        case 2:{//狀態(tài)3:檢測按鍵是否彈起
        if((KEY0!=1)||(KEY1!=1)||(WK_UP!=0))
        {step1=2; return 0;}
        else
        { step1=0;return keynum;}
        break;
        }
        default :return 0;
        }
        }
        return 0;
        }
        /*
        函數(shù)功能:按鍵功能解析函數(shù)
        輸入?yún)?shù):無
        輸入函數(shù):KeyScan2();
        輸出參數(shù):無
        外部變量:flag_key0,flag_key1
        */
        void keyfunction(void)
        {
        unsigned char temp;
        temp=KeyScan2();
        if(temp>0)
        {
        switch(temp)
        {
        case 1:{
        flag_key0=1;
        break;
        }
        case 2:{
        flag_key1=1;
        break;
        }
        case 3:{
        flag_key0=0; flag_key1=0;
        break;
        }
        }
        }
        }
        #include "LED.h"
        //位帶操作 要用到SYS.H
        //#define LED0 PAout(8)
        //#define LED1 PDout(2)
        //不知道為什么,把 Led_InitTypeDef定義成指針變量后,程序運(yùn)行不成功。燈不亮。
        extern unsigned char flag_20ms,flag_500ms,flag_250ms;
        extern unsigned char flag_key0,flag_key1;
        void Led_Init(void)
        {
        GPIO_InitTypeDef Led_InitTypeDef;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
        Led_InitTypeDef.GPIO_Mode=GPIO_Mode_Out_PP;
        Led_InitTypeDef.GPIO_Speed=GPIO_Speed_50MHz;
        Led_InitTypeDef.GPIO_Pin=GPIO_Pin_8;
        GPIO_Init(GPIOA,&Led_InitTypeDef);
        Led_InitTypeDef.GPIO_Pin=GPIO_Pin_2;
        GPIO_Init(GPIOD,&Led_InitTypeDef);
        LED0=1;
        LED1=1;
        }
        /*
        函數(shù)功能:KEY0按下時(shí),LED0 每秒閃爍一下。同時(shí)LED1熄滅。
        KEY1按下時(shí),LED1 每秒閃爍二下。同時(shí)LED0熄滅。
        WAKE_UP按下,LED0、LED1都熄滅。
        外部變量:flag_key0,flag_key1,flag_500ms,flag_250ms
        輸入?yún)?shù):無
        輸出參數(shù):無。
        */
        void Led_Control(void)
        {
        if(flag_key0==1)
        {
        if(flag_500ms==1)
        LED0=0;
        else LED0=1;
        }
        else
        LED0=1;
        if(flag_key1==1)
        {
        if(flag_250ms==1)
        LED1=0;
        else LED1=1;
        }
        else
        LED1=1;
        }
        #include "sys.h"
        #include "stm32f10x_tim.h"
        #include "led.h"
        #include "timer2.h"
        #include "key.h"
        extern unsigned char flag_20ms,flag_500ms,flag_250ms;
        void Timer2_config(unsigned int presc,unsigned int period)
        {
        TIM_TimeBaseInitTypeDef My_TIM2_Init;
        NVIC_InitTypeDef My_NVIC_Init;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        My_TIM2_Init.TIM_Prescaler=presc;
        My_TIM2_Init.TIM_Period=period;
        My_TIM2_Init.TIM_ClockDivision=TIM_CKD_DIV1;
        My_TIM2_Init.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2,&My_TIM2_Init);
        My_NVIC_Init.NVIC_IRQChannel=TIM2_IRQn;
        My_NVIC_Init.NVIC_IRQChannelCmd=ENABLE;
        My_NVIC_Init.NVIC_IRQChannelPreemptionPriority=1;
        My_NVIC_Init.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&My_NVIC_Init);
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM2,ENABLE);
        }
        void TIM2_IRQHandler(void)
        {
        static unsigned char temp1,temp2,temp3;
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
        {
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        if(temp1++>=10)
        {temp1=0;flag_20ms=0x01;
        keyfunction();
        }
        if(temp2++>=250)
        { temp2=0;flag_500ms++;
        if(flag_500ms>1) flag_500ms=0;}
        if(temp3++>=125)
        { temp3=0;flag_250ms++;
        if(flag_250ms>1)
        flag_250ms=0;
        }
        }
        }



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 彭州市| 禄劝| 黄石市| 吐鲁番市| 阜平县| 依兰县| 正安县| 克拉玛依市| 临澧县| 营山县| 麻阳| 清徐县| 朝阳区| 新沂市| 全椒县| 沂水县| 郯城县| 兴化市| 阜阳市| 乡宁县| 石阡县| 沾化县| 大庆市| 吉木乃县| 林芝县| 平湖市| 沽源县| 祁阳县| 遵化市| 刚察县| 济源市| 聂荣县| 阜宁县| 郑州市| 荥经县| 内丘县| 茌平县| 宁明县| 横山县| 巧家县| 栾城县|