⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rgb_pwm.c

📁 三路课存储 掉电不丢失的数据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 + -