📄 rgb_pwm.c
字号:
#include "RGB_PWM.h"
__CONFIG(0X3F76);
uchar MachineState=0; //机器状态 uchar Tcount;
uchar Rcount,Gcount,Bcount; //定义占空比的 高电平计数
uchar Tcount;
uchar Kcount; //定义存储的比列系数
static void interrupt USART_RXC_ISR(void)
{
CLRWDT();
if(TMR1IF) //定时器中断处理
{
TMR1IF=0;
TMR1H=0xFF; //定时时间:500000uS,误差:0uS
TMR1L=0xEB;
Tcount++;
if(Tcount>=Rcount) RedDriver=0;
if(Tcount>=Gcount) GreenDriver=0;
if(Tcount>=Bcount) BlueDriver=0;
if(Tcount>=Fcount)
{
Tcount=0;
if(Rcount==0) RedDriver=0;
else RedDriver=1;
if(Gcount==0) GreenDriver=0;
else GreenDriver=1;
if(Bcount==0) BlueDriver=0;
else BlueDriver=1;
}
}
else PIR1=0;
}
void main(void)
{
SystemInit();
LCD_Initialize();
LCD_SendCommand(DISP_ON);
LCD_SendCommand(CLR_DISP);
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..RGB..PWM...");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
stateini();
timer1_ini();
CLRWDT();
while(1)
{
CLRWDT();
if(!SW3) //功能的转换
{
delay(30,40);
if(!SW3)
{
MachineState++;
if(MachineState>5)
MachineState=1;
switch (MachineState)
{
case 1:
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..PWM..Red...");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
break;
case 2:
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText(".PWM..Green..");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
break;
case 3:
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..PWM..Blue...");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
break;
case 4:
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText(".....Save......");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
break;
case 5:
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText(".....Read.....");
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("....Ready!!!...");
break;
default: break;
}
}
}while(!SW3) CLRWDT();;
//**********************************
if(!SW1) //增量函数处理
{
uchar tempdata;
CLRWDT();
switch (MachineState)
{
case 1:
Rcount+=1;
if(Rcount>120) Rcount=119;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Add....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Rcount=");
tempdata=(Rcount>>4)+0x30;
if (tempdata>0x39) tempdata=(Rcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Rcount&0x0f)+0x30;
if (tempdata>0x39) tempdata=(Rcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 2:
Gcount+=1;
if(Gcount>120) Gcount=119;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Add....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Gcount=");
tempdata=(Gcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Gcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Gcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Gcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 3:
Bcount+=1;
if(Bcount>120) Bcount=119;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Add....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Bcount=");
tempdata=(Bcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Bcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Bcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Bcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 5:
Kcount+=1;
if(Kcount>10)
{
Kcount=10;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..Address..Over..");
}
else
{
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..Address...Add....");
}
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Kcount=");
tempdata=(Kcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Kcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
default: break;
}
}
//****************************
if(!SW2) //减量函数处理
{
uchar tempdata;
CLRWDT();
switch (MachineState)
{
case 1:
if(Rcount--<1) Rcount=0;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Dec....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Rcount=");
tempdata=(Rcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Rcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Rcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Rcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 2:
if(Gcount--<1) Gcount=0;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Dec....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Gcount=");
tempdata=(Gcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Gcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Gcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Gcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 3:
if(Bcount--<1) Bcount=0;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..D....Dec....");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Bcount=");
tempdata=(Bcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Bcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Bcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Bcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
case 5:
if(Kcount--<1) Kcount=0;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("..Address...Dec...");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Kcount=");
tempdata=(Kcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Kcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
break;
default: break;
}
}
//************************************
if(!SW4) //执行函数处理
{
CLRWDT();
delay(50,50);
if(!SW4)
{
if(MachineState==8)
{
TMR1ON=!TMR1ON;
LCD_SendCommand(DISP_ON);
LCD_SendCommand(CLR_DISP);
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText("Timer__State..");
LCD_SendCommand(DD_RAM_ADDR_1);
if(TMR1ON) LCD_SendText(" Open ");
else LCD_SendText(" Close ");
}
if(MachineState==4)
{
save();
}
if(MachineState==5)
{
read();
}
}
}while(!SW4) CLRWDT(); ;
}
}
void read()
{
uchar tempdata;
CLRWDT();
Rcount=EEPROM_Read(0x01+Kcount*3);
if(Rcount>250) Rcount=0;
Gcount=EEPROM_Read(0x02+Kcount*3);
if(Gcount>250) Gcount=0;
Bcount=EEPROM_Read(0x03+Kcount*3);
if(Bcount>250) Bcount=0;
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText(".Address...Load...");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Kcount=");
tempdata=(Kcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Kcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
}
//////////////////
void save()
{
uchar tempdata;
CLRWDT();
EEPROM_Write(0x01+Kcount*3,Rcount);
EEPROM_Write(0x02+Kcount*3,Gcount);
EEPROM_Write(0x03+Kcount*3,Bcount);
EEPROM_Write(0x00,Kcount);
LCD_SendCommand(DD_RAM_ADDR_2);
LCD_SendText(".Address...Save...");
LCD_SendCommand(DD_RAM_ADDR_1);
LCD_SendText("..Kcount=");
tempdata=(Kcount>>4)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
tempdata=(Kcount&0x0f)+0X30;
if (tempdata>0x39) tempdata=(Kcount&0x0f)+0X37;
LCD_SendChar(tempdata);
Kcount++;
}
/////////////////
void SystemInit(void)
{
PORTA=0;
TRISA=0xC0;
PORTB=0xFF;
TRISB=0;
PORTC=0xff;
TRISC=0xf8;
PORTD=0xfF;
TRISD=0X0F;
PORTE=0x00;
TRISE=0x00;
ADCON0=0x40;
ADCON1=0x0e; //屏蔽此项会导致显示屏乱码
CLRWDT();
}
void timer1_ini() //Timer1初始化设置
{
GIE=0;
PEIE=1;
TMR1IF=0;
TMR1IE=1; //中断使能
//TMR1GE=0; //门控关闭
T1CKPS0=0; //timer1使用预分频率1:4
T1CKPS1=1;
T1OSCEN=0; //不使用T1内部振荡器
TMR1CS=0; //Timer1工作定时器模式,
TMR1H=0xFF; //定时时间:500000uS,误差:0uS
TMR1L=0xEB;
TMR1ON=1;
GIE=1;
}
void stateini(void)
{
Kcount=EEPROM_Read(0x00);
if(Kcount>250) Kcount=0;
Rcount=EEPROM_Read(0x01+Kcount*3);
if(Rcount>250) Rcount=0;
Gcount=EEPROM_Read(0x02+Kcount*3);
if(Gcount>250) Gcount=0;
Bcount=EEPROM_Read(0x03+Kcount*3);
if(Bcount>250) Bcount=0;
}
void LCD_Initialize(void)
{
CLRWDT();
RS=0;
RW=0;
CS=0;
Delay(250);
PORTA=0;
D4=1;
D5=1;
CS_Pulse();
Delay(250);
PORTA=0;
D4=1;
D5=1;
CS_Pulse();
Delay(250);
PORTA=0;
D4=1;
D5=1;
CS_Pulse();
Delay(250);
PORTA=0;
D5=1;
CS_Pulse();
Delay(250);
LCD_SendCommand(0x28);
LCD_SendCommand(DISP_ON);
LCD_SendCommand(CLR_DISP);
LCD_SendCommand(DD_RAM_ADDR_1);
}
void CS_Pulse(void)
{
CS=1;
Delay(250);
CS=0;
}
void LCD_SendCommand(uchar Command)
{
RW=0;
RS=0;
Delay(250);
PORTA=(Command&0xf0)>>2;
CS_Pulse();
Delay(250);
PORTA=(Command&0x0f)<<2;
CS_Pulse();
Delay(250);
}
void LCD_SendChar(uchar Data)
{
RW=0;
RS=1;
Delay(250);
PORTA=(Data&0xf0)>>2;
CS_Pulse();
Delay(250);
PORTA=(Data&0x0f)<<2;
CS_Pulse();
Delay(250);
}
void LCD_SendText(char const * Str)
{
uchar i;
for(i=0;i<strlen(Str);i++)
LCD_SendChar(Str[i]);
}
uchar EEPROM_Read(uchar Addr)
{
GIE=0;
EEADR=Addr;
EEPGD=0;
RD=1;
while(RD);
GIE=1;
return EEDATA;
}
void EEPROM_Write(uchar Addr,uchar Data)
{
GIE=0;
EEADR=Addr;
EEDATA=Data;
EEPGD=0;
WREN=1;
EECON2=0x55;
EECON2=0xaa;
WR=1;
WREN=0;
while(WR);
EEIF=0;
GIE=1;
}
//------------延时函数-------//
void delay(uchar x,uchar y)
{
uchar z;
do{
z=y;
do{;}while(--z);
}while(--x);
}
void Delay(uchar t)
{
while(--t);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -