精华内容
参与话题
问答
  • 应广单片机点灯

    千次阅读 2019-12-18 09:38:18
    单片机入门都是从点灯开始的..让为了让新入手者能够尽快能够看到学习成果.我也来一个点灯.程序我每一句都 写上注释.有问题可以联系我. 程序包含包含以下内容: 1.IO口设置 2.系统时钟设置 3.延时 #include ...

           单片机入门都是从点灯开始的..让为了让新入手者能够尽快能够看到学习成果.我也来一个点灯.程序我每一句都

    写上注释.有问题可以联系我.

    程序包含包含以下内容:

    1.IO口设置

    2.系统时钟设置

    3.延时


    #include    "extern.h"

    /*端口定义*/
    BIT     LED           :        PA.3;  


    /*相应于main函数*/
    void    FPPA0 (void)
    {
        /*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/
        .ADJUST_IC    SYSCLK=IHRC/2    


        /*端口设置为输出 低*/
        $ LED  out ,low;

        /*主循环*/
        while (1)
        {
            /*端口置高*/
            LED=1;


           /*延时单位1T(1个时钟周期),延时8000=1ms,一共延时500ms*/
           .delay 8000*500;


             /*端口置低*/
            LED=0;


            /*延时500ms*/
           .delay 8000*500;


        }
    }

     

    展开全文
  • 应广单片机代码

    2019-03-11 10:41:33
    pms131 demo,mini_c工程代码,入门好帮手,基本包括单片机所有外设资源基本操作.
  • 应广单片机-16位计数定时器

    千次阅读 2019-12-24 18:04:51
    16位计数器的使用 PMS132B内置一个16位硬件计数器,我一般都是用来做定时器中断 下面这个是数据手册上面介绍的 只能向上计数,计数初始值可以通过stt16指令来设置,待会看代码里面,用来做中断就是当计数溢出是触发...

    16位计数器的使用

    PMS132B内置一个16位硬件计数器,我一般都是用来做定时器中断

    下面这个是数据手册上面介绍的

    只能向上计数
    只能向上计数,计数初始值可以通过stt16指令来设置,待会看代码里面,用来做中断就是当计数溢出是触发中断,具体的看例程吧。

    /************************************************************************************/
    /*							  16位计数定时器T16 								    */
    /************************************************************************************/
    #define USER_TIMER_CONFIG()		$ T16M IHRC, /16, BIT10 //对t16寄存器进行配置   时钟:IHRC 分频:/16  中断源:BIT10   
    #define ENABLE_TIMER()			SET1 INTEN.2 //$ INTEN T16 //开定时器中断
    #define DISENABLE_TIMER()		SET0 INTEN.2 //关定时器中断
    #define INIT_TIMER_VALUE(n)		STT16 n//装载定时器计数值
    #define EA_INT()				ENGINT//开总中断
    #define DIS_INT()				DISGINT//关总中断
    #define CONST_TIME_VALUE        0//0x10E//224//  (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
    word    T16val;
    /************************************************************************************/
    //一次中断的时间计算公式   (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
    //                         (2^10 - 0) / (16 / 4) = 1024us    
    void Set_User_T16(void)
    {	
    	USER_TIMER_CONFIG();
    	T16val = CONST_TIME_VALUE;
    	INIT_TIMER_VALUE(T16val);
    	INTRQ = 0;//清除INTRQ
    	EA_INT();
    	ENABLE_TIMER();
    }
    
    void	FPPA0 (void)
    {
    	.ADJUST_IC	SYSCLK=IHRC/4, IHRC=16MHz		//	SYSCLK=IHRC/2
        // SetPortA();
        // SetPortB();
        Set_User_T16();
    
    
    	while (1)
    	{
    //		...
    //		wdreset;
            //主函数功能实现区
    
    	}
    }
    
    
    void	Interrupt (void)
    {
    	pushaf;
    
    	if (Intrq.T16)
    	{	//	T16 Trig
    		//	User can add code
    		Intrq.T16	=	0;
    		T16val = CONST_TIME_VALUE;
            INIT_TIMER_VALUE(T16val);
            //中断执行区
            
            
    	}
    
    	popaf;
    }
    

    有关其他的外部IO引脚中断目前正在研究中,没弄明白怎么回事,这个计数器中断时可以直接使用的,数据手册里面的计算公式跟我们实际测量出来的不一样,上面那个公式是我自己测量总结的,可行,大家也可以这样配置然后在中断里面通过IO口翻转看一下进一次中断的时间,下面那个是编译器里面使用手册对T16的计算方法。

    在这里插入图片描述

    有关16位计数器的就分享到这里,下次更新8位计数器和11位计数器的使用。

    今天看到了官方的DEMO,16位定时器的中断时间还是跟我们实际测量到的不一样,先看一下官方给的DEMO 吧,`BIT p_Key_In : PA.0; // At ICE, has the circuit, you can try it.
    BIT p_LED_Out : PA.1; //

    void FPPA0 (void)
    {
    .ADJUST_OTP_IHRCR 4MIPS // IHRC/4 = 4MIPS, WatchDog Disable, RAM 0,1 temporary be used

    $	p_LED_Out		Out, Low;
    $	p_Key_In		In;	//, Pull;
    PAPH		=		_FIELD(p_Key_In);
    
    $ T16M		IHRC, /1, BIT11;			//	16MHz / 1 = 16MHz : the time base of T16.   //这里是官方的对16位计数器寄存器的配置
    
    BYTE	Key_Flag;
    BIT		f_Key_In	:	Key_Flag._BIT(p_Key_In);
    Key_Flag			=	_FIELD(p_Key_In);
    
    BYTE	Sys_Flag	=	0;
    BIT		f_Key_Trig	:	Sys_Flag.0;
    BIT		f_LED_On	:	Sys_Flag.1;
    BIT		t16_10ms	:	Sys_Flag.2;
    BIT		t16_1s		:	Sys_Flag.3;
    BIT		t16_over2	:	Sys_Flag.4;
    BIT		t16_over3	:	Sys_Flag.5;
    

    // pmode Program_Mode;
    // fppen = 0xFF;

    BYTE	t16_flag;
    BYTE	count1, count2, count3;
    BYTE	cnt_Key_10ms	=	4;				//	Key debounce time = 40 mS
    
    while (1)
    {
    	if  (INTRQ.T16)
    	{
    		INTRQ.T16		=	0;
    		If (--count1 == 0)					//	DZSN  count
    		{
    			count1		=	39;				//	256uS * 39 = 9,984 uS ≤ 10 mS 
    			t16_10ms	=	1;
    		}
    	}
    

    //
    WORD T16_Cnt, T_100mS;
    ldt16 T16_Cnt;
    if (T16_Cnt.15)
    {
    t16_over3 = 1;
    }
    else if (t16_over3)
    {
    t16_over3 = 0;
    if (–count3 == 0)
    {
    count3 = 244; // 4,096uS * 244 = 999,424 uS ≤ 1S
    t16_1s = 1;
    }
    }
    //*
    if (T16_Cnt.12)
    {
    t16_over2 = 1;
    }
    else if (t16_over2)
    {
    t16_over2 = 0;
    if (–count2 == 0)
    {
    count2 = 195; // 512uS * 195 = 99,840 uS ≤ 100 mS
    T_100mS++;
    }
    }
    //
    A = (t16_flag ^ T16_Cnt$1) & 0x20; // Another way for calucate 100 mS
    if (! ZF) // it use t16_flag.5 ^ T15_Cnt.13
    { // the code is more little,
    t16_flag ^= A; // but, not everyone like it.
    if (–count2 == 0)
    {
    count2 = 195;
    T_100mS++;
    }
    }
    //
    /

    	while (t16_10ms)
    	{
    		t16_10ms	=	0;
    
    		A	=	(PA ^ Key_Flag) & _FIELD(p_Key_In);	//	only check the bit of p_Key_In.
    		if (! ZF)
    		{										//	if is not same,
    			if (--cnt_Key_10ms == 0)
    			{									//	and over debounce time.
    				Key_flag	^=	_FIELD(p_Key_In);
    				f_Key_Trig	=	1;				//	so Trigger, when stable at 30 mS.
    			}
    			else	break;
    		}
    		cnt_Key_10ms	=	4;		break;
    	}
    
    	if (f_Key_Trig)
    	{
    		f_Key_Trig	=	0;
    
    		if (! f_Key_In)
    		{
    			if (p_LED_Out)
    			{						//			3 )		if next key in, then LED off
    				f_LED_On	=	0;
    				p_LED_Out	=	0;
    			}
    			else
    			{						//	1 )				when first key press, then LED on
    				p_LED_Out	=	1;
    			}
    		}
    		else
    		{
    			if (p_LED_Out)
    			{						//		2 )			when first key release, then start to count
    				f_LED_On	=	1;
    				T_100mS		=	0;
    			}
    			else
    			{						//				4 )	nothing to do
    			}
    		}
    	}
    
    	if (f_LED_On)
    	{
    		if (T_100mS >= 50)
    		{	//	Over 5 S, then close
    			f_LED_On	=	0;
    			p_LED_Out	=	0;
    		}
    	}
    }
    

    }
    `

    官方这个DEMO直接在大循环里面判断的中断,实际建项目的时候,会出来一个单独的中断函数,下面看一下实际建项目的源代码,是我自己写的,然后用逻辑分析仪抓取出了波形。

    #include	"extern.h"
    
    //.outfile %S_%T_%x.PDK
    
    typedef byte u8; 
    typedef word u16;
    typedef EWORD u24;
    typedef DWORD u32;
    
    #define     SetPortA()      paph=0x18;pac=0x10;pa=0x00  
    #define     SetPortB()      pbph=0x00;pbc=0x00
    
    #define     LED_ON()        PA.4 = 1
    #define     LED_OFF()       PA.4 = 0
    
    u16 T16val;
    u8 gCnt;
    
    void sys_init(void)
    {
        T16val = 0;
        gCnt = 0;
        
    }
    
    /************************************************************************************/
    /*							  16位计数定时器T16 								    */
    /************************************************************************************/
    #define USER_TIMER_CONFIG()		$ T16M IHRC, /1, BIT11 //对t16寄存器进行配置   时钟:IHRC 分频:/16  中断源:BIT10   
    #define ENABLE_TIMER()			SET1 INTEN.2 //$ INTEN T16 //开定时器中断
    #define DISENABLE_TIMER()		SET0 INTEN.2 //关定时器中断
    #define INIT_TIMER_VALUE(n)		STT16 n//装载定时器计数值
    #define EA_INT()				ENGINT//开总中断
    #define DIS_INT()				DISGINT//关总中断
    #define CONST_TIME_VALUE        0//0x10E//224//  (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
    
    /************************************************************************************/
    //一次中断的时间计算公式   (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
    //                         (2^10 - 0) / (16 / 4) = 1024us    
    void Set_User_T16(void)
    {	
    	USER_TIMER_CONFIG();
    	T16val = CONST_TIME_VALUE;
    	INIT_TIMER_VALUE(T16val);
    	INTRQ = 0;//清除INTRQ
    	EA_INT();
    	ENABLE_TIMER();
    }
    
    void	FPPA0 (void) //主函数
    {
    	.ADJUST_IC	SYSCLK=IHRC/4, IHRC=16MHz		//	SYSCLK=IHRC/2
        SetPortA();
        SetPortB();
        sys_init();
        Set_User_T16();
    
    
    	while (1)
    	{
    //		...
    //		wdreset;
            //主函数功能实现区
    
    	}
    }
    
    
    void	Interrupt (void) //中断函数
    {
    	pushaf;
    
    	if (Intrq.T16)
    	{	//	T16 Trig
    		//	User can add code
    		Intrq.T16	=	0;
    		T16val = CONST_TIME_VALUE;
            INIT_TIMER_VALUE(T16val);
            //中断执行区
            if (gCnt) {  // 利用IO口翻转看中断时间
                LED_OFF();
                gCnt = 0;
            } else {
                LED_ON();
                gCnt = 1;
            }
            
    	}
    
    	popaf;
    }
    

    16位计数器的中断源是BIT11,/1分频,时钟IHRC16M,跟官方例程里面的一样,下面是我测量出来的波形,翻转一次的时间是130us,根据我上面程序里面的公式(2^11-0)/(16/1) = 128us,测量出来多了一点点,是运行程序锁消耗的时间,为什么官方给出的数据跟实际测量的不一样我就不得而知了。

    展开全文
  • 应广单片机demo

    2017-07-06 11:20:10
    应广单片机demo pmc131 pms132 pms150
  • 对于一般的应用,比如键盘,充电检测灯,甚至一些通信,定时查询端口状态就OK了,但是一些特殊应用,特别是通信类的。最好还是用中断,那不多说,上代码。欢迎探讨和交流! #include "extern.h" ...

           对于一般的应用,比如键盘,充电检测灯,甚至一些通信,定时查询端口状态就OK了,但是一些特殊应用,特别是通信类的。最好还是用中断,那不多说,上代码。欢迎探讨和交流!


    #include    "extern.h"

    #define DISABLE 0
    #define ENABLE 1

    #define     HIGH    1
    #define  LOW    0
        
    #define DISABLE 0
    #define ENABLE 1
        
    #define EMPTY 0
    #define FULL 1
        
    #define ON 1
    #define OFF 0

     
     BIT     RX                :PA.0;


    BYTE  BitVal1;

    BIT bMsFlag         :BitVal1.2;          /*历史状态*/


    /*系统变量*/
    Word usTmrCnt;

    byte usPwmCnt;
    //word ucCmd;


        
    void Tmr16InterInit ( void )
    {
        
        usTmrCnt=0;
        $ T16M    IHRC, /1,BIT10
            
        INTEN.T16 =1;/*开启定时中断*/
        Intrq.T16 =0;/*清除中断请求*/
        ENGINT //全局中断开启
    }

    void ExtIntInit(void)

        /*PA0 中断,使能*/
        INTEN.0=1;
        /*下降缘中断
        b7:5@00=保留
        b4@1=T16下降沿请求中断?;0=T16上升沿请求中断
        b3:2@00=PB0/PA4上升沿,下降远均请求中断,01=上升沿,10=下降沿;11=保留
        b1:0@00=PA0/PB5上升沿,下降远均请求中断,01=上升沿,10=下降沿;11=保留
        */
        integs=0x00;
        
        /*清除PA0/PB5中断标记*/
        Intrq.0=0;

    }

    void    GpioInit (void)
    {    

        $ RX   In,pull;

    }

    void    FPPA0 (void)
    {
        .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3V;
        $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
        byte temp;
        .delay  25*2000;
     
        GpioInit();

     
        ExtIntInit();
        
            
        Tmr16InterInit();

        
        while (1)
        {
            wdreset;
            
          
            if(bMsFlag)
            {

               
                bMsFlag=0;
            }
        
            
        }
    }


    void    Interrupt (void)
    {
        pushaf;

        if (Intrq.T16)
        {    
             stt16 usTmrCnt;
            
            Intrq.T16    =    0;

        
            /*1ms 计数*/
           usPwmCnt++;
           if(usPwmCnt>16)
           {
                  usPwmCnt=0;
               bMsFlag=1;
           }

        }

        /*下降沿中断*/
        if ( Intrq.0 )  
        {
            /*清除中断标记,这里设置断点,切换RX状态就行*/
            Intrq.0=0;

        }


        popaf;
    }
    /*edit by zhongvv,QQ:85547259*/

    展开全文
  • 应广单片机开发案例

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

            应广单片机价格美丽,性价比高,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 QQ:85547259*/

     

    展开全文
  • 应广单片机mini-c查表

    千次阅读 2019-12-18 18:51:43
    如果又要用到表格怎么办,别急,应广单片机可以查rom表. 下面用数码管输出为例子,做个简单的表格.注意表格只支持byte类型;最多可以放入255个数据. 包括以下内容: 1.查表 2.循环 3.数码管显示. #include "extern...
  • 应广 Mini-c编程指南,pdf文档,Mini-c语法规则和举例
  • 关于应广单片机PMS150烧录的问题

    千次阅读 2019-07-04 09:00:47
    使用5S-P003烧录器 操作流程: 步骤1:运行软件 在FPPA IDE编译完代码后,点击执行...烧录器,弹出如下界面: 步骤2: ...选择要烧录的PDK文件,然后弹出如下界面,按照如下步骤操作,得到新的PDK文件,然后保存。......
  • 应广单片机-按键长短按功能

    千次阅读 2020-03-07 16:29:39
    这个demo主要介绍通过按键来点灯,按键扫描跟其他的开发环境的大同小异,主要有长按短按功能,比较简单,直接看代码吧,不懂得可以留言。基本上是用标准c的格式来写的,mini-c里面的一些指令用的很少。 ///////////...
  • PMS150C datasheet V004_CN_20180124。 带书签的pms150c数据手册。
  • 应广单片机比较器检测电池欠压

    千次阅读 2020-01-19 21:45:38
    如果说51单片机是通用型的单片机,那么应广单片是实用型的,适用于玩具,消费电子等产品开发.单片机内部集成了1.2V的band-gap参考电压,同时集成了比较器,这对于一些电池供电的产品,更具实用意义. 下面我就贴上比较器...
  • 稍作修改就可以用在pms152,pms132B灯应广其他系列的单片机中.不多说,上代码.一切尽在代码中. #include "extern.h" /*定时时间是否到了cinit*/ bit FLAG_NMS; /*计数值cinit*/ byte count; /*定时器初始化cinit*...
  • LBHIDDEN[0]LBHIDDEN[这个贴子最后由solonsun在 2004/05/24 09:00pm 第 1 次编辑] ...这是我曾经开发国的一个简单的单片机最小化系统 可以在此基础上扩展外围功能 系统上电时显示8.8.8.8. 单片机 , 上电
  • 红外控制Demo

    2013-11-28 11:52:09
    红外对射触发的接口,用于车辆检测站,停车场等感觉车辆的进出。采用了MSCOMM32.OCX,再进行了二次封装
  • 作者经常使用一些国产芯片或者价格价格美丽的单片机,这款应广单片机PMS171B价格美丽,性价比高,mini-c好用,适用于消费电子开发。但是案例demo太少了,为了方便大家能够快速入门。为了方便大家应用和开发,这里写一...
  • 简单倒计时案例

    2020-03-05 20:18:22
    Document
  • 1, 先得了解MCU 的功能及每一个管脚的作用,确定用什么样的电源输入,有无大电流负载及一些安规方面的要求,体积封装大小有无规定. 2, 采用电池供电时是否要考虑做一些省电低功耗线路 3, 带检测功能的产品是否...
  • 单片机应用编程技巧

    千次阅读 2012-06-25 23:39:49
    1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言...
  • 单片机应用编程技巧

    千次阅读 2010-07-30 14:48:00
    单片机应用编程技巧 作者:Holtek---邓宏杰 <br />1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。...

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
热门标签
关键字:

应广单片机demo