int main(void) { Sys_Init(); //系统初始化 DS18B20_Link(); //连接DS18B20模块 SIM900A_Link(); //连接GSM模块 if(sim900a_send_cmd("AT+CMGF=1","OK",200)) return 1; //设置文本模式 if(sim900a_send_cmd("AT+CSCS=\"UCS2\"","OK",200)) return 2; //设置TE字符集为UCS2(2字节的UNICODE编码。还有UCS4,也就是4字节的UNICODE编码) if(sim900a_send_cmd("AT+CSMP=17,0,2,25","OK",200)) return 3; //设置短消息文本模式参数 sim900a_data_ui(40,30); //GSM信息界面UI LCD_Clear(BLUE); //清屏 while(1) { Show_Str_Mid(0,20,"基于GSM的实时温度查询系统",16,240); sim900a_sms_read(); LED0=!LED0; //1.5s闪烁 delay_ms(1500); LCD_Fill(0,100,239,224,BLUE); } }
//在指定位置显示指定颜色的按钮 //(x,y):按钮起始坐标 //xlen,ylen:x,y方向的长度 //str:按钮上要显示的字符 //color:字符颜色 void GUI_Draw_Button(u16 x,u16 y,u16 xlen,u16 ylen,u8 *str,u16 color) { u16 tback_color,tpoint_color; //////////////////画按钮部分////////////////////// LCD_Fill(x,y,x+xlen,y+ylen,LGRAY);//画实体 GUI_DrawLine(x,y,xlen,0,WHITE); //上外边框 GUI_DrawLine(x,y,0,ylen,WHITE); //左外边框 GUI_DrawLine(x+1,y+1,xlen-1,0,0XB5B6);//上内边框 GUI_DrawLine(x+1,y+1,0,ylen-1,0XB5B6);//左内边框 GUI_DrawLine(x,y+ylen,xlen,0,0X8431); //下外边框 GUI_DrawLine(x+xlen,y,0,ylen,0X8431); //右外边框 GUI_DrawLine(x+1,y+ylen-1,xlen-2,0,0XA535);//下内边框 GUI_DrawLine(x+xlen-1,y,0,ylen-1,0XA535); //右内边框 //////////////////显示按钮上面的信息/////////////// if(ylen<16)return;//不够画 tback_color=BACK_COLOR; tpoint_color=POINT_COLOR; BACK_COLOR=LGRAY; POINT_COLOR=color; Show_Str_Mid(x,y+(ylen-16)/2,str,16,xlen);//只对16字体 BACK_COLOR=tback_color; //恢复之前的颜色 POINT_COLOR=tpoint_color; }
//////////////////////////////与文件浏览相关的函数////////////////////////////// //功能选择调度函数 //list :功能条目指针 //title :标题 //func :选择/确定/。。。 //len :功能条目的个数(1~8) //sel :开始选中的条目(0~7) //返回值:0~7,选中的条目;8,没有选择任何条目。 u8 Load_Fun_Sel(const u8 * *list,const u8 *title,u8 *func,u8 len,u8 sel) { u8 t,key; Load_Gui_Bro(func); //显示标题 POINT_COLOR=WHITE; Show_Str_Mid(0,2,(u8*)title,16,240); //叠加模式,非自动换行 POINT_COLOR=DARKBLUE; Show_Str(0,23,"请选择:",16,0x01); //叠加模式,非自动换行 //加载条目信息 for(t=0;t<len;t++) { if(t==sel) { LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,LBBLUE );//对选中的条目,填充棕色 POINT_COLOR=WHITE; }else POINT_COLOR=DARKBLUE; Show_Str(0,50+t*32,(u8*)list[t],16,0x01); //叠加模式,非自动换行 } key=0; Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 while(1)//等待按键 { key=AI_Read_TP(30); if(key)Pen_Point.Key_Reg|=0X80;//标记按键已经按下了 if(key==0&&(Pen_Point.Key_Reg&0X80))//按键松开了 { Pen_Point.Key_Reg=0; key=Touch_To_Num(2); if(key)//有按键按下 { switch(key) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9://确认键按下 key-=1; if(sel!=key&&key<len)//选中一个 { POINT_COLOR=DARKBLUE;//画笔颜色选择 LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,WHITE);//清空上次选择的 Show_Str(0,50+sel*32,(u8*)list[sel],16,0x01);//重新显示上次的名字 sel=key;//选择这次选择的 LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,LBBLUE);//填充底色 POINT_COLOR=WHITE;//画笔颜色选择 Show_Str(0,50+sel*32,(u8*)list[sel],16,0x01);//显示名字 }else if(sel==key||key==8)//选择按钮,或者双击 { return sel;//返回选择的条目号 } break; case 10:return 8;//选择了"返回"按钮,返回一个不可能值 } key=0;//取消按键值 } } delay_ms(1); } }
//ATK-RM04 串口以太网测试 //用于测试TCP/UDP连接 //返回值:0,正常 // 其他,错误代码 u8 atk_rm04_cometh_test(void) { u8 netpro=0; //网络模式 u8 key; u8 timex=0; u8 ipbuf[16]; //IP缓存 u8 *p; u16 t=999; //加速第一次获取链接状态 u8 res=0; u16 rlen=0; u8 constate=0; //连接状态 p=mymalloc(SRAMIN,32); //申请32字节内存 atk_rm04_send_cmd("at+netmode=1","ok",500); //设置串口以太网模式 atk_rm04_send_cmd("at+dhcpd=0","ok",500); //DHCP服务器关闭(仅AP模式有效) atk_rm04_send_cmd("at+dhcpc=1","ok",500); //DHCP客户端使能(net_ip无效) PRESTA: netpro=atk_rm04_netpro_sel(50,30,(u8*)ATK_RM04_NETMODE_TBL[1]); //选择网络模式 if(netpro&0X02)atk_rm04_send_cmd("at+remotepro=udp","ok",500); //UDP协议 else atk_rm04_send_cmd("at+remotepro=tcp","ok",500); //TCP协议 sprintf((char*)p,"at+remoteport=%s",portnum); atk_rm04_send_cmd(p,"ok",500); //设置 端口号. if(netpro&0X01) //客户端 { if(atk_rm04_ip_set("ETH-COM 远端IP设置",(u8*)ATK_RM04_WORKMODE_TBL[netpro],(u8*)portnum,ipbuf))goto PRESTA; //IP输入 sprintf((char*)p,"at+remoteip=%s",ipbuf); atk_rm04_send_cmd(p,"ok",500); //设置远端(连接)IP地址. atk_rm04_send_cmd("at+mode=client","ok",500); //设置为客户端 }else atk_rm04_send_cmd("at+mode=server","ok",500); //设置为服务端 LCD_Clear(WHITE); POINT_COLOR=RED; Show_Str_Mid(0,30,"ATK-RM04 ETH-COM 测试",16,240); Show_Str(30,50,200,16,"正在配置ATK-RM04模块,请稍等...",12,0); if(atk_rm04_send_cmd("at+net_commit=1","\r\n",4000))//提交网络配置,最长可能需要等待40s { LCD_Fill(30,50,239,50+12,WHITE); //清除之前的显示 Show_Str(30,50,200,16,"配置ATK-RM04模块失败!",12,0); delay_ms(800); res=1; }else { atk_rm04_send_cmd("at+reconn=1","ok",500); //重启串口转换服务 LCD_Fill(30,50,239,50+12,WHITE);//清除之前的显示 Show_Str(30,50,200,16,"配置ATK-RM04模块成功!",12,0); delay_ms(600); Show_Str(30,50,210,16,"KEY_UP:退出测试 KEY0:发送数据",12,0); atk_rm04_quit_trans(); //退出透传 while(1) //等待ATK-RM04连接上路由器 { atk_rm04_get_wanip(p); //获取WAN IP if(p[0]!=0)break; //成功获取到了IP地址 Show_Str(30,80,200,12,"ATK-RM04 连接路由器失败",12,0); //连接失败 delay_ms(800); Show_Str(30,80,200,12,"ATK-RM04 等待连接中....",12,0); delay_ms(800); } LCD_Fill(30,80,239,80+12,WHITE); if((netpro&0X01)==0)atk_rm04_get_wanip(ipbuf);//服务器模式,获取WAN IP sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum); Show_Str(30,65,200,12,p,12,0); //显示IP地址和端口 Show_Str(30,80,200,12,"状态:",12,0); //连接状态 Show_Str(120,80,200,12,"模式:",12,0); //连接状态 Show_Str(30,100,200,12,"发送数据:",12,0); //发送数据 Show_Str(30,115,200,12,"接收数据:",12,0); //接收数据 POINT_COLOR=BLUE; Show_Str(120+30,80,200,12,(u8*)ATK_RM04_WORKMODE_TBL[netpro],12,0); //连接状态 USART3_RX_STA=0; while(1) { key=KEY_Scan(0); if(key==WKUP_PRES) //KEY_UP 退出测试 { res=0; break; }else if(key==KEY0_PRES) //KEY0 发送数据 { sprintf((char*)p,"ATK-RM04 %s测试%02d\r\n",ATK_RM04_WORKMODE_TBL[netpro],t/10);//测试数据 Show_Str(30+54,100,200,12,p,12,0); u3_printf("%s",p); //发送该数据到ATK-RM04模块 timex=100; } if(timex)timex--; if(timex==1)LCD_Fill(30+54,100,239,112,WHITE); t++; delay_ms(10); if(USART3_RX_STA&0X8000) //接收到一次数据了 { rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度 USART3_RX_BUF[rlen]=0; //添加结束符 printf("%s",USART3_RX_BUF); //发送到串口 sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数 LCD_Fill(30+54,115,239,130,WHITE); POINT_COLOR=BRED; Show_Str(30+54,115,156,12,p,12,0); //显示接收到的数据长度 POINT_COLOR=BLUE; LCD_Fill(30,130,239,319,WHITE); Show_Str(30,130,180,190,USART3_RX_BUF,12,0);//显示接收到的数据 USART3_RX_STA=0; if(constate==0)t=1000; //状态为还未连接,立即更新连接状态 else t=0; //状态为已经连接了,10秒后再检查 } if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在. { constate=atk_rm04_consta_check()-'0';//得到连接状态 if(constate)Show_Str(30+30,80,200,12,"连接成功",12,0); //连接状态 else Show_Str(30+30,80,200,12,"连接失败",12,0); t=0; } if((t%20)==0)LED0=!LED0; atk_rm04_at_response(1); } } myfree(SRAMIN,p); //释放内存 atk_rm04_quit_trans(); //退出透传 return res; }