?? dimmer.c
字號(hào):
#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 //最大調(diào)光級(jí)數(shù)
#define EEPROM_ADDR 0x00
#define INTERVAL_AIMING 20 //連續(xù)調(diào)節(jié)時(shí)的調(diào)光間隔,單位是1ms
#define LED_FLASH_SCALER (180/INTERVAL_AIMING) //連續(xù)調(diào)節(jié)時(shí)指示LED的閃爍周期的分頻
volatile uchar PowerState; //電源開關(guān)狀態(tài)
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一旦工作起來(lái)就無(wú)法停止,向TMR0寄存器賦值啟動(dòng)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太大,超過(guò)數(shù)組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太大,超過(guò)數(shù)組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延時(shí),需要中斷支持,故應(yīng)放在EnableInterrupt()之后
while(1)
{
if(KeyEvent == KEY_PRESSED) { //按鍵按下,允許響應(yīng)對(duì)象為:KEY_DEC、KEY_INC
if(PowerState == OFF){ //電源關(guān)閉時(shí),不響應(yīng)按鍵事件
KeyEvent = KEY_IDLE;
continue;
}
Delay1ms(INTERVAL_AIMING*LED_FLASH_SCALER); //連續(xù)按下超過(guò)200ms轉(zhuǎn)入快速調(diào)節(jié)模式
LED = ON; //按鍵時(shí)LED閃爍一下(結(jié)束)
ScalerCnt = 0;
if(!KEY_DEC){
while(!KEY_DEC){
if(GreyLevel > 0){
GreyLevel--;
DMX512_SendData(CodingTable[GreyLevel]); //調(diào)光
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]); //調(diào)光
//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]); //調(diào)光
//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]); //調(diào)光
//Delay1ms(5);
}
if(KeyEvent == KEY_RELEASED){ //按鍵松開,中斷
DataSave();
break;
}
}
}
}
else if(KeyEvent == KEY_RELEASED) { //按鍵松開,允許響應(yīng)對(duì)象為:KEY_DEC、KEY_INC、KEY_POWER
if(KeyValue & 0x01){ //KEY_POWER鍵按下
if(PowerState){ //切換開關(guān)狀態(tài)
PowerState = OFF;
LED = OFF;
DMX512_SendData(0x00); //關(guān)閉
}else{
PowerState = ON;
LED = ON;
DMX512_SendData(CodingTable[GreyLevel]); //調(diào)光
}
}
else if(KeyValue & 0x02){ //KEY_INC鍵按下
if(!PowerState) continue; //電源關(guān)閉狀態(tài)時(shí)不響應(yīng)
if(GreyLevel < GREY_LEVEL_MAX){
GreyLevel++;
DMX512_SendData(CodingTable[GreyLevel]); //調(diào)光
}
/*else {
GreyLevel = GREY_LEVEL_MAX;
}*/
}
else if(KeyValue & 0x04){ //KEY_DEC鍵按下
if(!PowerState) continue; //電源關(guān)閉狀態(tài)時(shí)不響應(yīng)
if(GreyLevel > 0){
GreyLevel--;
DMX512_SendData(CodingTable[GreyLevel]); //調(diào)光
}
/*else {
GreyLevel = 0;
}*/
}
DataSave();
KeyValue = 0;
KeyEvent = KEY_IDLE;
}
else { //空閑狀態(tài),進(jìn)入休眠狀態(tài)
if(PowerState){
LED = ON;
DMX512_SendData(CodingTable[GreyLevel]);
} else {
LED = OFF;
DMX512_SendData(0x00);
}
SLEEP(); //進(jìn)入休眠狀態(tài),節(jié)電模式
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -