📄 3led_10f.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 + -