|
//沒有用IAPIDLE功能,有沒有高手指點一下利弊
#include <STC15F104E_PLUS.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
//#define uint unsigned int
//#define MAIN_Fosc 22118400L //定義主時鐘
//#define MAIN_Fosc 12000000L //定義主時鐘
#define MAIN_Fosc 11059200L //定義主時鐘
//#define MAIN_Fosc 5529600L //定義主時鐘
//#define MAIN_Fosc 24000000L //定義主時鐘
//#define MAIN_Fosc 40000000L //定義主時鐘
//#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
//#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節讀命令
#define CMD_PROGRAM 2 //IAP字節編程命令
#define CMD_ERASE 3 //IAP扇區擦除命令
//測試地址
#define IAP_ADDRESS1 0X0000 //內部EEPROM地址
#define IAP_ADDRESS2 0X0200
/*初始定義*/
bit write = 0;
sbit VD=P3^3; //紅色LED 0.50v=10v ;1.00=27v ;3.85=73v;
sbit CD=P3^4; //綠色LED
sbit ZS=P3^5; //指示LED轉換 0 - 紅色LED調整;1 - 綠色LED調整
sbit BA=P3^0; //編碼器的a腳接P3.0
sbit BB=P3^1; //編碼器的b腳接P3.1
sbit QH=P3^2; //編碼器的按鍵接P3.2 電壓調整或電流調整299=5.00V
BYTE v_temp,c_temp,XZ = 0,flag,a0,b0,c0;// 128 109 48 29 //48=0.96V;29=0.58V;
void InitTimer0() interrupt 1 // 0.5毫秒@11.0592MHz 頻率 1000HZ
{
IE2 = 0x00; //關閉定時器2中斷
AUXR = 0XE4; //關閉定時器2計數
TL0 = 0xCD; //設置定時初值 0.5毫秒@11.0592MHz
TH0 = 0xD4; //設置定時初值 0.5毫秒@11.0592MHz
VD = 1;
CD = 1;
flag = 1;
AUXR = 0xF4; //開啟定時器2計數
IE2 = 0x04; //開啟定時器2中斷允許
}
void InitTimer2() interrupt 12 //2微秒@11.0592MHz 控制燈亮時間
{
flag++;
T2L = 0xD4; //設置定時初值 2微秒@11.0592MHz
T2H = 0xFF; //設置定時初值 2微秒@11.0592MHz
if(v_temp == flag) VD=0;
if(c_temp == flag) CD=0;
}
/*//關閉IAP
void IapIdle()
{
IAP_CONTR = 0; //關閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發寄存器
IAP_ADDRH = 0x80; //將地址設置到非IAP區域
IAP_ADDRL = 0;
}
*/
//從ISP/IAP/EEPROM區域讀取一字節
BYTE IapReadByte(WORD addr)
{
BYTE dat; //數據緩沖區
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //讀ISP/IAP/EEPROM數據
//IapIdle(); //關閉IAP功能
return dat; //返回
}
//寫一字節數據到ISP/IAP/EEPROM區域
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_DATA = dat; //寫ISP/IAP/EEPROM數據
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
//IapIdle();
}
//扇區擦除
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
//IapIdle();
}
/*void Timer0Init(void) //100微秒@24.000MHz 10KHZPWM
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0xA0; //設置定時初值--100微秒@24.000MHz
TH0 = 0xF6; //設置定時初值--100微秒@24.000MHz
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
void Timer2Init(void)//0.4微秒@24.000MHz
{
AUXR |= 0x04; //定時器時鐘1T模式
T2L = 0xF6; //設置定時初值--0.4微秒@24.000MHz
T2H = 0xFF; //設置定時初值--0.4微秒@24.000MHz
AUXR |= 0x10; //定時器2開始計時
}
*/
void bianmaqi(void)//捕捉EC11按下和旋轉信息
{
unsigned char a, b, c;
a = BA; b = BB; c = QH;
if (a != a0) // BA changed
{
a0 = a;
if (b != b0) // BB changed
{
b0 = b;write = 1;
if ((a == b) && (XZ == 0) && (v_temp < 153)) {v_temp++;}//225 153
if ((a == b) && (XZ == 1) && (c_temp < 73)) {c_temp++;}//208 65
if ((a != b) && (XZ == 0) && (v_temp > 23)) {v_temp--;}//85 23
if ((a != b) && (XZ == 1) && (c_temp > 5)) {c_temp--;}//29 5
}
}
if (!c && c0)
{
if (XZ == 0 )
{
XZ = 1;
ZS = 1;
}
else if(XZ == 1)//切換
{
XZ = 0;
ZS = 0;
}
}
c0 = c;
}
void init()
{
AUXR = 0XE4; //設置定時器0和2為1T模式
TMOD = 0x00;
TL0 = 0xCD; //設置定時初值 0.5毫秒@11.0592MHz 0xA0;--100微秒@24.000MHz
TH0 = 0xD4; //設置定時初值 0.5毫秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz
T2L = 0xD4; //設置定時初值 2微秒@11.0592MHz 0xF6;--0.4微秒@24.000MHz
T2H = 0xFF; //設置定時初值 2微秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz
EA = 1;
ET0 = 1;
TR0 = 1; //定時器0開始計時
P3M1 &= 0xF7;
P3M0 |= 0x08; //P3.3(推挽)
P3M1 &= 0xEF;
P3M0 |= 0x10; //P3.4(推挽)
P3M1 &= 0xDF;
P3M0 |= 0x20; //P3.5(推挽)
VD = 0;
CD = 0;
ZS = 0; // 0 - 電壓調整狀態;1 - 電流調整狀態
a0 = BA;
b0 = BB;
c0 = QH;
v_temp = IapReadByte(1);
if (v_temp == 0 ){v_temp = 65;} //128 65
if (v_temp > 153){v_temp = 65;} //245 128
c_temp = IapReadByte(10);
if (c_temp == 0 ){c_temp = 29;} //109
if (c_temp > 29 ){c_temp = 29;} //208 109
}
void main()
{
init();
while(1)
{
bianmaqi();
if (write == 1) {
write = 0;TR0 = 0;
IapEraseSector(IAP_ADDRESS1);//擦除扇區
if (XZ == 0 ) {
IapProgramByte(1,v_temp); //寫入數據
}
else if (XZ == 1 ) {
IapProgramByte(10,c_temp); //寫入數據
}
}
_nop_();
TR0 = 1;
}
}
|
評分
-
查看全部評分
|