1.png (50.44 KB, 下載次數: 112)
下載附件
2015-7-26 09:58 上傳
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define WriteDeviceAddress 0xa0
#define ReadDeviceAddress 0xa1
uchar e=0,sec=1,select;
uchar at_add=0;
unsigned int sec_page;
uchar idata x_rdat[40];
bit w=0;
uchar at_i=0;
uchar idata t[10]={0,0,0,0,0,0,0,0};
uchar alarm[8]={0,0,0,0,0,0,0,0},alarm_td,alarm_flag,alarm_stop=0,x_j,alarm_i;
uchar idata x_tdat[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned int r_dat;
unsigned char time, show_time;
unsigned char temp,sel_flag,show_flag;
unsigned char fs_td,td;
sbit dog=P2^0;
sbit alarm_led=P2^1;
sbit e_485 = P2^4;
sbit KEY_1 = P1^6;
sbit KEY_2 = P1^7;
sbit KEY_3 = P1^5;
sbit KEY_4 = P1^4;
sbit ep_sck=P2^2;
sbit ep_si=P2^3;
sbit ep_so=P3^5;
sbit ep_cs=P3^4;
void xinput(unsigned char v)
{ unsigned char data v1;
for(v1=0;v1<8;v1++)
{ ep_sck=0;
ep_si=v&0x80;
ep_si=1;
v=v<<1;}
ep_si=1;
}
unsigned char xout()
{ unsigned char data v1,x,y;
for(v1=0;v1<8;v1++)
{
ep_sck=1;
y=ep_so;
x=x|y;
ep_sck=0;}
return x;}
void wip_poll()
{ unsigned char data v;
do
{ ep_cs=1; ep_cs=0; xinput(0x05); v=xout(); ep_cs=1; v=v&0x01;}
while(v==1);}
void wren()
{ep_cs=1; ep_cs=0; xinput(0x06); ep_cs=1;}
void wrdi()
{ep_cs=1; ep_cs=0; xinput(0x04); ep_cs=1;}
void wrsr(unsigned char x)
{wren();
ep_cs=1;
ep_cs=0;
xinput(0x01);
xinput(x);
ep_cs=1;
wip_poll();}
unsigned char rdsr()
{ unsigned char data x;
ep_cs=1;
ep_cs=0;
xinput(0x05);
x=xout();
ep_cs=1;
return x; }
void byte_write(unsigned char wrdat,unsigned int wradd)
{
unsigned char data x;
wren();
ep_cs=1;
ep_cs=0;
if(wradd<256)
xinput(0x02);
else
xinput(0x0a);
x=wradd%256;
xinput(x);
xinput(wrdat);
ep_cs=1;
wip_poll();
wrdi();}
unsigned char byte_read(unsigned int rdadd)
{
unsigned char data x;
ep_cs=1;
ep_cs=0;
if(rdadd<256)
xinput(0x03);
else
xinput(0x0b);
x=rdadd%256;
xinput(x);
x=xout();
ep_cs=1;
return(x); }
void word_write(unsigned int wrdat1,unsigned int wradd1)
{ unsigned char data x;
wren();
ep_cs=1;
ep_cs=0;
if(wradd1<256)
xinput(0x02);
else
xinput(0x0a);
x=wradd1%256;
xinput(x);
x=wrdat1>>8;
xinput(x);
x=wrdat1%256;
xinput(x);
ep_cs=1;
wip_poll();
wrdi();}
unsigned int word_read(unsigned int rdadd1)
{ unsigned char data x;
unsigned int data rddat1;
ep_cs=1;
ep_cs=0;
if(rdadd1<256)
xinput(0x03);
else
xinput(0x0b);
rddat1=rdadd1%256;
xinput(rddat1);
x=xout();
rddat1=100*x;
x=xout();
rddat1=rddat1+x;
ep_cs=1;
return(rddat1);}
//LCD12864//
sbit cs=P1^0 ;
sbit sid=P1^1 ;
sbit clk=P1^2;
sbit ret=P1^3;
unsigned char mo,dd;
void Delay_Xus(unsigned char x)
{ while(--x); }
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{ for(i=0;i<120;i++);}}
void SendByte(unsigned char Dbyte)
{ unsigned char i;
for(i=0;i<8;i++)
{ clk = 0;
Dbyte=Dbyte<<1;
sid=CY;
clk=1;
clk=0; }}
unsigned char ReceiveByte(void)
{ unsigned char i,temp1,temp2;
temp1=temp2=0 ;
for(i=0;i<8;i++)
{ temp1=temp1<<1;
clk=0 ;
clk=1 ;
clk=0 ;
if(sid)
temp1++;}
for(i=0;i<8;i++)
{ temp2=temp2<<1 ;
clk=0;
clk=1;
clk=0;
if(sid)
temp2++;}
return ((0xf0&temp1)+(0x0f&temp2));
}
void CheckBusy( void )
{ do SendByte(0xfc);
while(0x80&ReceiveByte());
}
void WriteCommand( unsigned char Cbyte )
{ cs = 1;
CheckBusy();
SendByte(0xf8);
SendByte(0xf0&Cbyte);
SendByte(0xf0&Cbyte<<4);
cs=0;
}
void WriteData( unsigned char Dbyte )
{ cs=1;
CheckBusy();
SendByte(0xfa);
SendBbyte(0xf0&Dbyte);
SendByte(0xf0&Dbyte<<4);
cs=0;
}
unsigned char ReadData()
{ unsigned char tmp;
cs = 1;
CheckBusy();
SendBusy(0xfe);
return ReceiveByte();
do SendByte(0xfe);
while(tmp=ReceiveByte())!=0x00;
return tmp;
cs=0;
}
void lcd_cls()
{ WriteCommand(0x01);}
void address_reset()
{ WriteCommand(0x02);}
void enter_mode_set(bit i_d,bit s)
{ unsigned char cmd=0x04;
if (i_d) cmd|=0x02;
if (s) cmd|=0x01;
WriteCommand(cmd);
}
void display_state(bit d,bit c,bit b)
{ unsigned char cmd=0x08;
if (d) cmd|=0x04;
if (c) cmd|=0x02;
if (b) cmd|=0x01;
WriteCommand(cmd);
}
void cursor_display(bit s_c,bit r_l)
{
unsigned char cmd =0x10;
if (s_c) cmd|=0x08;
if (r_l) cmd|=0x04;
WriteCommand(cmd);
}
void lcd_mode(bit dl,bit re,bit g)
{ unsigned char cmd =0x20;
if (dl) cmd|=0x10;
if (g) cmd|=0x02;
WriteCommand(cmd);
if (re) cmd|=0x04;
WriteCommand(cmd);
}
void DDRAM_address(unsigned char x,unsigned char y)
{
unsigned char temp=y-1;
if (y==2) temp=2;
if (y==3) temp=1;
WriteCommand(0x80+temp*8+x-1);
}
void await_orders()
{ lcd_cls();
WriteCommand(0x0q);
}
void coding_display(const char *s)
{ while(*s)
{ WriteData(*s++);}
}
void show_num(unsigned int num)
{ unsigned char d[5];
d0[0]=num/10000+0x30;
d0[1]=num%10000/1000+0x30;
d0[2]=num%1000/100+0x30;
d0[3]=num%100/10+0x30;
d0[4]=num%10+0x30;
if(d[0]!=0x30)
{ coding_display(d);}
else if(d[1]!=0x30)
{ coding_displayd(d+1);}
else if(d[2]!=0x30)
{ coding_display(d+2);}
else if(d[3]!=0x30)
{ coding_display(d+3);}
else { coding_display(d+4);}
}
void lcd_init()
{ ret=0;
ret=1;
lcd_mode(1,0,0);
display_state(1,0,0);
lcd_cls();
enter_mode_set(1,0);
}
sbit T_CLK=P2^5;
sbit T_IO=P2^6;
sbit T_RST=P2^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
typedef struct SYSTEMTIME
{ uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}
SYSTEMTIME;
void WriteB(uchar ucDa)
{ uchar i;
ACC=ucDa;
for(i=8;i>0;i--)
{ T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
uchar ReadB(void)
{ uchar i;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
void W_1302(uchar ucAddr,uchar ucDa)
{ T_RST=0;
T_CLK=0;
T_RST=1;
WriteB(ucAddr);
WriteB(ucDa);
T_CLK=1;
T_RST=0;
}
uchar R_1302(uchar ucAddr)
{ uchar ucDa;
T_RST=0;
T_CLK=0;
T_RST=1;
WriteB(ucAddr);
ucDa=ReadB();
T_CLK=1;
T_RST=0;
return(ucDa);
}
void set_1302()
{ uchar ucAddr=0x80;
W_1302(0x8e,0x00);
W_1302(0x80,0x00);
W_1302(0x82,0x00);
W_1302(0x84,0x00);
W_1302(0x86,0x00);
W_1302(0x88,0x00);
W_1302(0x8a,0x00);
W_1302(0x8c,0x00);
}
void get_1302(SYSTEMTIME *Time)
{ uchar Readtime;
Readtime = R_1302(0x81);
Time->Second = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x83);
Time->Minute = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x85);
Time->Hour = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x87);
Time->Day = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
dd=((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x8b);
Time->Week = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x89);
Time->Month = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
mo=((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x8d);
Time->Year = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 + '0'; Time->DateString[4] = Time->Month%10 + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 + '0'; Time->DateString[7] = Time->Day%10 + '0'; Time->DateString[8] = '\0'; //將十進制數轉換為液晶顯示的數值 Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] =Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10+ '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10+ '0';
Time->TimeString[8] = '\0';
Time->TimeString[0] = Time->Hour/10+'0';
Time->TimeString[1] = Time->Hour%10+'0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10+'0';
Time->TimeString[4] = Time->Minute%10+'0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10+'0';
Time->TimeString[7] = Time->Second%10+'0';
Time->TimeString[8] = '\0';
sec=Time->Second%10;
}
void set_page(unsigned char sel)
{ unsigned char max,mini;
WriteCommand(0x90);
show_flag=0;
if(sel==0) {coding_display("循環工作");max=1; mini=0;sel_flag=sel;}
if(sel==1) {coding_display("選擇工作");max=8; mini=0;sel_flag=sel;}
if(sel==2) {coding_display("報警通道");max=7; mini=0;sel_flag=sel;}
if(sel==3) {coding_display("電壓設定");max=200; mini=0;sel_flag=sel;}
if(sel==4) {coding_display("歷史通道");max=8; mini=0;sel_flag=sel;}的數據
if(sel==5) {coding_display("歷史7-13");sel_flag=sel;}
if(sel==6) {coding_display("歷史13-18");sel_flag=sel;}
if(sel==7) {coding_display("歷史18-20");sel_flag=sel;}
WriteCommand(0x95);
coding_display(" ");
if(KEY_2 == 0)
{ temp++;}
if(KEY_4 == 0)
{ temp--;}
if(temp>max)
temp=mini;
if(temp<mini)
temp=max;
if(sel==2){alarm_td=temp;}
if(sel==3){alarm[alarm_td]=temp;}
byte_write(x_j,0x01C2+alarm_td);
}
void up_data()
{ if(sel_flag==3)
{ WriteCommand(0x95);
show_num(temp/100);
coding_display(".");
show_num(temp/10%10);
temp--;
show_num(temp%10);
}
else
{ WriteCommand(0x95);
show_num(temp);
coding_display(" ");
}
}
void up_page()
{ SYSTEMTIME Realtime;
get_1302(&Realtime);
DDRAM_address(1,2);
coding_display(" 八路采集系統 ");
DDRAM_address(1,3);
coding_display("Time:");
coding_display(Realtime.TimeString);
DDRAM_address(1,4);
coding_display("Date:");
coding_display(Realtime.DateString);
WriteCommand(0x83);
coding_display(" ");
WriteCommand(0x80);
coding_display("[Dis] ");
WriteCommand(0x85);
coding_display(" [Set]");
}
void up_show()
{ if(sel_flag==0)
{
if(temp==1)
{
WriteCommand(0x82);
coding_display("循環采樣");
WriteCommand(0x90);
show_num(td);
coding_display(": ");
coding_display(".");
show_num(x_tdat[2*td]%10);
show_num(x_tdat[2*td+1]/10);
show_num(x_tdat[2*td+1]%10);;
coding_display(" v T=");
show_num(t[td]);
coding_display(" ");
td=td+1;
if(td>7) {td=0;}
}
}
if(sel_flag==1)
{ WriteCommand(0x82);
coding_display("選擇采樣");
WriteCommand(0x90);
show_num(temp);
coding_display(": ");
show_num(x_tdat[2*temp]/10);
coding_display(".");
show_num(x_tdat[2*temp]%10);
show_num(x_tdat[2*temp+1]/10);
show_num(x_tdat[2*temp+1]%10);
coding_display(" v T=");
show_num(t[temp]);
coding_display(" ");}
if(sel_flag==2)
{ WriteCommand(0x82);
coding_display("報警通道");
WriteCommand(0x90);
coding_display("通道: ");
show_num(alarm_td);
alarm_led=1;
}
if(sel_flag==4)
{ uchar j;
WriteCommand(0x82);
coding_display("回放歷史 ");
show_num(temp);
WriteCommand(0x90);
for(j=x_j;j>0;j--)
{ x_rdat[2*(x_j-j)]=byte_read(2*temp+16*j);
x_rdat[2*(x_j-j)+1]=byte_read(2*temp+16*j+1); }
for(j=19;j>x_j;j--)
{ x_rdat[2*(20-j+x_j)]=byte_read(2*temp+16*j); x_rdat[2*(20-j+x_j)]=byte_read(2*temp+16*j+1); }
for(j=1;j<3;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x88);
for(j=3;j<5;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x98);
for(j=5;j<7;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10); coding_display(" v ");
}}
if(sel_flag==5)
{ unsigned char j;
WriteCommand(0x90);
for(j=7;j<9;j++)
{show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x88);
for(j=9;j<11;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x98);
for(j=11;j<13;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10); coding_display(" v ");
}
}
if(sel_flag==6)
{ unsigned char j;
WriteCommand(0x90);
for(j=13;j<15;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10); coding_display(" v ");
}
WriteCommand(0x88);
for(j=15;j<17;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x98);
for(j=17;j<19;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10); coding_display(" v ");
}
}
}
void key()
{
if (KEY_3==0)
{delayms(20);
if(KEY_3==0&&w==1)
{lcd_cls();
e++;
if (e >7){e = 0;}
set_page(e); }
if(KEY_3==0&&w==0)
{lcd_cls();
w=1;
WriteCommand(0x80);
coding_display("Esc");
WriteCommand(0x86);
coding_display("Next");
WriteCommand(0x98);
coding_display("[+] ");
WriteCommand(0x9e);
coding_display(" [-]");
set_page(e);
}
while(KEY_3==0);
delayms(20);
}
if(KEY_1==0)
{
delayms(50);
if(KEY_1==0&&w==1)
{ w=0;
e=0;
while(KEY_1==0);開
delayms(50);
}
if(KEY_1==0&&w==0)
{
lcd_cls();
w=1;
WriteCommand(0x80);
show_flag=1;
coding_display("Esc");
while(KEY_1 == 0);
delayms(20);
}}
if (KEY_2==0&&w==1)
{ delayms(20);
if (KEY_2==0&&w==1)
{ set_page(e);
up_data();}
while(KEY_2==0);
delayms(20);
}
if (KEY_4==0&&w==1)
{ delayma(20);
if (KEY_4==0&&w==1)
{ set_page(e);
up_data();
}
while(KEY_4==0);
delayms(20);
}}
unsigned char comm(unsigned char data add,unsigned char data command)
{ unsigned char idata r_buff[5]={0,0,0,0,0};
unsigned char data j,err=0;
e_485=1;
SBUF=add;while(TI==0);TI=0;
SBUF=command;while(TI==0);TI=0;
SBUF=add+command;while(TI==0);TI=0;
RI=0;
e_485=0;
for(j=0;j<5;j++)
{ r_dat=0;
RI=0;
while((RI==0)&&(r_dat<400))
{r_dat++;}
if(RI==1)
{ r_buff[j]=SBUF;RI=0;}
else
{err=1;break;}
}
if((err==0)&&(r_buff[4]==r_buff[3]+r_buff[2]+r_buff[1]+r_buff[0])&&(r_buff[0]==add))
{ r_dat=0xFF;}
else
{ r_dat=0x00;}
x_tdat[2*add]=r_buff[1];
x_tdat[2*add+1]=r_buff[2];
t[add]=r_buff[3];
if(((r_buff[1]*10+r_buff[2]/10)>alarm[add])&&(alarm[add]!=0))
{
alarm_flag=1;
alarm_td=add;}
return r_dat;
}
void fs() interrupt 1
{
TR0=0;
TH0 = 0x3c;
TL0 = 0xb0;
time=time+1;
show_time=show_time+1;
if(time==2)
{
time=0;
comm(fs_td,0x00);
fs_td=fs_td+1;
}
sec=sec+1;
sec_page=sec_page+1;
if(fs_td>7){fs_td=0;} TR0=1;
}
void diaodian() interrupt 0
{ byte_write(x_j,0x0190);}
void watchdog()
{ dog=0;
_nop();
_nop_();
_nop_();
dog=1;
}
main()
{
TMOD = 0x21;
TH1 = 0xFD;
TL1 = 0xFD;
TH0 = 0x28;
TL0 = 0x00;
SCON = 0x50;
ET0=1;
select=1;
e_485=0;
EX0=1;
TR1 = 1;
TR0 = 1;
EA=1;
set_1302();
lcd_init();
x_j=byte_read(0x0190);
for(alarm_i=0;alarm_i<8;alarm_i++)
{ alarm[alarm_i]=byte_read(0x01C2+alarm_i);}
while(1)
{ watchdog();
if (w==0)
show_flag=0;
}
key();
watchdog();
if((show_flag==1)&&(show_time>15))
{ EA=0;
up_show();
EA=1;
show_time=0;
}
watchdog();
if(sec%150==0)
{
unsigned char i;
sec=0;
for(i=0;i<16;i++)
{
byte_write(x_tdat,16*x_j+i);
}
x_j=x_j+1;
if(x_j>19){x_j=0;}
}
if(alarm_flag==1)
{
alarm_led=~alarm_led;
alarm_flag=0;
}
}
|