• PMS150C应广单片机开发案例


    PMS150C应广单片机开发案例

       应广单片机价格美丽,性价比高,mini-c好用,适用于消费电子开发。但是案例demo太少了,为了方便大家能够快速入门。这里贴出了一份经典PMS150C的点灯程序代码。不是Hello world!那种,是偏向于实际产品的那种。

    涉及到的内容有不少,包括应广单片机PMS150C:

    1.端口输入输出配置

    2.Tmr16中断配置(systick),倒计时

    3.按键检测,包括防抖,可以用于长按键检测

    4.低功耗,睡眠配置

    5.唤醒

    6.系统时钟配置,系统时钟切换

    7.看门狗应用

    8.状态机应用

    其他比如PMS152,PMS132设置也类似,希望大家喜欢!

    #include    "extern.h"

    #define     HIGH    1
    #define  LOW    0

    #define DISABLE 0
    #define ENABLE 1

    #define EMPTY 0
    #define FULL 1

    #define ON 1
    #define OFF 0

    #define LED_OPEN 0

    #define LED_FLASH 1

    #define LED_BREATH 2

    #define LED_CLOSE  3

    //#define RUN_TMR  60000
    /*单位 ms*/
    #define RUN_TMR     15000

    #define LOW_POW_TIMING_TMR  3000

    BIT     LED_G           :        PA.3;
    BIT     KEY_HIT            :        PA.4;

    #define KEY_DEBOUNCE_CNT  20
    #define KEY_LONG_PRESS_TIMER 1200

    #define GRE_LED_FLASH  {if(LED_G){LED_G=0;}else{ LED_G=1;}}

    /*计数值Cinit*/
    word ucFlashTmrCnt;
    /*cinit*/
    BIT ubMsFlag; 

    /*cinit*/
    BIT  ubEnLedFlash; 

    /*cinit*/
    bit ubMod;
    byte ucSysSt;
    //byte ucLedPwmDt;

    /*定时时间是否到了cinit*/
    bit     FLAG_NMS;
    /*计数值cinit*/
    byte    count;
    /*定时器初始化cinit*/
    word    T16COUNTER;

    Eword ueLowPowAltTm;

    byte ucKeyHitHigtCnt;
    byte ucKeyHitLowCnt;
    byte ucKeyHitSt;
    byte ucKeyHitBak;
    word usKeyHitLoPreCnt;
    word usKeyHitLoPreCntSet;
    bit ucKeyHitPreSt;

    byte ucLedSt;


    void UpDateLedSt(void);
    /***************************************/
    void    TIME16_Init(void)
    {
        /*计数值清零*/
        T16COUNTER    =488;
        /*ms标记reset*/
        FLAG_NMS    =0;
        
        /*使能定时器*/
        $    INTEN    T16;
        /*关中断*/
        INTRQ        =    0;
        
        /*停止定时器*/
           T16M.5        =0;               

        STT16 T16COUNTER;
        
        /*计算方法16M/*/
        $    T16M    IHRC,/1,BIT11;     
        

    }

    void StartLowPowTmr(void)
    {
        ueLowPowAltTm=RUN_TMR;
    }

    /*低功耗*/
    void LowPow(void)
    {
        /*退出功能则进入低功耗*/
       if((!ueLowPowAltTm) )
       {
               ubEnLedFlash=0;
               GRE_LED_OFF;

            wdreset;
            /*IHRC ->ILRC,关看门狗*/
            CLKMD=0xf4;
            /*禁用IHRC*/
            CLKMD.4=0;
            
            while(1)
            {
                 /*低功耗*/
                 STOPSYS;
             

                 /*有按键按下,充电和按键唤醒*/
                  if(KEY_HIT==0)
                  { 
                        /*退出低功耗*/
                        break; 
                  }
               
            }
            /*ILRC->IHRC ,
                 b7:5@001=IHRC/8,
                 b4@1=IHRC
                 
                 b3@1=模式1
                 b2@ 1=ILRC启动
                 b1@ 1=看门狗开启
                 b0@ 0=Pa5;
                 
                 模式口1;开看门狗*/
            CLKMD=0b001_1_1110;

            ucLedSt=1;
            ucSysSt=LED_CLOSE;
            StartLowPowTmr();
        }
        
    }

    void UpdateLedTmr(void)
    {
       /*使能,闪灯*/    
       if(ubEnLedFlash)
       {
             /*1ms进行一次计数*/
            ucFlashTmrCnt++;
            if(ucFlashTmrCnt>250)
            {
                ucFlashTmrCnt=0;
                /*标记*/
                ubMsFlag=1; 
            }
       }

    }

    /*闪灯*/
    void FlashLed(void)
    {
        /*定时时间到*/
        if(ubMsFlag)
        {
            /*闪灯*/
            GRE_LED_FLASH;
            ubMsFlag=0;
        }
    }


    /*端口检测*/
    void ResetKeyTmr(void)
    {

        if(KEY_HIT)
        {
            ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT;
        }
        /*当前状态为0*/
        else
        {
            ucKeyHitLowCnt=KEY_DEBOUNCE_CNT;
        }

        
    }


    /*1ms任务函数*/
    void UpDateKeyTmr(void)
    {
          /*重新设置计数值*/ 
         ResetKeyTmr();
          /*KeyHit高电平计数值*/
         if(ucKeyHitHigtCnt)
         {
             ucKeyHitHigtCnt--;
            if(!ucKeyHitHigtCnt)
            {
                /*高电平倒计时完成说明当前为低*/
                ucKeyHitSt=LOW;
            }
         }
         /*高电平计数值为0*/
         else
         {
             usKeyHitLoPreCnt++;
            /*做饱和加*/
            if(usKeyHitLoPreCnt>20000)
            {
                usKeyHitLoPreCnt=20000;
            }
            
            if(usKeyHitLoPreCnt==usKeyHitLoPreCntSet)
            {
                /*10s 钟定信号*/
                ucKeyHitPreSt=1;
            }
         }

          /*KeyHit低电平计数值*/
         if(ucKeyHitLowCnt)
         {
             ucKeyHitLowCnt--;
            if(!ucKeyHitLowCnt)
            {
                /*低电平倒计时完成,说明当前为高*/
                ucKeyHitSt=HIGH;

                usKeyHitLoPreCnt=0;
                ucKeyHitPreSt=0;
            }
         }


    }

    void MsTask(void)
    {
        
        /*按键*/
        UpDateKeyTmr();

        UpdateLedTmr();
        
        FlashLed();

        
        /*低功耗定时器*/
        if(ueLowPowAltTm)
        {
            ueLowPowAltTm--;
        }
        
        LowPow();
        
    }


    void UpDateLedSt(void)
    {
        
        ucSysSt++;
        if(ucSysSt>1)
        {
            ucSysSt=0;
        }

        switch(ucSysSt)
        {
            /*开闪烁*/
            case 0:
                ubEnLedFlash=1;
                break;
                
            
            /*关灯*/
            case 1:
                ueLowPowAltTm=LOW_POW_TIMING_TMR;
                ubEnLedFlash=0;
                /*关灯,关闪烁*/
                GRE_LED_OFF;
                /*关灯*/
                break;
            default:
            break;
        }
        
    }


    /*状态切换*/
    void GetKeySt(void)
    {
       /*状态有变化*/
       if(ucKeyHitSt!=ucKeyHitBak)
       {
              /*保存当前状态*/
              ucKeyHitBak=ucKeyHitSt;
           
           if(!ucKeyHitSt)
           {    
                 /*更新倒计时*/
                    StartLowPowTmr();
                 /*状态切换*/
                 UpDateLedSt(); 
           }
          
       }
    }

    /*端口状态初始化*/
    void KeyAppInit(void)
    {
        
        if(KEY_HIT)
        {
            ucKeyHitSt=HIGH;
            ucKeyHitBak=HIGH;
        }
        else
        {
            ucKeyHitSt=LOW;
            ucKeyHitBak=LOW;
        }

       ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT;
       ucKeyHitLowCnt=KEY_DEBOUNCE_CNT;
       usKeyHitLoPreCnt=0;
       ucKeyHitPreSt=0;
       
    }


    void    FPPA0 (void)
    {
        .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V;
        $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
        /**/
        .delay 40000;
        
        $  LED_G    OUT,HIGH;          
        $  KEY_HIT    IN,PULL;   
        
        TIME16_Init();
        
        KeyAppInit();

       
        ucLedSt=1;

        ubMsFlag=0;

        ubEnLedFlash=0;
        
        /*长按键时间*/
        usKeyHitLoPreCntSet=3000;
        ucSysSt=LED_CLOSE;
        
        engint;
        while (1)
        {

                wdreset;

             /*1ms定时时间到*/
             if ( FLAG_NMS )
             {
              
                MsTask();

                /*清除标记*/
                FLAG_NMS=0;
            }
            
            /*取得按键状态*/
            GetKeySt();

            
        }
    }

    void    Interrupt ( void )
    {
        pushaf;

        if ( Intrq.T16 )  
        {

            Intrq.T16    =    0;
            
            STT16 T16COUNTER;

            
            
            if ( count>0 )
            {
                count--;
            }
            else
            {
                count   =   9;
                /*1ms*/
                FLAG_NMS=   1;      
            }

        }

        popaf;
    }

    /*end create by zhongvv 
    ————————————————
    版权声明:本文为CSDN博主「zhongvv」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhongvv/article/details/103430996

  • 相关阅读:
    为什么Java能够称霸移动开发领域这么多年?
    uniapp——项目day03
    java基础巩固12
    手把手带你在AutoDL上部署InternLM-Chat-7B Transformers
    代码随想录算法训练营第36期DAY46
    Revit 平面的圆弧,空间的椭圆弧
    网络原理——网络层与数据链路层
    1. Pthreads专栏简介
    svm.SVC应用实践1--乳腺癌检测
    多尺度结构元素形态学边缘检测算法的研究-含Matlab代码
  • 原文地址:https://blog.csdn.net/fanhaidz/article/details/125567974