📄 dimmer.c
字号:
#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 20 //连续调节时的调光间隔,单位是1ms
#define LED_FLASH_SCALER (180/INTERVAL_AIMING) //连续调节时指示LED的闪烁周期的分频
volatile uchar PowerState; //电源开关状态
volatile uchar GreyLevel; //LED的灰度值
//__CONFIG(PROTECT & WDTDIS & MCLREN & DEBUGDIS & HS);
__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(INTERVAL_AIMING*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 + -