//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2011 Shenyang 213.
// Wbr
// Tool chain: KEIL Full 'c'
//
//#pragma CD OE DB SB // Compilation directives
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include "C8051F340.h"
#include "1302.h"
#include "lcd.h"
#include <INTRINS.H>
#define SYSCLK 12000000 // SYSCLK frequency in Hz
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
#define T 1800 //運算電量的時間單位1800是半個小時(1800秒)
#define N 11
sfr16 TMR2 = 0xCC; //定義成16位地址
sfr16 ADC0 = 0xBD;
uint xdata ADCbuffer1[N];
uint count;
uint sum = 0;
uchar ADcount = 0;
uchar ADsend;
uchar Page = 1,direction = 1;
uchar set = 0,ent = 0,Tset;
uchar TH,TL,TT1,TT2,TT3; //用來拆分送顯示的變量
uchar keybuffer[6];
uchar BGset=0; //BGset背光關,開控制量,如果沒有鍵按下超過1分鐘,關閉背光!有鍵按下立刻開背光
bit Disptime,PDD;
sbit DI1 = P0^0 ;
sbit DI2 = P0^1 ;
sbit DE = P0^6 ;
sbit BLK = P0^7 ; //LCD背光
sbit JC1 = P2^7 ;
sbit JC2 = P3^1 ;
sbit JC3 = P3^2 ;
sbit JC4 = P3^3 ;
sbit DI3 = P3^6 ;
sbit DI4 = P3^7 ;
uchar code CPT_c[20] _at_ 0x8000; //7k的地址左右//充電時間要存入的FLASH地址,保存3天的時間和功率
uchar xdata CPT_x[20] _at_ 0x8000;
uchar code FPT_c[20] _at_ 0x8200; //7k的地址左右//放電時間要存入的FLASH地址,保存3天的時間和功率
uchar xdata FPT_x[20] _at_ 0x8200;
uchar xdata Between[20]; //0~11時間12~19存功率
////////////////////////////////////
extern void Init_Device(void);
extern uchar time_buf1[8] ;
uchar code tab1[]={
"實時電壓:"
};
uchar code tab2[]={
"實時電流:"
};
uchar code tab3[]={
"實時功率:"
};
uchar code tab4[]={
"運行狀態:"
};
uchar code tab5[]={
"歷史充電記錄"
};
uchar code tab6[]={
"歷史放電記錄"
};
uchar code tab7[]={
"當前時間"
};
uchar code tab8[]={
"修改時間"
};
uchar code tab9[]={
"暫無記錄"
};
uchar code run1[]={
"停機"
};
uchar code run2[]={
"充電"
};
uchar code run3[]={
"放電"
};
uchar code run4[]={
"故障"
};
//uchar code run5[]={
//"系統故障信息"
//};
uchar code run5[]={
"感謝您的使用"
};
uchar code run6[]={
"本日累計充電"
};
uchar code run7[]={
"本日累計放電"
};
uchar code run8[]={
"版本號:V1.0"
};
uchar xdata TAB[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};//數字0~9及顯示空白0x20
//----------------------------------------
// Function PROTOTYPES
//----------------------------------------
void delayms(uint ms)
{
uint Temp;
while(ms--)
{
Temp=1000;
while(Temp--);
{
//PCA0CPH2 = 1;
}
}
}
/*void Timer2_Init(int count2s)
{
TMR2CN = 0x00;
TMR2L = -count2s;
TMR2 = 0xffff;
ET2 = 1;
TR2 = 1;
}*/
//================================
//中值濾波程序
//================================
void filter()
{
static uchar count,i,j;
uint value_buf[N];
uint temp;
sum=0;
for(count=0;count<N;count++)
{
value_buf[count] = ADCbuffer1[count];;
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count<N-1;count++)
sum += value_buf[count];
}
void Uart0_SendData(uchar dat0)
{
SBUF0=dat0; //寫SBUF0,開始發送
while(TI0==0); //等待發送
TI0=0; //清發送標志位
}
void Flash_Erase_CTP() //flash擦除充電時間和功率
{
EA =0;
VDM0CN = 0x80; // 使能VDD監視器
RSTSRC = 0x02; // 上電復位VDD監視器復位標志
FLSCL=0X80; // 使能FLASH單穩態定時器,FLASH讀時間SYSCLK<=25MHz
FLKEY = 0xA5; // 寫入關鍵字
FLKEY = 0xF1; // 寫入關鍵字
PSCTL |= 0x03; //允許擦,允許寫
CPT_x[0] = 0;
PSCTL &= ~0x03; //禁止寫,禁止擦
//EA = 1;
}
void Flash_Program_CTP() //flash寫入充電時間時間和功率
{
uchar j;
EA =0;
//Flash_Erase_CTP();
VDM0CN = 0x80; //使能VDD監視器
RSTSRC = 0x02; //上電復位/VDD監視器復位標志
FLSCL=0X80; //使能FLASH單穩態定時器,FLASH讀時間SYSCLK<=25MHz
PSCTL |= 0x01; //write enable
for(j =0;j<20;j++)
{
FLKEY = 0xa5;
FLKEY = 0xf1;
CPT_x[j] = Between[j];
//delayms(30);
}
PSCTL &= ~0x01; //禁止寫
EA = 1;
}
//***********************************
void Flash_Erase_FTP() //flash擦除放電時間和功率
{
EA =0;
VDM0CN = 0x80; // 使能VDD監視器
RSTSRC = 0x02; // 上電復位VDD監視器復位標志
FLSCL=0X80; // 使能FLASH單穩態定時器,FLASH讀時間SYSCLK<=25MHz
FLKEY = 0xA5; // 寫入關鍵字
FLKEY = 0xF1; // 寫入關鍵字
PSCTL |= 0x03; //允許擦,允許寫
FPT_x[0] = 0;
PSCTL &= ~0x03; //禁止寫,禁止擦
//EA = 1;
}
void Flash_Program_FTP() //flash寫入放電時間和功率
{
uchar j;
//Flash_Erase_FTP();
EA = 0;
VDM0CN = 0x80; //使能VDD監視器
RSTSRC = 0x02; //上電復位/VDD監視器復位標志
FLSCL=0X80; //使能FLASH單穩態定時器,FLASH讀時間SYSCLK<=25MHz
PSCTL|=0x01; //write enable
for(j =0;j<20;j++)
{
FLKEY = 0xa5;
FLKEY = 0xf1;
FPT_x[j] = Between[j];
}
PSCTL &= ~0x01; //禁止寫
EA = 1;
}
/*void Flash_Read()
{
static uchar j;
for(j=0;j<3;j++)
{
timer[j]=Ftime_c[j];
}
}*/
//**********************************************
//按鍵處理程序
//**********************************************
void key_scan()
{
static uchar i,k;
uchar Mkey=P4;
if(BGset<2)
{
if((Mkey&0xFE)!= 0XFE) //有鍵按下先開啟背光
{
delayms(200);
if((Mkey&0xFE)!= 0XFE)
{
BGset++;
if(BGset>1)
{
BGset = 2;
}
}
}
}
if(BGset ==2 )
{
if(!(Mkey&0x80)) //SW1按下嗎?ALM
{
delayms(200); //消抖
if(!(Mkey&0x80)) //再判斷
{
BGset =2; //開背光
if(k<1) {Page = 0;} //頁面0:顯示故障狀態}
k++;
if(k>1) {k =0;Page = 1; } //再按后退出
set = 0;
}
}
if(!set)
{
if(!(Mkey&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(Mkey&0x40))
{
if(Page !=0)
{
Page++;
BGset =2;
if(Page>6) //如果超過5界面回到1畫面
{
Page = 1;
}
}
}
}
if(!(Mkey&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(Mkey&0x20))
{
if(Page !=0)
{
Page--;
BGset =2;
if(Page<1) //小于1畫面后不顯示0畫面,顯示6畫面
{
Page = 6;
}
}
}
}
}
if(Page ==6) //修改時間界面
{
if(!(Mkey&0x04)) //SW6按下嗎?設定SET只在6畫面設置時間
{
delayms(200);
if(!(Mkey&0x04))
{
BGset =2;
set = 1; //如果按下SET鍵表示開始設置時間,置設置標志位;
}
}
if(set)
{
if(!(Mkey&0x10)) //SW4按下嗎?左移<- 只在6畫面修改時間
{
delayms(200);
if(!(Mkey&0x10))
{
BGset =2;
direction--;
if(direction < 1)
{
direction = 6;
}
}
}
if(!(Mkey&0x08)) //SW5按下嗎?右移->只在6畫面修改時間
{
delayms(200);
if(!(Mkey&0x08))
{
BGset =2;
direction++;
if(direction > 6)
{
direction = 1;
}
}
}
switch(direction)
{
case 1:
{
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset =2;
keybuffer[0]++;
if(keybuffer[0]>99) //年設置,不超過100年
{
keybuffer[0] = 11;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset =2;
keybuffer[0]--;
if(keybuffer[0]<11) //小于1畫面后不顯示0畫面,顯示6畫面
{
keybuffer[0] = 11;
}
}
}
if(Tset < 4)
{
TH = keybuffer[0]/10;
TL = keybuffer[0]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (1,0,0x91,1,0x20,0x20);
}
}break;
case 2:
{
TH = keybuffer[0]/10;
TL = keybuffer[0]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset =2;
keybuffer[1]++;
if(keybuffer[1]>12) //月設置,不超過12月
{
keybuffer[1] = 1;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset =2;
keybuffer[1]--;
if(keybuffer[1]<1) //小于1 顯示12月
{
keybuffer[1] = 12;
}
}
}
if(Tset < 4)
{
TH = keybuffer[1]/10;
TL = keybuffer[1]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (1,0,0x93,1,0x20,0x20);
}
}break;
case 3:
{
TH = keybuffer[1]/10;
TL = keybuffer[1]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset =2;
keybuffer[2]++;
if(keybuffer[2]>31) //日設置,不超過31日
{
keybuffer[2] = 1;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset =2;
keybuffer[2]--;
if(keybuffer[2]<1) //小于1,顯示31日
{
keybuffer[2] = 31;
}
}
}
if(Tset<4)
{
TH = keybuffer[2]/10;
TL = keybuffer[2]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (1,0,0x95,1,0x20,0x20);
}
}break;
case 4:
{
TH = keybuffer[2]/10;
TL = keybuffer[2]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset =2;
keybuffer[3]++;
if(keybuffer[3]>23) //時設置,不超過24
{
keybuffer[3] = 0;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset =2;
keybuffer[3]--;
if(keybuffer[3]<=0) //小于1,顯示23
{
keybuffer[3] = 23;
}
}
}
if(Tset < 4)
{
TH = keybuffer[3]/10;
TL = keybuffer[3]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (0,1,0x85,1,0x20,0x20);
}
}break;
case 5:
{
TH = keybuffer[3]/10;
TL = keybuffer[3]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]);
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset =2;
keybuffer[4]++;
if(keybuffer[4]>59) //分設置,不超過59
{
keybuffer[4] = 0;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset =2;
keybuffer[4]--;
if(keybuffer[4]<=0) //小于1,顯示59
{
keybuffer[4] = 59;
}
}
}
if(Tset < 4)
{
TH = keybuffer[4]/10;
TL = keybuffer[4]%10;
number_disp (0,1,0x87,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (0,1,0x87,1,0x20,0x20);
}
}break;
case 6:
{
TH = keybuffer[4]/10;
TL = keybuffer[4]%10;
number_disp (0,1,0x87,1,TAB[TH],TAB[TL]);
if(!(P4&0x40)) //SW2按下嗎?下翻
{
delayms(200);
if(!(P4&0x40))
{
BGset = 2;
keybuffer[5]++;
if(keybuffer[5]>59) //時設置,不超過24
{
keybuffer[5] = 0;
}
}
}
if(!(P4&0x20)) //SW3按下嗎?上翻
{
delayms(200);
if(!(P4&0x20))
{
BGset = 2;
keybuffer[5]--;
if(keybuffer[5]<=0) //小于1,顯示23
{
keybuffer[5] = 59;
}
}
}
if(Tset < 4)
{
TH = keybuffer[5]/10;
TL = keybuffer[5]%10;
number_disp (0,1,0x89,1,TAB[TH],TAB[TL]);
}
if(Tset>4)
{
number_disp (0,1,0x89,1,0x20,0x20);
}
}break;
default:break;
}
if(!(Mkey&0x02)) //SW7按下嗎?確認ENT 只在6畫面設定時間
{
delayms(200);
if(!(Mkey&0x02))
{
BGset =2;
for(i=0;i<6;i++)
{
time_buf1[i+1] = keybuffer[i];
}
Ds1302_Write_Time(); //寫DS1302
set = 0;
Page = 1; //退出到1畫面
}
}
}
}
}
}
void Pchange(uint PW)
{
TH = PW/10000; //放電萬位
TL = (PW-TH*10000)/1000; //千位
TT1 = (PW-TH*10000-TL*1000)/100;
TT2 = (PW-TH*10000-TL*1000-TT1*100)/10;
TT3 = (PW-TH*10000-TL*1000-TT1*100)%10;
if(!TH)
{
TH = 10;
if(!TL)
{
TL = 10;
if(!TT1)
{
TT1 = 10;
}
}
}
}
//-----------------------------------------------------------------------------
// Main 年:0xC4EA 月:0xD4C2 日:0xC8D5 時:0xCAB1: 分0xB7D6: 秒:0xC3EB 的漢字內碼
//-----------------------------------------------------------------------------
void main(void)
{
uchar Page1,j;
uchar Runstate ; //Runstate為運行狀態指示:DI1=1;DI2=1停機;DI1=0;DI2=1充電;DI1=1;DI2=0放電;DI1=1;DI2=1故障
uint VT,AT,PT,PC1,PF1,PDIS,PdownCount; //電壓電流功率功率計數變量
uint ADC1,ADC2,ADC3,ADC4; //四路AD通道變量
long a,PT1,PT2; //P1,P2充放電累計功率
//P0 = 0;
//P1 = 0;
P4 =0xfe;
P2 = 0;
P3 = 0;
Init_Device();
PCA0MD &= ~0x40;
EA = 0;
//BLK = 1;
delayms(1000);
Ds1302_Init();
init_lcd ();
clrram ();
ADC0CF = ((SYSCLK/3000000)-1)<<3; // set SAR clock to 3MHz
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
TMR3CN = 0x04; //啟動TM3
//Timer2_Init(SYSCLK/12/50); //20ms
EA = 1;
DE = 1;
TR1 = 1;
Ds1302_Read_Time();
while(1)
{
//PCA0CPH2 = 1; //喂狗
key_scan();
if(BGset)
{
BLK = 1;
}
if(!BGset)
{
BLK = 0;
} //按鍵掃描
if((DI1==1)&&(DI2==1)) Runstate = 0xa6; //停機
if((DI1==0)&&(DI2==1)) Runstate = 0xb7; //充電
if((DI1==1)&&(DI2==0)) Runstate = 0xc8; //放電
if((DI1==0)&&(DI2==0)) Runstate = 0xd9; //故障
//if(Runstate == 0xb7) //充電的FLASH存儲處理
if(!set)
{
if((time_buf1[2] != CPT_c[10])|| (time_buf1[3] != CPT_c[11])) //讀取的當前時間與緩存不等的時候,所有內容依次前移
{
Between[0]=CPT_c[3]; //依次前移
Between[1]=CPT_c[4];
Between[2]=CPT_c[5];
Between[3]=CPT_c[6];//年
Between[4]=CPT_c[7];//月
Between[5]=CPT_c[8];//日
Between[6]=CPT_c[9];
Between[7]=CPT_c[10];
Between[8]=CPT_c[11];
Between[9]=time_buf1[1];
Between[10]=time_buf1[2];
Between[11]=time_buf1[3];
Between[12]=CPT_c[14];
Between[13]=CPT_c[15];
Between[14]=CPT_c[16];
Between[15]=CPT_c[17];
Between[16]=CPT_c[18];
Between[17]=CPT_c[19];
Between[18] = PC1>>8;
Between[19] = PC1&255;
Flash_Erase_CTP();
Flash_Program_CTP(); //保存至FLASH
}
}
//if(Runstate == 0xc8) //放電時FLASH存儲處理
if(!set)
{
if((time_buf1[2] != FPT_c[10])|| (time_buf1[3] != FPT_c[11]))
{
Between[0]=FPT_c[3]; //依次前移
Between[1]=FPT_c[4];
Between[2]=FPT_c[5];
Between[3]=FPT_c[6];//年
Between[4]=FPT_c[7];//月
Between[5]=FPT_c[8];//日
Between[6]=FPT_c[9];
Between[7]=FPT_c[10];
Between[8]=FPT_c[11];
Between[9]=time_buf1[1];
Between[10]=time_buf1[2];
Between[11]=time_buf1[3];
Between[12]=FPT_c[14];
Between[13]=FPT_c[15];
Between[14]=FPT_c[16];
Between[15]=FPT_c[17];
Between[16]=FPT_c[18];
Between[17]=FPT_c[19];
Between[18] = PF1>>8;
Between[19] = PF1&255;
Flash_Erase_FTP();
Flash_Program_FTP(); //保存至FLASH
}
}
if(PDD)
{
PDD = 0;
if(Runstate == 0xb7) //如果充電
{
PdownCount++; //秒累加
PT1 = PT1+PT; //秒累計的功率,
PC1 = PT1/3600; //實際充電功率,按小時計算,注意此時累計電量為實際的10倍,為了送小數顯示
if(PdownCount > T) //超過半個小時開始寫入EEPROM
{
PdownCount = 0;
for(j=0;j<20;j++) //先讀出FLASH里的時間
{
Between[j]=CPT_c[j];
}
if((time_buf1[2] == Between[10])&& (time_buf1[3] == Between[11])) //當前時間等于緩存時間,繼續寫入緩存
{
Between[18] = PC1>>8;
Between[19] = PC1&255;
Flash_Program_CTP(); //寫功率和時間到FLASH
}
}
}
if(Runstate == 0xc8) //如果放電
{
PdownCount++; //秒累加
PT2 = PT2+PT; //秒累計的功率
PF1 = PT2/3600; //實際放電功率,按小時計算,,注意此時累計電量為實際的10倍,為了送小數顯示
if(PdownCount > T) //超過半個小時開始寫入EEPROM
{
PdownCount = 0;
for(j=0;j<20;j++) //先讀出FLASH里的時間
{
Between[j]=FPT_c[j];
}
if((time_buf1[2] == Between[10])&& (time_buf1[3] == Between[11])) //當前時間等于緩存時間,繼續寫入緩存
{
Between[18] = PF1>>8;
Between[19] = PF1&255;
Flash_Program_FTP(); //寫功率和時間到FLASH
}
}
}
}
if(Disptime)
{
Disptime = 0;
Ds1302_Read_Time();
if(Page!=Page1)
{
clrram (); //如果頁面變化,需要清屏;
}
switch(Page)
{
case 1: //畫面1:顯示當前電壓電流
{
string_disp (1,0,0x80,10,tab1); //顯示電壓
string_disp (1,0,0x90,10,tab2); //顯示電流
string_disp (0,1,0x80,10,tab3); //顯示功率
string_disp (0,1,0x90,10,tab4);
if(Runstate == 0xa6)string_disp (0,1,0x96,4,run1); //顯示停機
if(Runstate == 0xb7)string_disp (0,1,0x96,4,run2); //顯示充電
if(Runstate == 0xc8)string_disp (0,1,0x96,4,run3); //顯示放電
if(Runstate == 0xd9)string_disp (0,1,0x96,4,run4); //顯示故障
TH= VT/1000; //拆分送顯示千位
TL = (VT%1000)/100; //拆分送顯示百位
TT1 = ((VT%1000)%100)/10; //拆分送顯示十位
TT2 = ((VT%1000)%100)%10; //拆分送顯示個位
if(!TH)
{
TH = 10;
if(!TL)
{
TL = 10;
}
}
number_disp (1,0,0x85,1,TAB[TH],TAB[TL]); //電壓送顯示
number_disp (1,0,0x86,1,TAB[TT1],0x2E);
number_disp (1,0,0x87,1,TAB[TT2],0x20);
number_disp (1,0,0x88,1,0x56,0x20);
TH= AT/1000; //拆分送顯示千位
TL = (AT%1000)/100; //拆分送顯示百位
TT1 = ((AT%1000)%100)/10; //拆分送顯示十位
TT2 = ((AT%1000)%100)%10; //拆分送顯示個位
if(!TH) //高位為零,滅零處理
{
TH = 10;
if(!TL)
{
TL = 10;
}
}
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); //電流送顯示
number_disp (1,0,0x96,1,TAB[TT1],0x2E);
number_disp (1,0,0x97,1,TAB[TT2],0x20);
number_disp (1,0,0x98,1,0x41,0x20);
TH= PT/1000; //拆分送顯示千位
TL = (PT%1000)/100; //拆分送顯示百位
TT1 = ((PT%1000)%100)/10; //拆分送顯示十位
TT2 = ((PT%1000)%100)%10; //拆分送顯示個位
if(!TH) //高位為零,滅零處理
{
TH = 10;
if(!TL)
{
TL = 10;
}
}
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); //功率送顯示
number_disp (0,1,0x86,1,TAB[TT1],0x2E);
number_disp (0,1,0x87,1,TAB[TT2],0x4B);
number_disp (0,1,0x88,1,0x57,0x20);
Page1=Page; //保存當前頁面值
}break;
case 2:
{
string_disp (1,0,0x80,12,run6);
string_disp (0,1,0x80,12,run7);
Pchange(PC1);
number_disp (1,0,0x94,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x95,1,TAB[TT1],TAB[TT2]);
number_disp (1,0,0x96,1,0x2e,TAB[TT3]);
number_disp (1,0,0x97,1,0x4b,0x57);
Pchange(PF1);
number_disp (0,1,0x94,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x95,1,TAB[TT1],TAB[TT2]);
number_disp (0,1,0x96,1,0x2e,TAB[TT3]);
number_disp (0,1,0x97,1,0x4b,0x57);
Page1=Page;
}break;
case 3: //顯示歷史充電記錄
{
string_disp (1,0,0x80,12,tab5); //
//第1條信息
if((CPT_c[0]>99)||(CPT_c[1]>12)||(CPT_c[2]>31))
{
string_disp (1,0,0x90,8,tab9);
} //如果讀取時間不對,顯示“暫無記錄”
else
{
number_disp (1,0,0x90,1,0x32,0x30); //0送顯示
TH = CPT_c[0]/10;
TL = CPT_c[0]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x92,1,0xc4,0xea); //年
TH = CPT_c[1]/10;
TL = CPT_c[1]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x94,1,0xd4,0xc2); //月
TH = CPT_c[2]/10;
TL = CPT_c[2]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x96,1,0xc8,0xd5); //日
PDIS = CPT_c[12];
PDIS = PDIS<<8 + CPT_c[13];
Pchange(PDIS);
number_disp (1,0,0x98,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x99,1,TAB[TT1],TAB[TT2]);
number_disp (1,0,0x9A,1,0x2e,TAB[TT3]);
number_disp (1,0,0x9B,1,0x4b,0x57);
}
//第2條信息
if((CPT_c[3]>99)||(CPT_c[4]>12)||(CPT_c[5]>31))
{
string_disp (0,1,0x80,8,tab9);
} //如果讀取時間不對,顯示“暫無記錄”
else
{
number_disp (0,1,0x80,1,0x32,0x30); //0送顯示
TH = CPT_c[3]/10;
TL = CPT_c[3]%10;
number_disp (0,1,0x81,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x82,1,0xc4,0xea); //年
TH = CPT_c[4]/10;
TL = CPT_c[4]%10;
number_disp (0,1,0x83,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x84,1,0xd4,0xc2); //月
TH = CPT_c[5]/10;
TL = CPT_c[5]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x86,1,0xc8,0xd5); //日
PDIS = CPT_c[14];
PDIS = PDIS<<8 + CPT_c[15];
Pchange(PDIS);
number_disp (0,1,0x88,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x89,1,TAB[TT1],TAB[TT2]);
number_disp (0,1,0x8A,1,0x2e,TAB[TT3]);
number_disp (0,1,0x8B,1,0x4b,0x57);
}
//第3條信息
if((CPT_c[6]>99)||(CPT_c[7]>12)||(CPT_c[8]>31))
{
string_disp (0,1,0x90,8,tab9); //如果讀取時間不對,顯示“暫無記錄”
}
else
{
number_disp (0,1,0x90,1,0x32,0x30); //0送顯示
TH = CPT_c[6]/10;
TL = CPT_c[6]%10;
number_disp (0,1,0x91,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x92,1,0xc4,0xea); //年
TH = CPT_c[7]/10;
TL = CPT_c[7]%10;
number_disp (0,1,0x93,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x94,1,0xd4,0xc2); //月
TH = CPT_c[8]/10;
TL = CPT_c[8]%10;
number_disp (0,1,0x95,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x96,1,0xc8,0xd5); //日
PDIS = CPT_c[16];
PDIS = PDIS<<8 + CPT_c[17];
Pchange(PDIS);
number_disp (0,1,0x98,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x99,1,TAB[TT1],TAB[TT2]);
number_disp (0,1,0x9A,1,0x2e,TAB[TT3]);
number_disp (0,1,0x9B,1,0x4b,0x57);
}
Page1=Page;
}break;
case 4: //顯示歷史放電記錄
{
string_disp (1,0,0x80,12,tab6); //
//第1條信息
if((FPT_c[0]>99)||(FPT_c[1]>12)||(FPT_c[2]>31)) //如果讀取時間不對,顯示“暫無記錄”
{
string_disp (1,0,0x90,8,tab9);
}
else
{
number_disp (1,0,0x90,1,0x32,0x30); //0送顯示
TH = FPT_c[0]/10;
TL = FPT_c[0]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x92,1,0xc4,0xea); //年
TH = FPT_c[1]/10;
TL = FPT_c[1]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x94,1,0xd4,0xc2); //月
TH = FPT_c[2]/10;
TL = FPT_c[2]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x96,1,0xc8,0xd5); //日
PDIS = FPT_c[12];
PDIS = PDIS<<8 + FPT_c[13];
Pchange(PDIS);
number_disp (1,0,0x98,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x99,1,TAB[TT1],TAB[TT2]);
number_disp (1,0,0x9A,1,0x2e,TAB[TT3]);
number_disp (1,0,0x9B,1,0x4b,0x57);
}
//第2條信息
if((FPT_c[3]>99)||(FPT_c[4]>12)||(FPT_c[5]>31))
{
string_disp (0,1,0x80,8,tab9); //如果讀取時間不對,顯示“暫無記錄”
}
else
{
number_disp (0,1,0x80,1,0x32,0x30); //0送顯示
TH = FPT_c[3]/10;
TL = FPT_c[3]%10;
number_disp (0,1,0x81,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x82,1,0xc4,0xea); //年
TH = FPT_c[4]/10;
TL = FPT_c[4]%10;
number_disp (0,1,0x83,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x84,1,0xd4,0xc2); //月
TH = FPT_c[5]/10;
TL = FPT_c[5]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x86,1,0xc8,0xd5); //日
PDIS = FPT_c[14];
PDIS = PDIS<<8 + FPT_c[15];
Pchange(PDIS);
number_disp (0,1,0x88,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x89,1,TAB[TT1],TAB[TT2]);
number_disp (0,1,0x8A,1,0x2e,TAB[TT3]);
number_disp (0,1,0x8B,1,0x4b,0x57);
}
//第3條信息
if((FPT_c[6]>99)||(FPT_c[7]>12)||(FPT_c[8]>31))
{
string_disp (0,1,0x90,8,tab9);
}
else
{
number_disp (0,1,0x90,1,0x32,0x30); //0送顯示
TH = FPT_c[6]/10;
TL = FPT_c[6]%10;
number_disp (0,1,0x91,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x92,1,0xc4,0xea); //年
TH = FPT_c[7]/10;
TL = FPT_c[7]%10;
number_disp (0,1,0x93,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x94,1,0xd4,0xc2); //月
TH = FPT_c[8]/10;
TL = FPT_c[8]%10;
number_disp (0,1,0x95,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x96,1,0xc8,0xd5);
PDIS = FPT_c[16];
PDIS = PDIS<<8 + FPT_c[17];
Pchange(PDIS);
number_disp (0,1,0x98,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x99,1,TAB[TT1],TAB[TT2]);
number_disp (0,1,0x9A,1,0x2e,TAB[TT3]);
number_disp (0,1,0x9B,1,0x4b,0x57);
}
Page1=Page;
}break;
case 5: //顯示當前時間
{
string_disp (1,0,0x80,10,tab7);
number_disp (1,0,0x90,1,0x32,0x30); //0送顯示
TH = time_buf1[1]/10;
TL = time_buf1[1]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x92,1,0xc4,0xea); //年
TH = time_buf1[2]/10;
TL = time_buf1[2]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x94,1,0xd4,0xc2); //月
TH = time_buf1[3]/10;
TL = time_buf1[3]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x96,1,0xc8,0xd5); //日
TH = time_buf1[4]/10;
TL = time_buf1[4]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); //
number_disp (0,1,0x86,1,0xca,0xb1); //時
TH = time_buf1[5]/10;
TL = time_buf1[5]%10;
number_disp (0,1,0x87,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x88,1,0xb7,0xd6); //分
TH = time_buf1[6]/10;
TL = time_buf1[6]%10;
number_disp (0,1,0x89,1,TAB[TH],TAB[TL]); //
number_disp (0,1,0x8a,1,0xc3,0xeb); //秒
Page1=Page;
}break;
case 6: //修改時間
{
if(!set) //沒有按SET鍵
{
string_disp (1,0,0x80,10,tab8);
number_disp (1,0,0x90,1,0x32,0x30); //0送顯示
TH = time_buf1[1]/10;
TL = time_buf1[1]%10;
number_disp (1,0,0x91,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x92,1,0xc4,0xea); //年
TH = time_buf1[2]/10;
TL = time_buf1[2]%10;
number_disp (1,0,0x93,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x94,1,0xd4,0xc2); //月
TH = time_buf1[3]/10;
TL = time_buf1[3]%10;
number_disp (1,0,0x95,1,TAB[TH],TAB[TL]);
number_disp (1,0,0x96,1,0xc8,0xd5); //日
TH = time_buf1[4]/10;
TL = time_buf1[4]%10;
number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); //
number_disp (0,1,0x86,1,0xca,0xb1); //時
TH = time_buf1[5]/10;
TL = time_buf1[5]%10;
number_disp (0,1,0x87,1,TAB[TH],TAB[TL]);
number_disp (0,1,0x88,1,0xb7,0xd6); //分
TH = time_buf1[6]/10;
TL = time_buf1[6]%10;
number_disp (0,1,0x89,1,TAB[TH],TAB[TL]); //
number_disp (0,1,0x8a,1,0xc3,0xeb); //秒
for (j = 0;j<6;j++)
{
keybuffer[j] = time_buf1[j+1];
}
}
Page1=Page; //保存當前頁面值
}break;
case 0: //顯示故障狀態
{
string_disp (1,0,0x90,12,run5);
string_disp (0,1,0x85,12,run8);
Page1=Page; //保存當前頁面值
}break;
default:break;
}
}
if(ADsend)
{
ADsend = 0;
if(ADcount == 1)
{
filter();
ADC1= (sum/(N-2));
if(ADC1<5)
{
ADC1 = 0;
}
a = (long)7500*ADC1/1021; //放大10倍,為了送顯示小數點
VT = a; //
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
AMX0P = 0x06; //下一個轉換通道P30
AD0EN = 1;
}
if(ADcount == 2)
{
filter();
ADC2= (sum/(N-2));
a = (long)4000*ADC2/1021; //放大10倍,為了送顯示
AT = a;
a =(long)VT*AT/10000; //放大10倍的功率,單位KW
PT = a;
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
AMX0P = 0x08; //下一個轉換通道P26
AD0EN = 1;
}
if(ADcount == 3)
{
filter();
ADC3= (sum/(N-2));
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
AMX0P = 0x09; //下一個轉換通道P34
AD0EN = 1;
}
if(ADcount == 4)
{
filter();
ADC4= (sum/(N-2));
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
AMX0P = 0x05; //下一個轉換通道P35
AD0EN = 1;
}
}
}
}
void UART0_ISR(void) interrupt 4
{
static uchar Rcv;
if(RI0)
{
Rcv = SBUF0;
RI0 =0;
}
/*if(Rcv == 0x7E) //
{
i = 1;
buffer[0] = Rcv;
}
else
{
if(i < 13) //12個字節
{
buffer[i] = Rcv;
i++;
}
} */
}
/*void TIME2_ISR (void) interrupt 5
{
TF2H = 0; //清標志位
count1++;
if(count1 ==5)
{
count1 = 0;
}
} */
void ADC0_ISR (void) interrupt 10
{
static uchar count; // Loop counter
AD0INT = 0; //清中斷標志位
switch( AMX0P ) //通道轉換
{
case 0x05: //P2.6
ADCbuffer1[count]=ADC0;
count++;
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
if (count > N-1){
count = 0;
AD0EN = 0; //禁止轉換
ADcount = 1;
}
break;
case 0x06: //P3.0
ADCbuffer1[count]=ADC0;
count++;
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
if (count > N-1){
count = 0;
AD0EN = 0;
ADcount = 2;
}
break;
case 0x08: //P3.4
ADCbuffer1[count]=ADC0;
count++;
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
if (count > N-1){
count = 0;
AD0EN = 0;
ADcount = 3;
}
break;
case 0x09: //P3.5
ADCbuffer1[count]=ADC0;
count++;
ADC0CN |=0x10; //寫ADC0BUSY位啟動轉換
if (count > N-1){
count = 0;
AD0EN = 0;
ADcount = 4;
}
break;
default:break;
}
}
//-----------------------------------------------------------------------------
//TIMER3中斷
//-----------------------------------------------------------------------------
void Timer3_ISR(void) interrupt 14
{
static uchar i,j,k;
TMR3CN &=~(0x80); //清標志位
count++;
i++;
j++;
if(count == 8) //200ms
{
count = 0;
ADsend = 1; //開始進行AD處理標志
Tset++;
if(Tset>5)
{
Tset = 0;
}
}
if(i==20)
{
i = 0;
Disptime = 1;
}
if(j==39) //1秒誤差累積;正常是40
{
j = 0;
PDD = 1; //一秒時間到,開始計算功率
if(BGset)
{
k++;
if(k>240) //4分鐘關背光
{
k=0;
BGset = 0;
}
}
}
}