過程是壹致的。
只有端口定義不同。
#包括
“sim900a.h“
#包括
“usart.h“
#包括
“delay.h“
#包括
“led.h“
#包括
“key.h“
#包括
“lcd.h“
#包括
“dma.h“
#包括
“flash.h“
#包括
“touch.h“
#包括
“malloc.h“
#包括
“string.h“
#包括
“文本。h“
#包括
“usart2.h“
#包括
“ff.h“
//將接收到的AT命令響應數據返回給計算機串口。
//mode:0,USART2_RX_STA未清零;
//
1,清零USART2 _ RX _ STA
空的
sim _ at _ response(u8
模式)
{
if(usart 2 _ RX _ STA & amp;0X8000)
//接收數據壹次。
{
usart 2 _ RX _ BUF【usart 2 _ RX _ STA & amp;0x 7 fff】= 0;//添加終止符
printf(“% s“,usart 2 _ RX _ BUF);
//發送到串行端口
if(模式)usart 2 _ RX _ STA = 0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A
所有測試(撥號測試、短信測試和GPRS測試)共享相同的代碼。
//發送命令後,SIM 900a檢測收到的回復。
//str:預期的響應結果
//返回值:0,未得到預期的響應結果。
//
其他,預期響應結果的位置(str的位置)
u8*
sim 900 a _ check _ cmd(u8
*str)
{
茶
* strx = 0;
if(usart 2 _ RX _ STA & amp;0X8000)
//接收數據壹次。
{
usart 2 _ RX _ BUF【usart 2 _ RX _ STA & amp;0x 7 fff】= 0;//添加終止符
strx = str str((const
char *)usart 2 _ RX _ BUF,(const
char *)str);
}
返回
(u8 *)strx;
}
//向sim900a發送命令。
//cmd:發送命令字符串(不需要回車),當cmd
//ack:預期的響應結果。如果它是空的,則意味著不需要等待響應。
//waittime:等待時間(單位:10ms)
//返回值:0,發送成功(得到預期的響應結果)。
//
1,發送失敗。
u8
sim 900 a _ send _ cmd(u8
*cmd,u8
*確認,u16
等待時間)
{
u8
RES = 0;
usart 2 _ RX _ STA = 0;
if((u32)cmd & lt;=0XFF)
{
while(DMA 1 _ channel 7-》;CNDTR!=0);
//等待信道7傳輸完成。
usart 2-& gt;DR =(u32)cmd;
}否則
U2 _ printf(“% s \ r \ n“,cmd);//發送命令
if(ack & amp;& amp等待時間)
//需要等待回答
{
當(-等待時間)
//等待倒計時
{
delay _ ms(10);
if(usart 2 _ RX _ STA & amp;0x 8000)//收到了預期的響應結果。
{
if(sim 900 a _ check _ cmd(ack))中斷;//獲取有效數據
usart 2 _ RX _ STA = 0;
}
}
if(wait time = = 0)RES = 1;
}
返回
res
}
//將1個字符轉換為16個十六進制數字。
//chr: character,0 ~ 9/a ~ f/a ~ f
//返回值:chr對應的16十六進制值。
u8
sim 900 a _ chr 2 hex(u8
chr)
{
if(chr & gt;=‘0‘和amp& ampchr & lt=‘9‘)返回
chr-“0”;
if(chr & gt;=‘A‘amp;& ampchr & lt=‘F‘)返回
(chr-‘A‘+10);
if(chr & gt;=‘a‘amp;& ampchr & lt=‘f‘)返回
(chr-‘a‘+10);
返回
0;
}
//將1個十六進制數字轉換為字符。
//十六進制:16十進制數,0 ~ 15;
//返回值:字符
u8
sim 900 a _ hex 2chr(u8
十六進制)
{
if(hex & lt;=9)返回
十六進制+“0”;
if(十六進制& gt= 10 & amp;& amphex & lt=15)返回
(十六進制-10+‘A‘);
返回
'0';
}
//unicode
gbk
轉換函數
//src:輸入字符串
//dst: output(如果是uni2gbk,則為gbk內部代碼;如果是gbk2uni,則為unicode字符串)
//mode:0,unicode到gbk的轉換;
//
1,gbk到unicode轉換;
空的
sim 900 a _ unigbk _ exchange(u8
*src,u8
*夏令時,u8
模式)
{
u16
temp
u8
buf【2】;
if(mode )//gbk
2
采用雙字節對字符進行編碼
{
while(* src!=0)
{
if(* src & lt;0X81)
//非中文字符
{
temp =(u 16)ff _ convert((WCHAR)* src,1);
src++;
}否則
//漢字,占2個字節。
{
buf【1】= * src++;
buf【0】= * src++;
temp =(u 16)ff _ convert((WCHAR)*(u 16 *)buf,1);
}
* dst++ = sim 900 a _ hex 2chr((temp & gt;& gt12);0X0F);
* dst++ = sim 900 a _ hex 2chr((temp & gt;& gt8)和0X0F);
* dst++ = sim 900 a _ hex 2chr((temp & gt;& gt4)和0X0F);
* dst++ = sim 900 a _ hex 2chr(temp & amp;0X0F);
}
}否則
//unicode
2
gbk
{
while(* src!=0)
{
buf【1】= sim 900 a _ chr 2 hex(* src++)* 16;
buf【1】+= sim 900 a _ chr 2 hex(* src++);
buf【0】= sim 900 a _ chr 2 hex(* src++)* 16;
buf【0】+= sim 900 a _ chr 2 hex(* src++);
temp =(u 16)ff _ convert((WCHAR)*(u 16 *)buf,0);
if(temp & lt;0x 80){ * dst = temp;dst++;}
其他
{ *(u 16 *)dst = swap 16(temp);dst+= 2;}
}
}
* dst = 0;//添加終止符
}
//鍵盤代碼表
常數
u8*
kbd _ TBL 1【13】= {“1“、“2“、“3“、“4“、“5“、“6“、“7“、“8“、“9“、“*“、“0“、“#、“DEL“};
常數
u8*
kbd _ TB L2【13】= {“1“、“2“、“3“、“4“、“5“、“6“、“7“、“8“、“9“、“,“0“,“#“,“DEL“};
u8**
kbd _ tbl
u8*
kbd _ fn _ TBL【2】;
//加載鍵盤接口(大小為240*140)
//x,y:界面的初始坐標(分辨率為320*240時x必須為0)。
空的
sim 900 a _ load _ keyboard(u 16
x,u16
y、u8
**kbtbl)
{
u16
我;
POINT _ COLOR = RED
kbd _ tbl = kbtbl
LCD _ Fill(x,y,x+240,y+140,白色);
LCD _矩形(x,y,x+240,y+140);
LCD _矩形(x+80,y,x+160,y+140);
LCD _矩形(x,y+28,x+240,y+56);
LCD _矩形(x,y+84,x+240,y+112);
POINT _ COLOR =藍色;
for(I = 0;我& lt15;i++)
{
如果(i & lt13)Show _ Str _ Mid(x+(I % 3)* 80,y+6+28 *(I/3),(u8 *)kbd _ TBL【I】,16,80);
其他
show _ Str _ Mid(x+(I % 3)* 80,y+6+28 *(I/3),kbd _ fn _ TBL【I-13】,16,80);
}
}