/****************************/
#include <STC12C5410AD.h>
//菜单变量
/****************************/
//#include<reg52.h>
#include < intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit test=P2^0;
sbit dis1=P2^1;
sbit dis2=P2^3;
sbit dis3=P2^7;
sbit dis4=P2^6;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P2^5;
sbit key4=P3^2;
uchar key1PreS;
uchar key2PreS;
uchar key3PreS;
uchar key4PreS;
uint key1Time;
uint key2Time;
uint key3Time;
uint key4Time;
uchar keyMode; // 0为地址码,1为调光
void key();
void delay(uchar a);
void display(uchar disnum);
void delay5ms(uchar a);
void display_menu(uchar numdis);
uint num=1,num2=0;
uchar i,i1,i2;
uchar code number[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/**********************************************************************/
//PWM调光变量
/**********************************************************************/
sbit PWM0 = P3^7;//R
sbit PWM1 = P3^5;//G
sbit PWM2 = P2^0;//B
sbit PWM3 = P2^4;//W
uchar off = 1;
uchar i = 255;
//void Delay1ms(unsigned int count);
void STC_PWM(void); //PWM初始化
void pwm_add();
void pwm_subb();
uchar d1,d2,d3,d4;
/**********************************************************************/
//dmx设置变量
/****************************************/
uchar temp;
uint address=0;
uchar data m[4];//接收数据缓存
uint n;
sbit RE_RXD=P2^2;
void init();
void dmx();
bit dmxtest;
uchar b1,b2,b3,b4,a1,a2,a3,a4;
/****************************************/
void main()
{
dmxtest=1;
init();
//Delay1ms(5000);
STC_PWM(); //PWM波初始化设置
dis1=1;
dis2=1;
dis3=1;
dis4=1;
key1PreS = key1;
key2PreS = key2;
key3PreS = key3;
key4PreS = key4;
key1Time = 0;
key2Time = 0;
key3Time = 0;
key4Time = 0;
keyMode = 0;
display(num);
while(1)
{
test=dmxtest;
b1=m[0];b2=m[1];b3=m[2];b4=m[3];
if(b1==0)
{
CCAP0L=0xff;
CCAP0H=0xff;
CCAP1L=0xff;
CCAP1H=0xff;
CCAP2L=0xff;
CCAP2H=0xff;
CCAP3L=0xff;
CCAP3H=0xff;
}
else
{
a1=b1;
CCAP0L=255-a1;
CCAP0H=255-a1;
}
if(b2==0)
{
CCAP1L=0xff;
CCAP1H=0xff;
CCAP2L=0xff;
CCAP2H=0xff;
CCAP3L=0xff;
CCAP3H=0xff;
}
else
{
a2=b2;
CCAP1L=255-a2;
CCAP1H=255-a2;
}
if(b3==0)
{
CCAP2L=0xff;
CCAP2H=0xff;
CCAP3L=0xff;
CCAP3H=0xff;
}
else
{
a3=b3;
CCAP2L=255-a3;
CCAP2H=255-a3;
}
if(b4==0)
{
CCAP3L=0xff;
CCAP3H=0xff;
}
else
{
a4=b4;
CCAP3L=255-a4;
CCAP3H=255-a4;
}
key();
}
}
void display(uchar disnum)
{
uchar aa,bb,cc,dd;
aa=disnum/1000;
bb=disnum%1000/100;
cc=disnum%100/10;
dd=disnum%10;
dis1 = 0;
P1 = 0xa1;
delay5ms(20);
dis1 = 1;
dis2 = 0;
P1=number[bb];
delay5ms(20);
dis2 = 1;
dis3 = 0;
P1=number[cc];
delay5ms(20);
dis3 = 1;
dis4 = 0;
P1=number[dd];
delay5ms(20);
dis4 = 1;
delay5ms(20);
}
void display_menu(uchar numdis)
{
uchar qin,bai,shi,ge;
qin=numdis/1000;
bai=numdis%1000/100;
shi=numdis%100/10;
ge=numdis%10;
dis1 = 0;
P1=0x83;
delay5ms(20);
dis1 = 1;
dis2 = 0;
P1=number[bai];
delay5ms(20);
dis2 = 1;
dis3 = 0;
P1=number[shi];
delay5ms(20);
dis3 = 1;
dis4 = 0;
P1=number[ge];
delay5ms(20);
dis4 = 1;
delay5ms(20);
}
void key()
{
if(key1 == 0 && key1PreS == 1)//KEY1是否按下,按下的话就切换到调光模式菜单
{
keyMode = 1;//调光模式
}
key1PreS = key1;
if(!key2)
{
if (key2PreS == 1)
{
if (keyMode == 0)
{
num++;
if(num == 255)
{
num = 1;
}
}
else
{
num2++;
CCAP0L=CCAP0L-1;
CCAP0H=CCAP0H-1;
if(num2==255)
{
num2 = 0;
CCAP0L=0x00;
CCAP0H=0x00;
CCAP3L=0xff;
CCAP3H=0xff;
}
}
}
else
{
key2Time++;
if (key2Time == 300)
{
key2Time = 0;
if (keyMode == 0)
{
num++;
if(num == 255)
{
num = 1;
}
}
else
{
num2++;
if(num == 255)
{
num2 = 0;
CCAP0L=0x00;
CCAP0H=0x00;
CCAP3L=0xff;
CCAP3H=0xff;
}
CCAP0L=CCAP0L-1;
CCAP0H=CCAP0H-1;
}
}
}
key2Time++;
}
else
key2Time = 0;
key2PreS = key2;
if(!key3)
{
if (key3PreS == 1)
{
if (keyMode == 0)
{
num--;
if(num == 1)
{
num = 255;
}
}
else
{
if(num2 == 0)
{
num2 = 255;
CCAP0L=0xff;
CCAP0H=0xff;
CCAP3L=0xff;
CCAP3H=0xff;
}
else
{
num2--;
CCAP0L=CCAP0L+1;
CCAP0H=CCAP0H+1;
CCAP3L=CCAP3L-1;
CCAP3H=CCAP3H-1;
}
}
}
else
{
key3Time++;
if (key3Time == 300)
{
key3Time = 0;
if (keyMode == 0)
{
num--;
if(num == 1)
{
num = 255;
}
}
else
{
if(num2 == 0)
{
num2 = 255;
CCAP0L=0xff;
CCAP0H=0xff;
CCAP3L=0xff;
CCAP3H=0xff;
}
else
num2--;
CCAP0L=CCAP0L+1;
CCAP0H=CCAP0H+1;
CCAP3L=CCAP3L-1;
CCAP3H=CCAP3H-1;
}
}
}
key3Time++;
}
else
key3Time = 0;
key3PreS = key3;
if(key4 == 0 && key4PreS == 1)
{
keyMode = 0;
}
key4PreS = key4;
if (keyMode == 0)
{
display(num);
}
else
{
display_menu(num2);
}
}
void delay5ms(uchar a)
{
uint b,c;
for(b=a;b>0;b--)
for(c=10;c>0;c--);
}
/***************************1秒延时子程序start***************************/
void Delay1ms(unsigned int count)
{
unsigned int a,j;
for(a=0;a<count;a++)
for(j=0;j<120;j++);
}
/***************************1秒延时子程序end****************************/
/*****************************************************/
void STC_PWM(void)
{
CCON=0;
CMOD=0x00; //set PCA timer
CL=0x00;
CH=0x00;
CCAP0L=0xff; //设置占空比
CCAP0H=0xff;
CCAPM0=0x42; //设置使用PWM模式
CCAP1L=0xff; //设置占空比
CCAP1H=0xff;
CCAPM1=0x42; //设置使用PWM模式
CCAP2L=0xff; //设置占空比
CCAP2H=0xff;
CCAPM2=0x42; //设置使用PWM模式
CCAP3L=0xff; //设置占空比
CCAP3H=0xff;
CCAPM3=0x42; //设置使用PWM模式
CR=1; //开始PCA 定时器
}
/*****************************************************/
/****************************************************************/
/*void pwm_add()
{
CCAP0L=CCAP0L-1;
CCAP0H=CCAP0H-1;
}
void pwm_subb()
{
CCAP0L=CCAP0L+1;
CCAP0H=CCAP0H+1;
CCAP3L=CCAP3L-1;
CCAP3H=CCAP3H-1;
}*/
void init()
{
PCON=0x00;//工作方式2的波特率加倍
SM0=1; //串行口工作方式2,9位 固定波特率250K ,使用16MHZ晶振
SM1=0;
SM2=0;
REN=1;//允许串行接收状态
IP=0x10; //串行口优行中断级
EA=1;//总中断允许
ES=1;//允许串行口中断
address=1;
RE_RXD=0;
temp=0;
n=0;
}
/***DMX512接收程序***************/
void serial() interrupt 4 using 0
{
RI=0;
dmxtest=0;
if(RB8==0)
{
SBUF==0;
n=0;
return;
}
if(n<address)
{
n++;
return;
}
else if(n>address+3)
{
n++;
return;
}
else
{
m[n-address]=SBUF;
n++;
if(n==512)
dmxtest=0;
}
}
给个测试通过的给你参考
|