📄 main.c
字号:
#include "externh.h"
#define ADDRSTART 20
U8 uc[5];
U8 AddrBuf[6];
U8 DataBuf[15];
U8 SecureBuf[10];
GOB g;
SERECTST Serect;
U16 us0,us1;
void UpLoad(void);
void WriteSerect(void);
U8 ReadSerect(void);
void DispMenu(void);
unsigned char StrEquLen(unsigned char *ptr1,unsigned char *ptr2);
void main(void)
{
IntDis();
SystemInit();
Rs232Init();
g.State=0;
IntEn();
LCDInit();
string="Welcome!";
DispStr(3,0);
Delay(100);
while(1){
if(g.Flag.Timer32ms){
g.Flag.Timer32ms=0;
KeyScan();
}
switch(g.State){
case 0:
gSet(1);
AddrBuf[0]=0;
for(us0=1;us0<1001;us0++){
us1=us0*MAXLENGTH+ADDRSTART;
I2CReadStr(us1,DataBuf,2);
if('A'!=DataBuf[0]) break;
}
Serect.Addr=us0;
BinToStr(Serect.Addr,10,AddrBuf);
DataBuf[0]=0;
g.Pos=0;
g.Flag.Secure=0;
break;
case 1:
DispMenu();
if(!Key.hz) break;
if('#'==Key.hz)break;
DataBuf[g.Pos++]=Key.hz;
DataBuf[g.Pos]=0;
if('*'==Key.hz){ //if is '*',then input serect status.
g.Pos=0;
DataBuf[g.Pos]=0;
gSet(2);
I2CReadStr(0,SecureBuf,10);
if(('S'!=SecureBuf[0])||('E'!=SecureBuf[1])){
uc[0]=0;
SecureBuf[uc[0]++]='S';
SecureBuf[uc[0]++]='E';
SecureBuf[uc[0]++]='4';
SecureBuf[uc[0]++]='1';
SecureBuf[uc[0]++]='2';
SecureBuf[uc[0]++]='3';
SecureBuf[uc[0]++]='4';
SecureBuf[uc[0]]=0;
I2CWriteStr(0,SecureBuf,10);
}
else{
}
break;
}
gSet(20);
g.Flag.First=1;
break;
case 2:
DispMenu();
if(!Key.hz) break;
switch(Key.hz){
case '#':
// uc[0]=SecureBuf[2]-'0';
uc[0]=5;
// if((StrEquLen(DataBuf,(U8 *)&SecureBuf[3])==uc[0])){
if((StrEquLen(DataBuf,"123456")==uc[0])){
if('1'==DataBuf[uc[0]]){//UpLoad().
UpLoad();
g.Pos=0;
DataBuf[0]=0;
}
if('2'==DataBuf[uc[0]]){//ModifyData.
AddrBuf[0]=0;
DataBuf[0]=0;
g.Pos=0;
g.Flag.Secure=1;
gSet(10);
break;
}
// if('3'==DataBuf[uc[0]]){//ModifySerect.
// AddrBuf[0]=0;
// gSet(3);
// g.Pos=0;
// DataBuf[g.Pos]=0;
// }
break;
}
else{
if((StrEquLen(DataBuf,"888888")==6)){
I2CReadStr(0,DataBuf,10);
for(uc[0]=0;uc[0]<10;uc[0]++) PutCh(DataBuf[uc[0]]);
}
}
g.Pos=0;
DataBuf[g.Pos]=0;
g.Flag.Disp=1;
break;
default:
if(g.Pos>9) break;
DataBuf[g.Pos++]=Key.hz;
DataBuf[g.Pos]=0;
g.Flag.Disp=1;
break;
}
break;
case 3:
DispMenu();
if(!Key.hz) break;
switch(Key.hz){
case '*':
break;
case '#':
uc[0]=0;
SecureBuf[uc[0]++]='S';
SecureBuf[uc[0]++]='E';
SecureBuf[uc[0]++]=g.Pos+'0';
for(uc[1]=0;uc[1]<g.Pos;uc[1]++){
SecureBuf[uc[0]++]=DataBuf[uc[1]];
}
I2CWriteStr(0,SecureBuf,10);
break;
default:
if(g.Pos>6) break;
DataBuf[g.Pos++]=Key.hz;
DataBuf[g.Pos]=0;
g.Flag.Disp=1;
break;
}
break;
case 10://Addr.
DispMenu();
if(!Key.hz) break;
switch(Key.hz){
case '*':
break;
case '#':
if(0==g.Pos) break;
if(ReadSerect()){
gSet(20);
break;
}
g.Pos=0;
DataBuf[0]=0;
g.Flag.Disp=1;
break;
default:
if(Key.hz<'0') break;
if(Key.hz>'9') break;
if(g.Pos>4) break;
AddrBuf[g.Pos++]=Key.hz;
AddrBuf[g.Pos]=0;
Serect.Addr=StrToBin(AddrBuf,0);
if(Serect.Addr>1000){
g.Pos--;
AddrBuf[g.Pos]=0;
}
Serect.Addr=StrToBin(AddrBuf,0);
g.Flag.Disp=1;
break;
}
break;
case 20://data.
DispMenu();
if(!Key.hz) break;
switch(Key.hz){
case '*':
if(g.Flag.Secure){
g.Pos=0;
g.Flag.Modify=1;
ReadSerect();
gSet(20);
break;
}
g.Pos=0;
DataBuf[0]=0;
gSet(20);
break;
case '#':
WriteSerect();
if(g.Flag.Secure){ //可修改状态.
g.Pos=0;
g.Flag.Modify=0;
ReadSerect();
gSet(10);
break;
}
if(Serect.Addr>1000) break;
Serect.Addr++;
BinToStr(Serect.Addr,10,AddrBuf);
g.Pos=0;
DataBuf[0]=0;
gSet(20);
break;
default:
if(Key.hz<'0') break;
if(Key.hz>'9') break;
if(g.Flag.Modify){
if(g.Pos>MAXLENGTH-2) break;
DataBuf[g.Pos++]=Key.hz;
DataBuf[g.Pos]=0;
g.Flag.Disp=1;
break;
}
if(g.Flag.First){//正常输入.
if(g.Pos>MAXLENGTH-2) break;
DataBuf[g.Pos++]=Key.hz;
DataBuf[g.Pos]=0;
g.Flag.Disp=1;
break;
}
g.Pos=0;
AddrBuf[g.Pos++]=Key.hz;
AddrBuf[g.Pos]=0;
Serect.Addr=StrToBin(AddrBuf,0);
g.Flag.Modify=0;
gSet(10);
break;
}
break;
}
}
}
void WriteSerect(void)
{
U16 us0;
U8 uc0;
uc0=0;
while(DataBuf[uc0++]);
while(uc0){
DataBuf[uc0]=DataBuf[uc0-1];
uc0--;
}
DataBuf[0]='A';
us0=Serect.Addr*MAXLENGTH+ADDRSTART;
I2CWriteStr(us0,DataBuf,MAXLENGTH);
}
U8 ReadSerect(void)
{
U8 i,j;
U16 us0;
U8 tmp[15];
us0=Serect.Addr*MAXLENGTH+ADDRSTART;
I2CReadStr(us0,tmp,MAXLENGTH);
if('A'!=tmp[0]) return(0);
for(i=0;i<MAXLENGTH;i++){
DataBuf[i]=tmp[i+1];
j=DataBuf[i];
// PutCh(j);
if((j<'0')||(j>'9')){
DataBuf[i]=0;
}
}
DataBuf[MAXLENGTH]=0;
g.Flag.Disp=1;
return(1);
}
void UpLoad(void)
{
U16 us0,us1;
U8 *ptr;
U8 ch,i;
PutCh(0x0d);
PutCh(0x0a);
for(us0=1;us0<1001;us0++){
BinToStr(us0,10,DataBuf);
ptr=(U8 *)&DataBuf[0];
for(i=0;i<5;i++){
if(*ptr) PutCh(*ptr++);
else break;
}
for(;i<5;i++) PutCh(' ');
PutCh(':');
us1 =us0*MAXLENGTH+ADDRSTART;
I2CReadStr(us1,DataBuf,MAXLENGTH);
if('A'==DataBuf[0]){
for(i=1;i<MAXLENGTH;i++){
ch =DataBuf[i];
if(ch<'0') break;
if(ch>'9') break;
PutCh(ch);
}
if(1==i) PutCh('N');
}
else PutCh('N');
PutCh(0x0d);
PutCh(0x0a);
}
}
unsigned char * BinToStr(unsigned long d,unsigned int radix,unsigned char *ptr)
{//把二进制数d按进制数radix转换成字符串。
unsigned char buf[10];
unsigned char uc1, *q;
q=(unsigned char *)&buf[9];
*q=0;
do{
uc1 = (d % radix) + '0';
if( uc1 > '9' )
uc1+='A'-'0'-10;
*--q = uc1;
} while( d /= radix );
for(;(*ptr++ = *q++););
ptr--;
return (ptr);
}
unsigned int StrToBin(unsigned char *ptr,unsigned char ch)
{//把一字符串变为二进制.当指针遇见ch时退出.
unsigned int us0;
us0=0;
while(*ptr!=ch){
us0 *=10;
us0+=(*ptr)-'0';
ptr++;
}
return(us0);
}
void DispMenu(void)
{
if(g.Flag.Disp){
g.Flag.Disp=0;
Cls();
string="Addr:";
DispStr(0,0);
string=AddrBuf;
DispStr(5,0);
string="Data:";
DispStr(0,1);
string=DataBuf;
DispStr(5,1);
}
GetKey();
}
unsigned char StrEquLen(unsigned char *ptr1,unsigned char *ptr2)
{//比较两个字符串相等的数目.
unsigned char uc0;
uc0=0;
while(1){
if(*ptr1==0) break;
if(*ptr2==0) break;
if(*ptr1 != *ptr2) break;
uc0++;
ptr1++;
ptr2++;
}
return (uc0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -