📄 debug.c
字号:
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' &amt; &amt; RcvBuf[j + 1] == 'K')
//返回的"OK"
{
flag = 0;
break;
} //0: 发送成功
else if (RcvBuf[j] == 'E' &amt; &amt; RcvBuf[j + 1] == 'R' &amt;
&amt; RcvBuf[j + 2] == 'R' &amt; &amt; RcvBuf[j + 3] == 'O' &amt;
&amt; 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 &amt; &amt; 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 &amt; 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' &amt; &amt; 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)
{
if (ListBuf[ii] == 'L')
{
cmgl_state = 1;
list_index_begin = ii;
}
}
else if (cmgl_state == 1)
{
if (ListBuf[ii] == LF)
{
delay();
list_index_end = strpos(ListBuf + list_index_begin, ',');
list_index_end = list_index_begin + list_index_end;
memcpy(list_indexlist + listcmdindex, ListBuf + list_index_begin + 2,
list_index_end - list_index_begin - 2);
listcmdindex += list_index_end - list_index_begin - 1;
list_indexlist[listcmdindex - 1] = 0;
listcmd_count++; //短信条数
list_PDU_begin = ii + 1; //pdu的起始地址即LF后一字节
if (ListBuf[list_index_end + 1] == '0')
//判断短信是否为已读状态
cmgl_state = 2;
else
cmgl_state = 0;
}
}
else if (cmgl_state == 2)
//处理未读的短信
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -