📄 oledwinch.c
字号:
real_time.Month = Buf[6];
real_time.Date = Buf[7];
// real_time.ctr_reg = 0x93;
Init_RealDate();
SCISendACK(0xff);
}
///-----------------------
void InitTime(void)
{
real_time.Hours = Buf[5];
real_time.Minutes = Buf[6];
real_time.Seconds = Buf[7];
// real_time.ctr_reg = 0x93;
Init_RealTime();
SCISendACK(0xff);
}
///----------------------
void ShowTime(void)
{
Get_RealTimeClock();
putch(0xff);
putch(0xff);
CSUM = 0x37;
SCISend(0x37);
CSUM = CSUM ^ 0xa1;
SCISend(0xa1);
CSUM = CSUM ^ 0x00;
SCISend(0x00);
CSUM = CSUM ^ 0x07;
SCISend(0x07);
CSUM = CSUM ^ real_time.Year;
SCISend(real_time.Year);
CSUM = CSUM ^ real_time.Month;
SCISend(real_time.Month);
CSUM = CSUM ^ real_time.Date;
SCISend(real_time.Date);
CSUM = CSUM ^ real_time.Hours;
SCISend(real_time.Hours);
CSUM = CSUM ^ real_time.Minutes;
SCISend(real_time.Minutes);
CSUM = CSUM ^ real_time.Seconds;
SCISend(real_time.Seconds);
SCISend(CSUM);
}
void InitPorts(void)
{
TRISA = 0xFF;
TRISB = 0xE3;
TRISC = 0xfe;
TRISD = 0x00;
TRISE = 0x00;
TRISF = 0x00;
PORTF = 0x00;
ADCON1=0xff;// PortA I/O enable
SPBRG1=1;//115200
// SPBRG1=3;//57600
TXSTA1bits.BRGH=1;
TXSTA1bits.TXEN=1;
RCSTA1bits.CREN=1;
RCSTA1bits.SPEN=1;
in=Buf;
out=Buf;
PIE1bits.RC1IE=1;
INTCONbits.PEIE=1;
INTCONbits.GIE = 1;
INTCONbits.GIEL=1;
RCONbits.IPEN=1;
// INTCONbits.GIEH=1;
IPR1bits.RCIP=0;
//MEM
MEM_CE=0;
//
Res1 = 0;
Res2 = 0;
Out_MEM = 0;
AlarmSign.u=0;
}
void InitLCD(void)
{
/// lcd_init();
OLED_CLR(0x00);
DisUnit();
}
//=====================
//------采样主函数
//=====================
//================
//----时钟初始化--
//================
void RTCInit(void)
{
TL=0x00;
time.l=totalsec;
// TMR1H=0x80;
}
//-----------------
void GetProgram(void)
{
// char line;
int i;
if(PSEG==5){PSEG=0;line=line+1;}
Init_FLASH_MEM();
MEM_ReadLine(0,2,0,line);
i=(16*PSEG);
SMU = DataPack[i];
SMV = DataPack[i+1];
SMH = DataPack[i+2];
SML = DataPack[i+3];
AMH = DataPack[i+4];
AML = DataPack[i+5];
for(i=0;i<=63;i++) {
DataPack[i] = 0x00;
}
Alarm_Time = (unsigned int)AMH*256 +
(unsigned int)AML;
AD_CYC = Alarm_Time;
// if(AD_CYC >= 1800) { DisWrong(2); }
Prog_Time = (unsigned long)SMU*65536*256 +
(unsigned long)SMV*65536 +
(unsigned long)SMH*256 +
(unsigned long)SML;
Prog_Time=Prog_Time+time.l;
return;
}
void ADtemp(void)
{
TRISD = 0x00;
for(i=0;i<8;i++){ buf[i]=0x20;}//0x20:Space
lcdnum = depth.u;
lcdnum = lcdnum*10/n.i[1];
format(lcdnum, buf, 1);
DisNum(0,buf);
// Depth Alarm = RF0
lcdnum /= 10;
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = speed;
// lcdnum = lcdnum*2000/n.i[1]; // sample rate: 0.5s.
lcdnum = (lcdnum*2/n.i[1]); // sample rate: 0.5s.
format(lcdnum, buf, 0);
DisNum(2,buf);
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = force;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
DisNum(4,buf);
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = delta;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
DisNum(6,buf);
}
void ADShow(void)
{
// Delay10KTCYx(25);
f0 = f1;
f1 = force;
delta = f1 - f0;
startADC();
ADtemp();
// while(!rdyADC());
WaitrdyADC();
force = getADC()+n.i[2];
Recorddepth();
if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }
Nop();
Nop();
}
void Alarm(void)
{
timep.l=time.l;
timep.l=(timep.l+10);
if(AlarmSign.u!=0) {
do{
ADShow();//
// ADonce();//
Delay10KTCYx(10);
PORTCbits.RC0=1;
Delay10KTCYx(10);
PORTCbits.RC0=0;
Delay10KTCYx(10);
}while(time.l<timep.l);
}
else PORTCbits.RC0=0;
AlarmSign.u=0;
}
void ADCone(void)
{
TRISD = 0x00;
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = depth.u;
lcdnum = (lcdnum*10/n.i[1]);
format(lcdnum, buf, 1);
DisNum(0,buf);
// Depth Alarm = RF0
lcdnum /= 10;
if(speed>0){
if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) AlarmSign.c[0]=1;
else AlarmSign.c[0]=0;
}
if(speed<0) {
if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) AlarmSign.c[0]=1;
else AlarmSign.c[0]=0;
}
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = speed;
// lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
lcdnum = (lcdnum*20/n.i[1]); // sample rate: 0.5s.
format(lcdnum, buf, 1);
DisNum(2,buf);
// Speed Alarm = RF1
if(lcdnum>n.i[7]) AlarmSign.c[1]=1;
else AlarmSign.c[1]=0;
// if(Fristlove==0){lcdnum=10; force=0; delta=0; Fristlove=1;}
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = force;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
DisNum(4,buf);
// Force Alarm = RF2
if(lcdnum>n.i[8]) AlarmSign.c[2]=1;
else AlarmSign.c[2]=0;
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = delta;
lcdnum = ((lcdnum*n.i[3]*11)/(n.i[4]*9));//weiyang 结构系数
format(lcdnum, buf, 3);
DisNum(6,buf);
/////报警控制
if(FristTime==1) Alarm();
}
void delay(long int i)
{
long int j;
for(j=0;j<i;j++);
putch(0xbb);
}
void ADNow(void)
{
// Delay10KTCYx(25);
//OLED_Dis1(0,6,48,800);
//OLED_Dis1(1,6,56,352);
f0 = f1;
f1 = force;
delta = f1 - f0;
js++;
startADC();
ADCone();
//OLED_Dis1(0,6,48,800);
//OLED_Dis1(1,6,56,256);
// while(!rdyADC());
WaitrdyADC();
force = (getADC()+n.i[2]);//
// if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
Recorddepth();
if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }
Nop();
Nop();
}
void ShowAlarmname(void)
{
//最大深度
OLED_Dis2(0,0,0,448);
OLED_Dis2(0,0,16,480);
OLED_Dis2(0,0,32,0);
OLED_Dis2(0,0,48,96);
//最小深度
OLED_Dis2(0,2,0,448);
OLED_Dis2(0,2,16,512);
OLED_Dis2(0,2,32,0);
OLED_Dis2(0,2,48,96);
//最大速度
OLED_Dis2(0,4,0,448);
OLED_Dis2(0,4,16,480);
OLED_Dis2(0,4,32,64);
OLED_Dis2(0,4,48,96);
//最大张力
OLED_Dis2(0,6,0,448);
OLED_Dis2(0,6,16,480);
OLED_Dis2(0,6,32,128);
OLED_Dis2(0,6,48,160);
}
void ShowAlarm(void)
{
char a1,a2;
int j,t;
int c[3];
union eep {
unsigned char c[2];
unsigned int i;
}mc;
OLED_CLR(0x00);
for(j=5;j<9;j++){
t=j*2;
if(eeget(0) == 0x55 && eeget(1) == 0xaa) {
mc.c[0] = eeget(0x10+t);
mc.c[1] = eeget(0x10+t+1);
}
c[j-5]=mc.i;
}
ShowAlarmname();
do{
for(j=0;j<8;j++) { buf[j]=0; }
format(c[0], buf, 0);
DisNum2(0,buf);
for(j=0;j<8;j++) { buf[j]=0; }
format(c[1], buf, 0);
DisNum2(2,buf);
for(j=0;j<8;j++) { buf[j]=0; }
format(c[2], buf, 0);
DisNum2(4,buf);
for(j=0;j<8;j++) { buf[j]=0; }
format(c[3], buf, 0);
DisNum2(6,buf);
}while(PORTAbits.RA4==0);
InitLCD();
return;
}
void OtherSample(void)
{
long lt;
int a=0;
OLED_Dis1(1,0,56,336); // m +
while(final!=0xff){
do{
do{
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)) {
ShowAlarm();
OLED_Dis1(1,0,56,336); // m +
}
if(depth.u!=tp.u) { Sample(); }//深度不增加不存,10分钟1存
// }while(TL == 0 & INTCONbits.TMR0IF == 0);
}while( time.l==lt & INTCONbits.TMR0IF == 0);
// a=a+1;
}while((time.l%20)!=0);
// }while(a<20); //while((time.l%60)!=0);
// a=0;
DataSave(); // Data save
tp.u=depth.u;
}while(Prog_Time>time.l);
PSEG = PSEG + 1;
GetProgram();
final=(SMU&SMV&SMH&SML);
}
}
void manytimes(void)
{
long lt;
int a=0;
OLED_Dis1(1,0,56,320); //m ?
// T0CONbits.TMR0ON=0;
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)) {
ShowAlarm();
OLED_Dis1(1,0,56,320); // m ?
}
if(depth.u != tp.u) { Sample(); }
if(PORTAbits.RA5==0){ depth1.u=0;depth2.u=0;depth.u=0;}
}while( time.l==lt & INTCONbits.TMR0IF == 0);
a=a+1;
// }while(a<30);
// }while((time.l%30)!=0);
// T0CONbits.TMR0ON=1;
OtherSample();
}
void OnlyDepthAD(void)
{
TRISD = 0x00;
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = depth.u;
lcdnum = (lcdnum*10/n.i[1]);
format(lcdnum, buf, 1);
DisNum(0,buf);
// Depth Alarm = RF0
lcdnum /= 10;
if(speed>0){
if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) AlarmSign.c[0]=1;
else AlarmSign.c[0]=0;
}
if(speed<0) {
if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) AlarmSign.c[0]=1;
else AlarmSign.c[0]=0;
}
for(i=0;i<8;i++){ buf[i]=0x20;}
lcdnum = speed;
// lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
lcdnum = (lcdnum*2/n.i[1]); // sample rate: 0.5s.
format(lcdnum, buf, 0);
DisNum(2,buf);
// Speed Alarm = RF1
if(lcdnum>n.i[7]) AlarmSign.c[1]=1;
else AlarmSign.c[1]=0;
/////报警控制
if(FristTime==1) Alarm();
}
void NoSaveSample(void)
{
InitPorts();
// RTCInit();
Newlcd_init();
OLED_CLR(0x00);
SampleInit();
if(n.i[0]==0) Readrecord();///如果深度预制为0,则读取掉电前的值
Nop();
Nop();
speed = 0;
force = 0;
Delay10KTCYx(100);
InitLCD();
if(ErrNo==1024){
while(1){
OnlyDepthAD();
Recorddepth();
if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }
if(PORTAbits.RA4==0) { ShowAlarm(); }
OLED_Dis1(0,6,48,ErrNo);
}
}
while(1){
f0 = f1;
f1 = force;
delta = f1 - f0;
startADC();
ADCone();
// while(!rdyADC());
WaitrdyADC();
force = (getADC()+n.i[2]);//
// if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
Recorddepth();
if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }
if(PORTAbits.RA4==0) { ShowAlarm(); }
OLED_Dis1(0,6,48,ErrNo);
Nop();
Nop();
}
}
void Sample(void)
{
// lcd_putrs((unsigned rom char *)"深度 m ");
// InitLCD();
long lt;
OLED_Dis1(1,0,56,352); // m
while(final!=0xff){
do{
do{
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)) { ShowAlarm(); }
/// if((depth.u==tp.u)&(delta<25)&(FristTime==1)) { manytimes(); }//深度不增加不存,1分钟1存
// }while(TL == 0 & INTCONbits.TMR0IF == 0);
}while(lt == time.l & INTCONbits.TMR0IF == 0);
}while((time.l%AD_CYC)!=0);
DataSave(); // Data save
/// if(FristTime==1){ Dectime(); DostoUnix(); }
tp.u=depth.u;
}while(Prog_Time>time.l);
PSEG = PSEG + 1;
GetProgram();
FristTime=1;
final=(SMU&SMV&SMH&SML);
}
}
void SampleInit(void)
{
//initial Timer0;
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_8);
//initial RB1;
OpenRB1INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & FALLING_EDGE_INT);
OpenRB2INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & RISING_EDGE_INT);
cmdinit();//// 读取E2PROM中的预置值
depth.u = n.i[0];
depth.u *= n.i[1];
depth1.u = n.i[0];
depth1.u *= n.i[1];
depth2.u = n.i[0];
depth2.u *= n.i[1];
speed = 0;
initADC();
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
// depth1.u = depth2.u = depth.u;
///从Sample()中调过来的
final=0x00;
PSEG=0;
// SamplInit();
tp.u=depth.u;////
}
//------------------------
void ADCMode(void)
{
OLED_CLR(0x00);
DisLogMode();
Version(32,80);////-------------
// Init_FLASH_MEM();
// MEM_FindFirst();
// MEM_LableFirst();
// Init_MEM();
RTCInit();
SampleInit();
if(n.i[0]==0) Readrecord();///如果深度预制为0,则读取掉电前的值
Nop();
Nop();
speed = 0;
force = 0;
Delay10KTCYx(100);
InitLCD();
Sample();
}
////-----
void Version(int c1,int c2)
{
OLED_Dis2(1,4,16,272);
OLED_Dis2(1,4,24,288);
OLED_Dis2(1,4,32,304);
OLED_Dis2(1,4,40,c1);
OLED_Dis2(1,4,48,256);
OLED_Dis2(1,4,56,16);
OLED_Dis1(1,4,0,c2);
}
///
void main(void)
{
TRISC = 0x18;
OpenI2C(MASTER,SLEW_OFF); // Open I2C Bus
SSPADD = 9; // 100kHz clock (3.6864MHz)
Dectime();
DostoUnix();
PMode=1;
if(PORTAbits.RA4==0) PMode=0; //模式键(S2)判断
FristTime=0;
ErrNo = 0;
// Fristlove=0;
InitPorts();
/// PORTAbits.RA5==1; //深度清0
Init_MEM();
RST=0;
RST=1;
Newlcd_init();
// if(PORTAbits.RA5==0) PMode=2;
////---------------
if(PMode==1){///1是采样
Init_HowSPM();
ADCMode();
}
else {
SwapMode = 0;
OLED_CLR(0x00);
DisComcMode();
Version(32,80);///
do{
in=Buf;
out=Buf;
SCIGetPack(); // Get a data packet
SCISendACK(0xa1); // send ACK
switch(pcmd)
{
case 1:
SCISendACK(0xa1);break; // Send acknowledge[SendNull]
case 2:
SCIData();break; // Send a sample[GetSample]
case 4:
SCIErase();break; // EraseBlock
case 8:
SCIFormat();break; // FormatTool<<<<<-------
case 16:
SCIRead();break; // ReadLine
case 32:
SCIWrite(); break; // WriteLine
case 64:
SCIBlock();break; // ReadBlock
case 80:
ShowAllParameter();break; //显示所有设置参数
case 81:
SetParameter();break; //设置参数
case 82:
ReadParameter();break; //读取参数
case 83:
ShowTime();break;
case 84:
InitDate();break; //预制日期(年/月/日)
case 85:
InitTime();break; //预制时间(24时/分/秒)
default:break;
}
}while(SwapMode!=1);
SwapMode = 0;
}
}
//-----End of Program-----
//=============
//----NOTE-----
//=============
//+++++++ Function Map +++++++
//----中断服务程序(2级中断模式)
//----实时时钟
//----存储器代码
//----LCD显示
//----7714代码
//----响应与应答
//----PC接口函数
//----Log Mode
//----初始化
//----模式转换
//----main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -