?? dimmer.c.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 + -