⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3led_10f.c

📁 pic12F675 learning module by microchip
💻 C
字号:
#include <pic.h>
#include <osa.h>


#ifdef _10F222
__CONFIG (OSC_4MHZ & MCPUDIS & WDTDIS & MCLRDIS);
#else 
__CONFIG (WDTDIS & MCLRDIS);
#endif



#define TRIS_CONST  0x08
#define GPIO_CONST  0x00


// Buttons use same pins as LEDs
#define pin_RED_LED        GP0
#define pin_GREEN_LED      GP1
#define pin_BLUE_LED       GP2

#define pin_RED_BUTTON     GP0
#define pin_GREEN_BUTTON   GP1
#define pin_BLUE_BUTTON    GP2

#define pin_MODE_BUTTON    GP3




// Two bits for synchronize tasks. 
#define bRunTaskWork        OS_Flags.bUser0
#define bRunTaskButtons     OS_Flags.bUser1

// Two bits bUser0 and bUser1 in system variable OS_Flags can be used for user purposes.



/****************************************************************************/

// Intensity variables for each LED
char    cRed;
char    cBlue;
char    cGreen;
    

// LED's work mode
struct {
    char cState:4;          // Mode (see ChangeIntensity() )
    char reserved:4;    
} Mode;    

// Speed of intensity changing
union {
    char cValue;
    struct {
        char cPrs:5;        // Prescaler of intensity changing
        char bTimeout:1;    // When becames 1 (cPrs overflows), it is time to change intensity
        char cSpeed:2;      // Intensity changing speed (see SpeedConst[4] array)
    } bits;    
} Speed;         

/****************************************************************************/

const char SpeedConst[4] = {1, 4, 16, 32};  // Speed of Speed.cPrs increasing

/****************************************************************************/

void ChangeIntensity (void);
void Task_Leds (void);
void Task_Work (void);
void Task_Buttons (void);










/****************************************************************************/
/*                                                                          */
/****************************************************************************/


void main (void)
{
    OPTION = 0xC5;      // tmr0 period 16 ms, pull-ups disable
    TRIS = TRIS_CONST;
    #ifdef _10F222
    ADCON0 = 0;         // GP0, GP1 - digital
    #endif
    #ifdef _10F206
    CMCON0 = 0;         // GP0, GP1 - digital
    #endif
    OSCCAL &= ~1;       // GP2 - digital
    GPIO = 0x00;
    
    Mode.cState = 0;
    cBlue = 0xFF;
    //..................................................
    // Init system vars
    OS_Init();

    //..................................................
    // Create task 
    OS_CreateTask(0, Task_Leds);
    OS_CreateTask(0, Task_Work);
    OS_CreateTask(0, Task_Buttons);

    
    //..................................................
    // Run scheduler
    OS_Run();
    
}    





/****************************************************************************/
/* Forming PWM control signals for all three LEDs                           */
/****************************************************************************/

void Task_Leds (void)
{
    char temp;

    for (;;) {
        //..............................................................
        // Wait TMR0 overflow
        OS_WaitCondition(!(TMR0 & 0x80));
        TRIS = 0;
        TMR0 = 0;
        
        //..............................................................
        // Switch ON all working LEDs
        if (cRed)   pin_RED_LED = 1;
        if (cGreen) pin_GREEN_LED = 1;
        if (cBlue)  pin_BLUE_LED = 1;

        //..............................................................
        // Form pulses 
        do {
            if (TMR0 >= cRed)     pin_RED_LED = 0;
            if (TMR0 >= cGreen)   pin_GREEN_LED = 0;
            if (TMR0 >= cBlue)    pin_BLUE_LED = 0;
        } while (GPIO & 7);
        
        if (!(TMR0 & 0x80)) OS_WaitCondition(TMR0 & 0x80);
        //..............................................................
        // Run other tasks
        bRunTaskWork = 1;
        bRunTaskButtons = 1;
    }    
}






/****************************************************************************/
/* Task for change LED's intensity.                                         */
/****************************************************************************/

void Task_Work (void)
{
    for (;;) {
        //..............................................................
        OS_WaitCondition(bRunTaskWork);
        bRunTaskWork = 0;

        //..............................................................
        // Increase prescaler. When prescaler overflows, bit bTimeout will be set
 
        Speed.cValue += SpeedConst[Speed.bits.cSpeed];
        if (!Speed.bits.bTimeout) continue;
        
        // Reset prescaler and timeout
        Speed.bits.cPrs = 0;
        Speed.bits.bTimeout = 0;
        
        // Set new intensity values
        ChangeIntensity();  
    }
}    





/****************************************************************************/
/* Work with buttons.                                                       */
/****************************************************************************/

void Task_Buttons (void)
{
    char temp;
    for (;;) {
        TRIS = 0x0; NOP();  GPIO = 0;
        //..............................................................
        // Wait for synchronization
        OS_WaitCondition(bRunTaskButtons);

        // Set all pins as inputs
        TRIS = 0xF;
        bRunTaskButtons = 0;
        NOP();

        // Is any button pressed?
        if (!GPIO) continue;      // No.
        
        //--------------------------------------------------------------
        // Yes.

        //..............................................................
        // Buttons 1, 2 and 3 - set RED, GREEN or BLUE intensity at maximum
        if (pin_RED_BUTTON) {
            cRed = 0xFF;
            cGreen = 0;
            cBlue = 0;
            Mode.cState = 1;
        }    
        //..............................................................
        if (pin_GREEN_BUTTON) {
            cRed = 0x00;
            cGreen = 0xFF;
            cBlue = 0x00;
            Mode.cState = 2;
        }    
        //..............................................................
        if (pin_BLUE_BUTTON) {
            cRed = 0x00;
            cGreen = 0x00;
            cBlue = 0xFF;
            Mode.cState = 0;
        }

        //..............................................................
        // Button 4 - change speed
        if (pin_MODE_BUTTON)    Speed.bits.cSpeed += 1;
        
        
        //..............................................................
        // Wait for button release
        do {
            TRIS = 0x0; NOP();  GPIO = 0;
            OS_WaitCondition(bRunTaskButtons);
            TRIS = 0xF;
            bRunTaskButtons = 0;
            NOP();
        } while (GPIO);
    } 
}        







/********************************************************************************/
/* ChangeIntensity - intensity changing algorithm                               */
/* This function is unrelated to the RTOS. You can write your own function.     */
/********************************************************************************/


#define TEMP(c) temp = c >> 4; temp >>= 1; if(temp & 4) temp ^= 0x07; temp++;
#define INC(c) c+=temp;
#define DEC(c) c-=temp; if (!CARRY) c = 0;

void ChangeIntensity (void)
{
    char temp;

    switch (Mode.cState) {
    case 0:
        TEMP(cRed);
        DEC(cBlue);
        INC(cRed);
        if (CARRY) {
            cRed = 0xFF;
            Mode.cState++;
        }    
        break;
    case 1:
        TEMP(cGreen);
        DEC(cRed);
        INC(cGreen);
        if (CARRY) {
            cGreen = 0xFF;
            Mode.cState++;
        }    
        break;
    case 2:
        TEMP(cBlue);
        DEC(cGreen);
        INC(cBlue);
        if (CARRY) {
            cBlue = 0xFF;
            Mode.cState++;
        }    
        break;
    default:
        Mode.cState = 0;
        break;
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -