📄 stc_pwm.c
字号:
//用PWM0模式控制OE(P3.7&P1.2),达到的效果是红渐亮到最亮,再渐暗到黑,然后是绿色、蓝色、白色。
#include <REGX55.H>
#include "stc12c.h"
#include "b2x.h"
#define u8 unsigned char
#define u16 unsigned int
#define STIME 2000 //定时器时间 32ms
sbit OE =P1^2;
sbit STB=P1^3;
bit flag_pwm;
bit flag_dir;
void time0(void) interrupt 1 using 1
{
TH0=-(STIME/256);
TL0=-(STIME%256);
flag_pwm=1;
}
void main(void)
{
u8 i,j;
u8 liangdu,color_state;
//ini
///////////////////////////////io
//P1.2 P3.7为开漏输出,P3.2 P3.3 P3.4 P3.5 为输入 其他默认
P1M0=b00000100;
P1M1=b00000000;
P3M0=b00111100;
P3M1=b00000000;
OE=1;
///////////////////////////////spi
SPCTL =b11010000;
SPSTAT =b11000000;
//////////////////////////////pwm
CMOD=0x02;
CL=0x00;
CH=0x00;
CCAPOL=0xC0;
CCAPOH=0xC0; //占空比设置
CCAPM0=0x42;
/////////////////////////////
color_state=0x22;
for(i=0;i<20;i++)
{
SPDAT=color_state;
while(!(SPSTAT&0x80));
SPSTAT=0x80;
}
OE=1;
for(j=0;j<2;j++);
STB=1;
for(j=0;j<2;j++);
STB=0;
for(j=0;j<2;j++);
OE=0;
for(j=0;j<2;j++);
flag_pwm=0;
//////////////////////////////time0
TMOD=b00000001;
TH0=-(STIME/256);
TL0=-(STIME%256);
ET0=1;
TR0=1;
///////////////////////////////start
OE=1;
CR=1;
flag_dir=0;
liangdu=2;
EA=1;
while(1)
{
if(flag_pwm==1)
{
if(flag_dir==0)
{
//CCAPOH=liangdu;
CCAPOH=(liangdu/8)*8;
liangdu++;
if(liangdu==0)
{
liangdu=255;
flag_dir=1;
}
}
else
{
//CCAPOH=liangdu;
CCAPOH=(liangdu/8)*8;
liangdu--;
if(liangdu==0)
{
switch(color_state)
{
case(0x22):
{
color_state=0x44;
for(i=0;i<20;i++)
{
SPDAT=color_state;
while(!(SPSTAT&0x80));
SPSTAT=0x80;
}
OE=1;
for(j=0;j<2;j++);
STB=1;
for(j=0;j<2;j++);
STB=0;
for(j=0;j<2;j++);
OE=0;
for(j=0;j<2;j++);
liangdu=1;
break;
}
case(0x44):
{
color_state=0x88;
for(i=0;i<20;i++)
{
SPDAT=color_state;
while(!(SPSTAT&0x80));
SPSTAT=0x80;
}
OE=1;
for(j=0;j<2;j++);
STB=1;
for(j=0;j<2;j++);
STB=0;
for(j=0;j<2;j++);
OE=0;
for(j=0;j<2;j++);
liangdu=1;
break;
}
case(0x88):
{
color_state=0xee;
for(i=0;i<20;i++)
{
SPDAT=color_state;
while(!(SPSTAT&0x80));
SPSTAT=0x80;
}
OE=1;
for(j=0;j<2;j++);
STB=1;
for(j=0;j<2;j++);
STB=0;
for(j=0;j<2;j++);
OE=0;
for(j=0;j<2;j++);
liangdu=1;
break;
}
case(0xee):
{
color_state=0x22;
for(i=0;i<20;i++)
{
SPDAT=color_state;
while(!(SPSTAT&0x80));
SPSTAT=0x80;
}
OE=1;
for(j=0;j<2;j++);
STB=1;
for(j=0;j<2;j++);
STB=0;
for(j=0;j<2;j++);
OE=0;
for(j=0;j<2;j++);
liangdu=1;
break;
}
default:
{
break;
}
}
flag_dir=0;
}
}
flag_pwm=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -