📄 debug.c
字号:
vege_type[0]='\0';
put_string(0x9d," "); //清除当前的代号显示
put_string(0x9d,vege_type); //显示取消后的vege_type
}
else if(display_type==1) //价格界面
{
if(vege_price[4]!='\0') vege_price[4]='\0';
else if(vege_price[3]!='\0') vege_price[3]='\0';
else if(vege_price[2]!='\0') vege_price[2]='\0';
else if(vege_price[1]!='\0') vege_price[1]='\0';
else if(vege_price[0]!='\0') vege_price[0]='\0';
else if(vege_price[0]=='\0') //如果没有输入价格
{
display_type=0;
write_cmd(0x01); //清除当前界面
delay_160ms(); //如果没这句经常会乱屏
type_screen(); //返回到品种界面
return;
}
put_string(0x8a," "); //清除正在显示的价格
put_string(0x8a,vege_price); //在第3行第4列显示当前蔬菜价格
}
else if(display_type==2) //信息界面
{
//清除各全局变量
info_count=0;
info_page_index=0;
vege_type[0]=vege_type[1]=vege_type[2]='\0';
vege_price[0]=vege_price[1]=vege_price[2]=vege_price[3]=vege_price[4];
vege_price[5]='\0';
for(i=0;i<140;i++)
sms_deliver.PDUData[i]='\0';
display_type=0;
write_cmd(0x01);
put_string(0x90," ");
put_string(0x90,"所有信息已删 !");
put_string(0x96,chu);
delay_1s();
type_screen();
}
}
//确认键
void key_confirm()
{
char idata i;
if(display_type==0) //蔬菜品种界面
{
if( (vege_type[0]<='5'&&vege_type[0]>='0')
&& (vege_type[1]<='9'&&vege_type[1]>='0')
&& !(vege_type[0]=='5'&&vege_type[1]=='9')
&& !(vege_type[0]=='0'&&vege_type[1]=='0') )//合理的类型(没有蔬菜类型59和00)
{
display_type=1; //价格界面
price_screen(); //显示价格界面
}
else
{
put_string(0x9d,"代号错");
delay_160ms();
put_string(0x9d," ");
vege_type[0]='\0'; //蔬菜品种清除
vege_type[1]='\0';
}
}
if(display_type==1) //价格界面
{
if(vege_price[0]!='\0')
{
if(sms_deliver.PDUData[0]=='\0')
{
sms_deliver.PDUData[0]='P';
sms_deliver.PDUData[1]='R';
}
if(sms_deliver.PDUData[0]=='P')
sms_deliver.PDUData[strlen(sms_deliver.PDUData)]=',' ; //蔬菜信息间隔逗号
strcat(sms_deliver.PDUData,vege_type); //保存此条菜价信息
strcat(sms_deliver.PDUData,vege_price);
info_count++; //信息条数加1
write_cmd(0x01) ; //清除当前显示
put_string(0x90," ") ; //第二行第一列
for(i=0;i<1;i++)
{
put_string(0x90,"该信息存储成功。") ; //间隔160ms闪烁显示"该信息存储成功"
delay_500ms();
write_cmd(0x01);
delay_160ms();
}
vege_type[0]=vege_type[1]=vege_price[0]=vege_price[1]
=vege_price[2]=vege_price[3]=vege_price[4]='\0';
if(strlen(sms_deliver.PDUData)<40) //未满
{
display_type=0;
type_screen();
}
else //信息已满
{
write_cmd(0x01); //消除当前显示
put_string(0x90," ");
put_string(0x90,"信息已满!"); //间隔160ms闪烁显示
for(i=0;i<2;i++)
delay_1s();
write_cmd(0x01);
display_type=2;
info_screen();
}
}
}
return;
}
//PAGEDOWN键的响应函数
void key_pageup()
{
char idata page_count , x;
if(display_type==0) //如果是品种界面显示,就响应按键显示相应的界面
{
if(vege_page_index==0)
vege_page_index=9;
else
vege_page_index--;
type_screen();
return;
}
if(display_type==2) //蔬菜信息界面
{
if(info_count>3) //如果信息数大于3条
{
page_count=0;
x=info_count;
while(x>0)
{
page_count++;
x-=3;
}
info_page_index=(info_page_index==0)?(page_count-1):(info_page_index-1) ;
info_screen();
}
return;
}
return;
}
//PAGEDOWN键的响应函数
void key_pagedown()
{
char idata page_count , x;
if(display_type==0) //如果是品种界面显示,就响应按键显示相应的界面
{
if(vege_page_index==9)
vege_page_index=0;
else
vege_page_index++;
type_screen();
return;
}
if(display_type==2) //蔬菜信息界面
{
if(info_count>3)
{
page_count=0;
x=info_count;
while(x>0)
{
page_count++;
x-=3;
}
info_page_index=( (info_page_index==page_count-1)?0:info_page_index+1 ) ;
info_screen();
}
return;
}
}
//发送键的响应函数
void key_send()
{
uchar idata i,j,flag=2; // flag: 0(信息发送成功) 1(发送失败) 2(没有返回值)
if(display_type==0)
{
if(info_count!=0)
{
display_type=2;
info_screen();
return;
}
else
{
put_string(0x9d,"无信息"); //没有存蔬菜信息
delay_160ms();
put_string(0x9d," ");
put_string(0x9d,vege_type);
}
}
else if(display_type==2)
{
write_cmd(0x01);
put_string(0x90," ");
put_string(0x90,"信息发送中...");
memset(RcvBuf,0,sizeof(RcvBuf));
receive_SMS(); //receive SMS,judge the center_phone change
delay();
//如果不成功就再发,最多发三次,再不成功就放弃
for(i=0;i<3;i++)
{
send_response(); //send SMS
delay_1s(); delay_1s(); delay_1s();
for(j=0; j<30;j++)
{
if( RcvBuf[j]=='O'&&RcvBuf[j+1]=='K' ) //返回的"OK"
{ flag=0 ; break; } //0: 发送成功
else if( RcvBuf[j]=='E'&&RcvBuf[j+1]=='R'&&RcvBuf[j+2]=='R'
&&RcvBuf[j+3]=='O'&&RcvBuf[j+4]=='R' ) //返回的"ERROR"
{ flag=1 ; break; } //1: 发送失败
}
if(flag==0) break; //发送成功,跳出循环
}
if( flag==0 )
{
write_cmd(0x01); //清除当前显示
put_string(0x90," ");
put_string(0x90,"发送成功");
delay_1s();
delay_1s();
//清除各全局变量
memset(sms_deliver.PDUData,0,sizeof(sms_deliver.PDUData));
info_count=0;
info_page_index=0;
memset(vege_type,'\0',sizeof(vege_type));
memset(vege_price,'\0',sizeof(vege_price));
}
if( flag==1&&i==3) //第三次发返回的还是ERROR
{
write_cmd(0x01); //清除当前显示
put_string(0x90," ");
put_string(0x90,"失败,没信号");
delay_1s();
delay_1s();
}
display_type=0;
type_screen(); //返回蔬菜品种界面
}
}
//program to process keys when pressed////
void key_int() interrupt 2
{
int idata t; //延时变量;
uchar idata keycode; //键盘码;
uchar idata scancode; //扫描码;
uchar idata flag=0xff; //键是否释放标志;
//延时去抖动
t=4000;
while(t--); //延时10ms;
if(INT1==1)
return; //如果中断引脚为高电平,为抖动,则跳出;
EX1=0; //关闭中断,开始处理键盘;
//扫描被按下的键的位置
scancode=0xef; //给出第一行的键盘扫描码,进行逐行扫描;
while(scancode!=0xff)
{
P1=scancode; //输入扫描码,扫描第一行;
keycode=P1; //数据送到键码,看是否本行有键按下;
if((keycode&0x0f)!=0x0f)
break; //有键按下,退出循环;
else
scancode=(keycode<<1)|0x0f ; //否则,更新扫描码换下一行继续扫描;
} //当扫描码变为0xff时,不满足循环条件则退出循环;
//判断键是否被释放//
P1=0x0f;
while(1)
{
if(INT1==1) //INT1=1时,键释放
{
flag=~flag;
if(flag==0) //键释放标志为零则跳出循环
break;
}
}
//确定键值,转到相应的处理程序//
keycode=~keycode;
switch(keycode)
{
case 0x28:key_num(0);break;
case 0x12:key_num(1);break;
case 0x22:key_num(2);break;
case 0x42:key_num(3);break;
case 0x82:key_num(4);break;
case 0x14:key_num(5);break;
case 0x24:key_num(6);break;
case 0x44:key_num(7);break;
case 0x84:key_num(8);break;
case 0x18:key_num(9);break;
case 0x48:key_dot();break;
case 0x11:key_cancel();break;
case 0x81:key_confirm();break;
case 0x21:key_pageup();break;
case 0x41:key_pagedown();break;
case 0x88:key_send();break;
default:break;
}
EX1=1; //重新打开中断,可以接受新的中断
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////以下程序为与手机模块相关的程序//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void GSM_int(void) interrupt 4
{
EA=0;
delay();
if(RI==1) //data received
{
RI=0;
RcvBuf[RcvIndex]=SBUF;
RcvIndex++;
if(RcvIndex>4)
{
if(SBUF==LF)
{
LFCount++;
if(RcvBuf[RcvIndex-3]=='K' ||RcvBuf[RcvIndex-3]=='R')
{
if(RcvBuf[6]=='L'&&RcvBuf[2]=='+')
{
bListEnd=1;
listchar_count=RcvIndex;
memcpy(ListBuf,RcvBuf,sizeof(RcvBuf));
}
bResponsed=1;
RcvIndex=0;
LFCount=0;
}
}
}
else
if(RcvBuf[RcvIndex-2]==PROMPT)
RcvIndex=0;
}
EA=1;
}
/////////////////////function: send string////////////////////////////////////////
void send_string(char * str)
{
char idata i=0;
uchar idata len=strlen(str);
for(i=0;i<len;i++)
{
SBUF=str[i];
while(!TI){}
TI=0;
}
}
/////////////手机模块初始化函数///////////////////////////////////////////////////////////
char init_GSM()
{
char idata result=0 ,i;
IGT=0;
delay_1s();
delay_1s();
delay_1s();
send_string("AT\r"); //test AT command
delay_1s();
send_string("ATE0\r"); //Enable command echo
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
result=find_OK_ERROR()+result;
send_string("AT+CMGF=0\r"); //Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
result=find_OK_ERROR()+result;
send_string("AT+CNMI=0,0,0,0,1\r");
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
result=find_OK_ERROR()+result;
send_string("AT+CMEE=2\r"); //Report mobile equipment error
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
result=find_OK_ERROR()+result;
send_string("AT+CPMS?\r");
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
result=find_OK_ERROR()+result;
send_string("AT+CREG?\r"); //simply assume registered,refine later
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
result=find_OK_ERROR()+result;
send_string("AT+CFUN=1\r"); //set ME to full function
// send_string("AT+CFUN=1,1\r"); //reset and restart ME to full function
delay_160ms();
put_string(0x80,RcvBuf); ///////for debug
delay_1s(); //////////for debug
send_string("AT+COPS=0\r"); //GSM network operator is to be selected automatically
for(i=0;i<9;i++)
delay_1s();
send_string("AT+COPS?\r"); //read the status to GSM network operator
delay_160ms();
// send_string("AT+CPAS\r"); //Mobile equipment activity status 0:ready 3:incoming call
// delay_160ms(); //for debug
// send_string("AT+WS46=12\r"); //select GSM network
// delay_160ms(); //////////for debug
if(result==0||result==1)
{
put_string(0x80,"success"); /////////for debug
delay_1s(); /////////////for debug
return 0 ;
}
else
{
put_string(0x80,"failed") ; /////////for debug
return 1;
}
}
/////在RcvBuf的前80个字符中寻找第一个出现的字符串是"OK"或者"ERROR"还是都没有////
//////////////如果是OK就返回0,是ERROR就返回1,没找到就返回2///////////////////
char find_OK_ERROR()
{
char i;
for(i=0;i<140;i++)
{
if(RcvBuf[i]==0) return 2;
if(strncmp(RcvBuf+i,"OK",2)==0) return 0;
else if(strncmp(RcvBuf+i,"ERROR",5)==0) return 1;
}
return 3;
}
//////////////function: ///////////////////////////////////////////
void receive_SMS()
{
uint ii;
char cmgl_state=0;
uchar j;
RcvIndex=0;
bResponsed=0;
memset(RcvBuf,0,sizeof(RcvBuf)); //接收前清空接收缓冲区
send_string("AT+CMGL=4\r");
wait_5s();
if(bListEnd) //如果有短信存在,则在GSM中断中会将bListEnd置1
{
for(ii=0;ii<listchar_count;ii++)
{
if(cmgl_state==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -