📄 main.c
字号:
//ICC-AVR application builder : 2007-11-21
// Target : M16
// Crystal: 8.0000Mhz
/****************** SMG12232ZK串行接口程序******************
* Title : Accessing to LCD-CONTROLLER
* Date : 2007.10.18
* Support telephone:
* Support fax :
* Create by :
* DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER
*******************************************************************/
#include <iom16v.h> //ATMEGA48头文件
#include <macros.h> //宏定义
//#include <math.h>
#include "define.h" //端口定义
#include "initrialm16.h"//初始化mcu
#include "delay.h" //延时程序
#include "smg12232zk.h" //122*32点阵屏驱动程序
void Get_Key(void);
void Get_GPRMC_data(void);//提取GPRMC数据
long Get_Area(long x1,long y1,long x2,long y2);
Byte const COS_TAB[90]=
{
100,100,100,100,100,99, 99, 99, 99, 98,
98, 98, 97, 97, 97, 96, 96, 95, 95, 94,
93, 93, 92, 91, 91, 90, 89, 88, 87, 87,
86, 85, 84, 83, 82, 81, 80, 79, 78, 77,
75, 74, 73, 72, 71, 69, 68, 67, 66, 64,
63, 62, 60, 59, 57, 56, 55, 53, 52, 50,
49, 47, 45, 44, 42, 41, 39, 38, 36, 34,
33, 31, 29, 28, 26, 24, 23, 21, 19, 17,
16, 14, 12, 11, 9, 7, 5, 4, 2, 0
};
void main(void)
{
Word i;
Init_Devices();
Lcd_Reset();
while(1)
{
Get_Key();
if(key != 0)
{
switch(key)
{
case 1: flag_area = 1;break;//开始测量
case 2: flag_area = 2;break;
default:break;
}
key_dis = key;
key = 0;
}
if(flag_area == 0)
{
Hzk_Dis_Data(1,1,latitude,9);
Hzk_Dis_Data(2,1,longitude,9);
}
if(flag_area == 1)
{
x0_longitude = longitude;//保存0点的坐标
y0_latitude = latitude;
x1_post = 0;
y1_post = 0;
area = 0;
flag_area = 3;//测量开始
}
if(flag_area == 3)
{
//计算本次的相对坐标
xishu = PI2RDIV360*COS_TAB[latitude/1000000-1]/100000;
x2_post = (longitude - x0_longitude)*xishu;
y2_post = (latitude - y0_latitude)*111;
area += Get_Area(x1_post,y1_post,x2_post,y2_post);
//计算完成本次坐标次数前移
x1_post = x2_post;
y1_post = y2_post;
x_dis = x1_post;//显示偏移坐标
y_dis = y1_post;
if(x_dis < 0)
{
x_dis = ~(x_dis-1);
}
if(y_dis < 0)
{
y_dis = ~(y_dis-1);
}
//Hzk_Dis_Clr();
Hzk_Dis_Data(1,1,x_dis/10,9);//显示相对坐标*0.01米
Hzk_Dis_Data(2,1,y_dis/10,9);
}
if(flag_area == 2)
{
x2_post = (longitude - x0_longitude)*11;
y2_post = (latitude - y0_latitude)*11;
area += Get_Area(x2_post,y2_post,x0_post,y0_post);
if(area < 0)
{
area = ~(area - 1);
}
Hzk_Dis_Clr();
Hzk_Dis_Data(2,1,area/10000,9);
while(1);
//flag_area = 0;
}
if((flag_area == 0)||(flag_area == 1)||(flag_area == 2)||(flag_area == 3))
{
Hzk_Dis_Data(1,7,key_dis,2);
Hzk_Dis_Data(2,7,flag_area,2);
}
/*
if(usart_flag & BIT(SINK0_FINISH))
{
Get_GPRMC_data();
usart_flag &=~ BIT(SINK0_FINISH);
}
*/
}
}
void Get_Key(void)
{
if( (KEY_PIN & BIT(KEY_START)) == 0)
{
Delay_Ms(20);
while((KEY_PIN & BIT(KEY_START)) == 0)
;
key = 1;
}
if( (KEY_PIN & BIT(KEY_FINISH)) == 0)
{
Delay_Ms(20);
while((KEY_PIN & BIT(KEY_FINISH)) == 0)
;
key = 2;
}
}
void Get_GPRMC_data(void)//提取GPRMC数据
{
unsigned char n=0,m=0,f=0;
if((sink0_buf[1] == 'G')
&&(sink0_buf[2] == 'P')
&&(sink0_buf[3] == 'R')
&&(sink0_buf[4] == 'M')
&&(sink0_buf[5] == 'C'))//GPRMC
{
LED_PORT ^= BIT(LED);
for(n=0;n<100;n++)
{
if(sink0_buf[n] == ',')
{
m ++;//m表示低级个","
if(m == 1)//第一个","后面为时间数据
{
//Hzk_Dis_Char(1,1,&sink0_buf[n+1],9);
}
if(m == 2)//第二个","后面为定位信息状态
{
gps_status = sink0_buf[n+1];
//Hzk_Dis_Char(1,6,&gps_status,1);
}
if(m == 3)//第三个","后面为纬度数据
{
if(gps_status == 'A')
{
//Hzk_Dis_Char(1,1,&sink0_buf[n+1],11);
latitude = (unsigned long)(sink0_buf[n+1]-0x30)*10000000
+(unsigned long)(sink0_buf[n+2]-0x30)*1000000
+
((unsigned long)(sink0_buf[n+3]-0x30)*1000000//minuter
+(unsigned long)(sink0_buf[n+4]-0x30)*100000
+(unsigned long)(sink0_buf[n+6]-0x30)*10000
+(unsigned long)(sink0_buf[n+7]-0x30)*1000
+(unsigned long)(sink0_buf[n+8]-0x30)*100
+(unsigned long)(sink0_buf[n+9]-0x30)*10
+(unsigned long)(sink0_buf[n+10]-0x30))*10/60;//换算成度
//Hzk_Dis_Data(2,1,latitude,10);
}
}
if(m == 4)
{
//"N"
}
if(m == 5)//第五个","后面为精度数据
{
if(gps_status == 'A')
{
longitude = //(unsigned long)(sink0_buf[n+1]-0x30)*100000000
+(unsigned long)(sink0_buf[n+2]-0x30)*10000000
+(unsigned long)(sink0_buf[n+3]-0x30)*1000000
+
((unsigned long)(sink0_buf[n+4]-0x30)*1000000//minuter
+(unsigned long)(sink0_buf[n+5]-0x30)*100000
+(unsigned long)(sink0_buf[n+7]-0x30)*10000
+(unsigned long)(sink0_buf[n+8]-0x30)*1000
+(unsigned long)(sink0_buf[n+9]-0x30)*100
+(unsigned long)(sink0_buf[n+10]-0x30)*10
+(unsigned long)(sink0_buf[n+11]-0x30))*10/60;//换算成度*0.000001
//Hzk_Dis_Data(1,1,longitude,10);
}
}
if(m == 6)
{
//"E"
}
if(m == 9)//第九个","后面为精度数据
{
gps_date = (sink0_buf[n+1]-0x30)*10
+(sink0_buf[n+2]-0x30);
gps_month = (sink0_buf[n+3]-0x30)*10
+(sink0_buf[n+4]-0x30);
gps_year = (sink0_buf[n+5]-0x30)*10
+(sink0_buf[n+6]-0x30);
}
}
}
}
}
long Get_Area(long x1,long y1,long x2,long y2)
{
long area_temp;
area_temp = (x2-x1)*(y2+y1)/2;
return area_temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -