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

📄 dimmer.c.bak

📁 LED控制
💻 BAK
字号:
#include <pic.h>
#include "..\inc\include.h"
#include "..\inc\CodingTable.h"
#include "..\lib\I2C.h"
#include "..\lib\UART.h"
#include "..\lib\Timer.h"
#include "..\lib\GPIO.h"

//#define	GREY_LEVEL_MAX	52						//最大调光级数

#define	EEPROM_ADDR			0x00

#define	INTERVAL_AIMING		10						//连续调节时的调光间隔,单位是10ms
#define	LED_FLASH_SCALER	(12/INTERVAL_AIMING)	//连续调节时指示LED的闪烁周期的分频

volatile uchar   PowerState;						//电源开关状态 
volatile uchar   GreyLevel;							//LED的灰度值

__CONFIG(PROTECT & WDTDIS & MCLRDIS & DEBUGDIS & HS);
void INT_Init(void)
{
	PEIE = 1;						//Enable peripheral interrupt
	RBIE = 1;						//Enable Port B change interrupt
	PORTB = PORTB;
	RBIF = 0;
	//GIE = 1;						//Enable global interrupt
}
	

void Delay(uchar t)
{
	uchar i;
	int j;
	i = t;
	while(i--){
		j = 1000;
		while(j--);	
	}			
}

void DataSave(void)
{
	EEPROM_WriteByte1(EEPROM_ADDR, PowerState);
	EEPROM_WriteByte1(EEPROM_ADDR+1, GreyLevel);
}

void DataResume(void)
{
	uchar ret;
	ret = EEPROM_ReadByte1(EEPROM_ADDR, &PowerState);
	if(ret == NACK) {
		while(1){
			LED = !LED;
			Delay(20);
		}	
	}
	ret = EEPROM_ReadByte1(EEPROM_ADDR+1, &GreyLevel);
	if(ret == NACK) {
		while(1){
			LED = !LED;
			Delay(20);
		}	
	}
}

void interrupt ISR(void)
{
	if(TMR0IE){
		if(TMR0IF){		//Timer0一旦工作起来就无法停止,向TMR0寄存器赋值启动Timer0
			Timer0_ISR();
		}	
	}
	if(TMR1IF){
		if(TMR1IE){
			Timer1_ISR();
		}
	}
	if(RBIF){
		if(RBIE){
			KeyScan();	
		}
	}
}

void Sys_Init(void)
{
	DataResume();						//从EEPROM中读取PowerState和GreyLevel的值
	if(GreyLevel > GREY_LEVEL_MAX){		//避免GreyLevel太大,超过数组CodingTable的上界
		GreyLevel = GREY_LEVEL_MAX;
		DataSave();
	}	
	if(PowerState){
		LED = ON;
		PowerState = ON;	
		DMX512_SendData(CodingTable[GreyLevel]);
		//while(1);
	} else {
		LED = OFF;
		PowerState = OFF;	
		DMX512_SendData(0x00);
	}
}

void main(void)
{
	uchar ScalerCnt;
	uchar Buf,ret;
	
	
	INT_Init();
	Port_Init();
	I2C_Init();
	UART_Init();
	Timer_Init();
	
	ScalerCnt = 0;
	LED = OFF;
	
	/*
	DataResume();			//从EEPROM中读取PowerState和GreyLevel的值
	if(PowerState){
		LED = ON;
		PowerState = ON;	
	} else {
		LED = OFF;
		PowerState = OFF;	
	}
	//LED = ON;
	if(GreyLevel > GREY_LEVEL_MAX){	//避免GreyLevel太大,超过数组CodingTable的上界
		GreyLevel = GREY_LEVEL_MAX;
		DataSave();
	}	
	EnableInterrupt();
	//GreyLevel = 1;
	DMX512_SendData(CodingTable[GreyLevel]);
	*/
	//EEPROM_WriteByte1(EEPROM_ADDR, 1);
	//EEPROM_WriteByte1(EEPROM_ADDR+1, 3);
	
	Delay(100);
	EnableInterrupt();
	DMX512_SendData(0x00);
	Sys_Init();					//需要用到10us延时,需要中断支持,故应放在EnableInterrupt()之后
	
	while(1)
	{
		if(KeyEvent == KEY_PRESSED) {		//按键按下,允许响应对象为:KEY_DEC、KEY_INC
			if(PowerState == OFF){			//电源关闭时,不响应按键事件
				KeyEvent = KEY_IDLE;
				continue;	
			}
			Delay1ms(LED_FLASH_SCALER);	//连续按下超过200ms转入快速调节模式
			LED = ON;		//按键时LED闪烁一下(结束)
			ScalerCnt = 0;
			if(!KEY_DEC){
				while(!KEY_DEC){
					if(GreyLevel > 0){
						GreyLevel--;
						DMX512_SendData(CodingTable[GreyLevel]);						//调光
						Delay1ms(INTERVAL_AIMING);
						if(++ScalerCnt >= LED_FLASH_SCALER){		//6分频,周期120ms
							ScalerCnt = 0;
							LED = !LED;	
						}
					} else {
						GreyLevel = 0;
						if(++ScalerCnt >= LED_FLASH_SCALER){		//6分频,周期120ms
							ScalerCnt = 0;
							LED = ON;
						}
						//DMX512_SendData(CodingTable[GreyLevel]);						//调光
						//Delay1ms(5);
					}
					if(KeyEvent == KEY_RELEASED){	//按键松开,中断
						DataSave();
						break;		
					}
				}
			}
			else if(!KEY_INC){
				while(!KEY_INC){	
					if(GreyLevel < GREY_LEVEL_MAX){
						GreyLevel++;
						DMX512_SendData(CodingTable[GreyLevel]);						//调光
						//DataSave();
						Delay1ms(INTERVAL_AIMING);
						if(++ScalerCnt >= LED_FLASH_SCALER){		//6分频,周期120ms
							ScalerCnt = 0;
							LED = !LED;	
						}
					} else {
						GreyLevel = GREY_LEVEL_MAX;
						if(++ScalerCnt >= LED_FLASH_SCALER){		//6分频,周期120ms
							ScalerCnt = 0;
							LED = ON;
						}
						//DMX512_SendData(CodingTable[GreyLevel]);						//调光
						//Delay1ms(5);
					}
					if(KeyEvent == KEY_RELEASED){	//按键松开,中断
						DataSave();
						break;		
					}
				}
			}
		}
		else if(KeyEvent == KEY_RELEASED) {	//按键松开,允许响应对象为:KEY_DEC、KEY_INC、KEY_POWER
			if(KeyValue & 0x01){			//KEY_POWER键按下
				if(PowerState){											//切换开关状态
					PowerState = OFF;
					LED = OFF;
					DMX512_SendData(0x00);								//关闭
				}else{
					PowerState = ON;
					LED = ON;
					DMX512_SendData(CodingTable[GreyLevel]);			//调光
				}
			}
			else if(KeyValue & 0x02){		//KEY_INC键按下
				if(!PowerState) continue;			//电源关闭状态时不响应
				if(GreyLevel < GREY_LEVEL_MAX){
					GreyLevel++;
					DMX512_SendData(CodingTable[GreyLevel]);						//调光
				} 
				/*else {
					GreyLevel = GREY_LEVEL_MAX;
				}*/
			}
			else if(KeyValue & 0x04){		//KEY_DEC键按下
				if(!PowerState) continue;			//电源关闭状态时不响应
				if(GreyLevel > 0){
					GreyLevel--;
					DMX512_SendData(CodingTable[GreyLevel]);						//调光
				} 
				/*else {
					GreyLevel = 0;
				}*/
			}
			DataSave();
			KeyValue = 0;
			KeyEvent = KEY_IDLE;
		}
		else {								//空闲状态,进入休眠状态
			
			if(PowerState){
				LED = ON;
				DMX512_SendData(CodingTable[GreyLevel]);
			} else {
				LED = OFF;
				DMX512_SendData(0x00);
			}
			SLEEP();						//进入休眠状态,节电模式
			
		}
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -