刚刚学习单片机,看到一篇代码,说为一款呼吸灯,但是不清楚代码中的各个R_和B_的意思,和代码的逻辑,还有函数内 R_RgbCount1/2/3是什么计数变量,用来计周期还是其他东西的?请各位帮忙解答一下谢谢,万分感谢!
下面是.c文件
#include
#include "ny8_constant.h"
#include "user.h"
#define UPDATE_REG(x) __asm__("MOVR _" #x ",F")
void main(void)
{
CLRWDT();
IO_Config();
DISI();
C_RAM();
Timer0_Config();
NOP();
NOP();
ENI();
NOP();
while(1)
{
CLRWDT();
if( B_10MS )
{
B_10MS = 0;
F_UpKeySacnPro();
SleepAndWakeUp();
}
}
}
void F_RgbPwmOutPro(void)
{
if( B_LedSosFlag )
{
if( R_RgbCount2 > R_RgbCount1 )//计数变量
{
IO_BEEP = 1;//LED灯
}
else
{
IO_BEEP = 0;
}
R_RgbCount1++;//计数变量
if( R_RgbCount1 >= 130 )
{
R_RgbCount1 = 0;
if( R_RgbCount3 == 0 )//计数变量
{
R_RgbCount2++;
if( R_RgbCount2 >= 130 )
{
R_RgbCount2 = 130;
R_RgbCount3 = 1;
}
}
else
{
if( R_RgbCount2 > 13 )
{
R_RgbCount2--;
}
else
{
R_RgbCount3 = 0;
R_RgbCount2 = 13;
}
}
}
}
else
{
R_RgbCount1 = 0;
R_RgbCount2 = 0;
R_RgbCount3 = 0;
IO_BEEP = 0;
}
}
void F_UpKeySacnPro(void)
{
if( !KEY_ONOFF )
{
R_LooseKeyDebance = 0;//计数变量
R_UpKeyDebance++;
if( R_UpKeyDebance >= 40 )
{
if( !B_UpKeyShoutFlag )
{
B_UpKeyShoutFlag = 1;
if( B_LedSosFlag )
{
B_LedSosFlag = 0;
}
else
{
B_LedSosFlag = 1;
R_RgbCount1 = 0;
R_RgbCount3 = 0;
R_RgbCount2 = 13;
}
}
}
}
else
{
B_UpKeyShoutFlag = 0;
R_UpKeyDebance = 0;
}
}
void SleepAndWakeUp(void)
{
if( B_LedSosFlag || B_UpKeyLongFlag || B_UpKeyShoutFlag || R_UpKeyDebance != 0 || !KEY_ONOFF )
{
R_SleepCount=0;
return;
}
if( R_SleepCount < 100 )
{
R_SleepCount++;
return;
}
R_SleepCount = 0;
IO_Config();
BWUCON = 0x01;
NOP();
NOP();
DISI();
NOP();
NOP();
CLRWDT();
PCONbits.WDTEN = 0;
// PCONbits.LVDEN = 0;
INTE = C_INT_PBKey;
NOP();
NOP();
NOP();
NOP();
NOP();
SLEEP();
NOP();
NOP();
NOP();
NOP();
NOP();
CLRWDT();
BWUCON = 0x00;
Timer0_Config();
INTF = 0;
INTE = C_INT_TMR0;
PCONbits.WDTEN = 1;
NOP();
NOP();
ENI();
NOP();
NOP();
}
void Timer0_Config(void)
{
//;Initial Timer0
PCON1 = C_TMR0_Dis;
TMR0 = TimerSum;
T0MD = C_PS0_TMR0 | C_PS0_Div2 ;
INTE = C_INT_TMR0; // Enable Timer0??overflow interrupt
// CMPCR = C_RBias_High_Dis | C_RBias_Low_Dis| C_CMPFINV_Dis | 0x0A;
PCON = C_WDT_En ;
PCON1 = C_TMR0_En;
}
void IO_Config(void)
{
//;Initial GPIO
PORTB = 0x00;
IOSTB = 0x01;
PORTB = 0x00;
BPHCON = 0xfe;
BWUCON = 0x00;
//
//
// PORTA = 0x00;
// IOSTA = 0x00;
// PORTA = 0x00; // PB0、PB1 & PB2 are output High
//
// ABPLCON = 0xff;
BWUCON = 0x00;
}
void C_RAM(void)
{
for(FSR=0x10;FSR<0x2f;FSR++)
{
INDF=0x00;
}
FSR=0xFF;
INDF=0x00;
}
// \ !interrupt service routine
void isr(void) __interrupt(0)
{
if(INTFbits.T0IF)
{
INTF = (unsigned char)~(C_INT_TMR0); // Clear T0IF flag bit
TMR0 = TimerSum;
// B_100Us = 1;
// IO_LED_R = !IO_LED_R;
F_RgbPwmOutPro();
R_100UsCount++;
if( R_100UsCount >= 10 )
{
R_100UsCount = 0;
B_10MS = 1;
}
}
}
接下来的为.h文件
```c
#ifndef USER
#define USER
#define u8 unsigned char
#define uchar unsigned char
#define u16 unsigned int
#define u32 unsigned long int
#define uint8_t unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long int
u8 R_Temp;
//==============IO Define===============
#define KEY_ONOFF PORTBbits.PB0
// VSS
//#define IO_LED_R PORTBbits.PB1
//#define KEY_ONOFF PORTBbits.PB3
// VDD
#define IO_BEEP PORTBbits.PB2
//=============Global Variable ===========
#define TimerSum 221
u8 R_100UsCount;
u8 R_RgbCount1;
u8 R_RgbCount2;
u8 R_RgbCount3;
u8 R_RedDuty;
u8 R_GreenDuty;
u8 R_BlueDuty;
u8 R_HeatSum;
u8 R_LedCount1;
u8 R_LedCount2;
u8 R_LedSum1;
u8 R_LedCount4;
u8 R_GkCount;
u8 R_NoGkCount;
u8 R_MotoStep;
//u8 R_MotoWorkCount;
u8 R_MotoWorkSum;
u8 R_MotoSum1;
u8 R_MotoSum2;
u8 R_MotoSum3;
u8 R_MotoSum4;
u8 R_MotoSum5;
u8 R_MotoSum6;
u8 R_MotoSpeedSum1;
u8 R_MotoSpeedSum2;
u8 R_MotoSpeedSum3;
u8 R_MotoSpeedSum4;
u8 R_UpKeyDebance;
u8 R_LooseKeyDebance;
u8 R_KeyBuff;
u8 R_WorkModeSum;
u8 R_SleepCount;
u16 R_MotoBuff;
u16 R_MotoBuff1;
u8 R_LedCount3;
void Timer0_Config(void);
void IO_Config(void);
void C_RAM(void);
void SleepAndWakeUp(void);
void F_UpKeySacnPro(void);
void F_CheckGKPro(void);
void F_LedDisPro(void);
void F_RgbPwmOutPro(void);
//============Define Flag=================
typedef union
{
unsigned char byte;
struct
{
u8 bit0 : 1;
u8 bit1 : 1;
u8 bit2 : 1;
u8 bit3 : 1;
u8 bit4 : 1;
u8 bit5 : 1;
u8 bit6 : 1;
u8 bit7 : 1;
} bits;
}Flag;
volatile Flag Flag1;
#define B_100Us Flag1.bits.bit0 //
#define B_10MS Flag1.bits.bit1
#define B_1MS Flag1.bits.bit2
#define B_1S Flag1.bits.bit3
#define B_UpKeyLongFlag Flag1.bits.bit4
#define B_DoubleKeyFlag Flag1.bits.bit5
#define B_LedSosFlag Flag1.bits.bit6
#define B_UpKeyShoutFlag Flag1.bits.bit7
#endif
```
这些都是端口输出,看你的呼吸灯的定义,什么电位控制多少级亮度
这就是个人命名习惯
写代码的人把所有的变量用前缀R
所有的define用前缀B
这样可以防止变量和关键字冲突
至于到底哪个变量具体是干什么的,你就得去读代码了
该回答引用GPTᴼᴾᴱᴺᴬᴵ
该代码是单片机上实现呼吸灯效果的代码。下面我会一一解释您提出的问题:
其中,Reset宏定义是用于在程序中清零一个变量,也就是将一个变量的值置为0;而Bit宏定义是用于操作一个变量的某一位。例如,如果想将一个变量的第3位(从右向左数)置1,可以使用B_3=1这样的宏定义。
main()函数:这个函数是主函数,也是程序的入口函数。程序首先会执行IO_Config()函数来初始化IO口,然后会执行Timer0_Config()函数来初始化定时器。然后进入一个死循环,不停地检测按键,并调用F_UpKeySacnPro()和SleepAndWakeUp()函数。
F_UpKeySacnPro()函数:这个函数是用来扫描按键的。它会检测按键的状态,如果按键按下了,就会将一个变量加1。如果这个变量的值超过了一定的阈值,就会改变LED灯的闪烁模式。
SleepAndWakeUp()函数:这个函数是用来控制单片机的睡眠和唤醒的。如果单片机需要睡眠,它会关闭IO口的输入输出功能,然后进入睡眠模式。如果单片机需要唤醒,它会重新初始化IO口和定时器,并启动定时器的中断。