您的位置 首页 厂商

ARM7学习—GPS操练

下午抽了点时间在调试ARM7,想把上次用ATMEGA8做的GPS移植到ARM7上去,下午移植了LCD和串口,但是还没把串口中断程序编写好。按键也还没移…

下午抽了点时刻在调试ARM7,想把前次用ATMEGA8做的GPS移植到ARM7上去,下午移植了LCD和串口,可是还没把串口中止程序编写好。按键也还没移植,其他OK了,再花点时刻就能够完整了。我想GPS和GSM结合起来,这样能够做个比较有用的东西。自己玩玩很不错!哈哈!再接再厉持续尽力……

/**************ARM7(LPC2103)操练程序**************************/
/*************************************************************/
/*****File Function : lcd10265液晶显现程序 *****/
/*****Program Author : ZhengWen(ClimberWin) *****/
/*****MCU : LPC2103F 外部11.0592M晶振 *****/
/*****Compile Date : 2010/01/13 *****/
/*****Edition Info : V1.0 *****/
/*************************************************************/
//编译环境 KEIL for ARM
//修正时刻2010年2月9日,能够串口输出数据,接纳数据,而且LCD上显现
/*************************************************************/
//修正时刻2010年2月10日
//修正内容:一向串口和LCD显现不能一起用,后来发现是设置好PLL后因为时序太快,导致液晶不能显现
// 调整好时序后液晶能够正常显现。
//LCD GUI移植成功,还需要移植按键
//#include
//#include
#include “RCU6093.h”
#include “win_delay.h”
#include “GPS_GH_80.h”
#define uchar unsigned char
#define uint unsigned int
#define baudrate 9600 //设置波特率
#define PE (U0LSR&0x40)//界说串口数据发送繁忙与否,PE=1繁忙;PE=0;不忙绿

#define Fosc(11059200)//晶振频率,10MHz~25MHz,应当与实践一至
#define Fcclk(Fosc * 6) //66.3552 体系频率,有必要为Fosc的整数倍(1~32),且<=60MHZ
#define Fcco(Fcclk * 4) //CCO频率,有必要为Fcclk的2、4、8、16倍,规模为156MHz~320MHz
#define Fpclk(Fcclk / 4) * 1 //016.5888,VPB时钟频率,只能为(Fcclk / 4)的1 ~ 4倍

//常量界说
uchar lcd_y_num=0;//液晶显现Y轴坐标
uchar temp_h;
uchar temp_l;
uchar stop=0;

uchar UART_MID;//界说一个缓存区数据暂时存储地址

uchar numh=0;
uchar numl=0;

uchar flag=0;
uchar temp1;

uchar data_num0=1;
uchar data_num1=1;

uchar key1_flag; //界说按键标志位
uchar key2_flag;
uchar key3_flag;
uchar gps_flag;//界说是否有GPS数据

//////////////////////////////////////////////////////////////
void LCD_PORT_INI(void);
void LCD_write_LCD(unsigned char data,unsigned char cmd);
void LCD_RCU6093_Clear(void);
void LCD_RCU6093_tset(void);
void LCD_RCU6093_int(void);

void init_USART(void);//USART 初始化
void write_asicc(uchar assi);
void LCD_xy(uchar x,uchar y);
void write_hanzi(uchar hz);
void write_hanzi16(uchar hz,uchar x,uchar y,uchar mirror);
void PLL_Init(void);

void UART0_INT(void); //串口初始化
void UART0_SendByte(unsigned char data); //串口发送字节
void UART0_SendStr(unsigned char const *str);//串口发送字符串

void keytest(void); //按键测验程序

void Charge(void);//电池充电子程序
void Signal_strength(void);//信号强度指示程序
void banbenxinxi(void);//显现版别信息
void GPS_display(void);
/**********************************************/

void keytest(void) //按键测验程序
{

}
////////////充电状况////////////////////

void Charge(void)
{
uchar i;
LCD_xy(94,1);//LCD指针坐标
write_hanzi(19);//
for(i=0;i<6;i++)
{ LCD_xy(94,0);//LCD指针坐标
write_hanzi(13+i);//
delayms(60000);
delayms(60000);
delayms(60000);
}
}

///////////信号强度状况//////////////////
void Signal_strength(void)
{
uchar i;
LCD_xy(0,1);//LCD指针坐标
write_hanzi(20);//
for(i=0;i<4;i++)
{ LCD_xy(0,0);//LCD指针坐标
write_hanzi(21+i);//
delayms(60000);
delayms(60000);
delayms(60000);
}
}

///////////////////////////////
/////////////////////////////////
void banbenxinxi(void)
{
LCD_RCU6093_int(); //初始化液晶

LCD_xy(0,2);//LCD指针坐标

write_asicc(G);
write_asicc(P);
write_asicc(S);
write_asicc(0);
write_asicc(V);
write_asicc(1);
write_asicc(.);
write_asicc(2);

LCD_xy(0,3);//LCD指针坐标
write_asicc(C);
write_asicc(P);
write_asicc(U);
write_asicc(:);

write_asicc(A);
write_asicc(R);
write_asicc(M);
write_asicc(7);
write_asicc(T);
write_asicc(D);
write_asicc(M);
write_asicc(I);

LCD_xy(0,4);//LCD指针坐标
write_asicc(B);
write_asicc(Y);
write_asicc(0);
write_asicc(C);
write_asicc(L);
write_asicc(I);
write_asicc(M);
write_asicc(B);
write_asicc(E);
write_asicc(R);
write_asicc(W);
write_asicc(I);
write_asicc(N);
LCD_xy(0,5);//LCD指针坐标
write_asicc(2);
write_asicc(0);
write_asicc(1);
write_asicc(0);
write_hanzi(4);//年
write_asicc(0);
write_asicc(2);
write_hanzi(5);//月
write_asicc(1);
write_asicc(0);
write_hanzi(6);//日

LCD_xy(72,7);//LCD指针坐标
write_asicc(B);
write_asicc(A);
write_asicc(C);
write_asicc(K);
//////////显现手持式导航仪/////////////////
write_hanzi16(4,4,0,0);
write_hanzi16(5,1*16+4,0,0);
write_hanzi16(6,2*16+4,0,0);
write_hanzi16(7,3*16+4,0,0);
write_hanzi16(8,4*16+4,0,0);
write_hanzi16(9,5*16+4,0,0);

}

void PLL_Init(void)
{
/* 设置体系各部分时钟 */
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) – 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) – 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) – 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) – 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}

/***********串口0初始化**********************/
void UART0_INT(void)
{ unsigned int U0DL;

U0LCR = 0x83; // DLAB = 1,可设置波特率;无奇偶校验 1位中止位 8位数据长度。
U0DL = (Fpclk/16)/baudrate;
U0DLM= U0DL/256; //高8位
U0DLL = U0DL%256; //低8位
U0LCR = 0x03; // DLAB = 0,设置好波特率;无奇偶校验 1位中止位 8位数据长度。
}
/***********串口发送字节**********************/
void UART0_SendByte(unsigned char data)
{
U0THR = data; //发送数据
while( PE==0 ); //等候数据发送结束 PE=1繁忙;PE=0;不忙绿

}
/***********串口发送字符串**********************/
void UART0_SendStr(unsigned char const *str)
{ while(1)
{ if( *str == \0 ) break;
UART0_SendByte(*str++); //发送数据
}
}
/*************串口接纳字符*************************/

unsigned char UART0_GetChar(void)
{

while (!(U0LSR & 0x01));
return (U0RBR);

}

void __irq UART0_IRQ (void)
{

}

//////////////////////////////////////////////////////////////
void LCD_PORT_INI(void)
{
IO0DIR|=0x0000ff00; //装备P0.8-P1.5为输出

}
//////////////////////////////////////////////////////////////
void LCD_write_LCD(unsigned char data,unsigned char cmd)
{
unsigned char i=0;

LCD_CS_L();

if(cmd)LCD_A0_H();
else LCD_A0_L();
for (i=0;i<8;i++)
{
LCD_SCL_L();
if (data&0X80) LCD_SD_H(); else LCD_SD_L();
data<<=1; LCD_SCL_H(); } LCD_CS_H();
//delayms(1);
}
////////////////////////////////////////////////////////////
void LCD_RCU6093_Clear(void)
{
unsigned int i=0;

for ( i = 0 ; i < 918 ; i++ )
{
LCD_write_LCD(0x00,1);

}

}
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
void LCD_RCU6093_int(void)
{
LCD_PORT_INI();
LCD_RST_L();
LCD_CS_H();
LCD_A0_H();
LCD_SCL_H();
LCD_SD_H();
delayms(1);
LCD_RST_H();
LCD_write_LCD(0x21,0);//写Extend 指令 (H=1)
LCD_write_LCD(0xb0,0); //对比度调理
LCD_write_LCD(0x14,0);//LCD Duty设置
LCD_write_LCD(0x20,0);//写Basic 指令(H=0)
LCD_write_LCD(0x0c,0);//画面显现形式 0x08全白 0x09全黑 0x0c正常形式 0x0d回转显现形式
LCD_RCU6093_Clear();

}

///////////////////写asicc码//////////////////////////////////
void write_asicc(uchar assi)
{
uchar i;
for(i=0;i<8;i++)
{LCD_write_LCD( asicc[assi][i],1);}
//{LCD_write_LCD(32+i,1);}
}
///////////////////写8*8简略汉字//////////////////////////////////
void write_hanzi(uchar hz)
{
uchar i;
for(i=0;i<8;i++)
{LCD_write_LCD( hanzi1[hz][i],1);}
}
///////////////////写16*16简略汉字//////////////////////////////////
void write_hanzi16(uchar hz,uchar x,uchar y,uchar mirror)
{
uchar i;
LCD_write_LCD(0x80+x,0);//X轴地址
LCD_write_LCD(0x40+y,0);//Y轴地址
for(i=0;i<8;i++)
if(mirror==0)
{LCD_write_LCD(hanzi16[4*hz][i],1);}
else
{LCD_write_LCD(~hanzi16[4*hz][i],1);}
for(i=0;i<8;i++)
if(mirror==0)
{LCD_write_LCD(hanzi16[4*hz+1][i],1);}
else
{LCD_write_LCD(~hanzi16[4*hz+1][i],1);}

LCD_write_LCD(0x80+x,0);//X轴地址
LCD_write_LCD(0x40+y+1,0);//Y轴地址
for(i=0;i<8;i++)
if(mirror==0)
{LCD_write_LCD(hanzi16[4*hz+2][i],1);}
else
{LCD_write_LCD(~hanzi16[4*hz+2][i],1);}
for(i=0;i<8;i++)
if(mirror==0)
{LCD_write_LCD(hanzi16[4*hz+3][i],1);}
else
{LCD_write_LCD(~hanzi16[4*hz+3][i],1);}
}
//////////////LCD指针坐标//////////////////////
void LCD_xy(uchar x,uchar y)
{
LCD_write_LCD(0x80+x,0);//X轴地址
LCD_write_LCD(0x40+y,0);//Y轴地址
}

//////////////////////////////////////////////////////////////

void GPS_display(void)
{
unsigned char i,j,n,m;
unsigned char hh,hl,mh,ml,sh,sl;
unsigned char temp_time;

LCD_xy(16,0);//LCD指针坐标

write_hanzi(7); //小
write_hanzi(8);//文
write_hanzi(0); //电
write_hanzi(11);//子

write_asicc(0);//空白
write_asicc(G);
write_asicc(P);
write_asicc(S);

if(flag==2 && data_num1==10 && E1_temp[10]==0xea)
{

//cli();
data_num0=1;
data_num1=1;
LCD_xy(0,1);//LCD指针坐标
write_asicc(2);
write_asicc(0);
GPS_date_time();//获取GPS时刻
if((GPS_date_year/10)==0 && (GPS_date_year%10)==4)
{
write_asicc(GPS_date_year/10+0x30);
write_asicc(GPS_date_year%10+0x30+5);
}
else
{
write_asicc(GPS_date_year/10+0x30);
write_asicc(GPS_date_year%10+0x30);
}
write_hanzi(4);//年

write_asicc(GPS_date_month/10+0x30);
write_asicc(GPS_date_month%10+0x30);
write_hanzi(5);//月

write_asicc(GPS_date_day/10+0x30);
write_asicc(GPS_date_day%10+0x30);
write_hanzi(6);//日

LCD_xy(0,2);//LCD指针坐标
write_hanzi(2);//时
write_hanzi(3);//间
write_asicc(:);

write_asicc((GPS_time_hour+8)/10+0x30);
write_asicc((GPS_time_hour+8)%10+0x30);
write_asicc(:);

write_asicc(GPS_time_minute/10+0x30);
write_asicc(GPS_time_minute%10+0x30);
write_asicc(:);

write_asicc(GPS_time_second/10+0x30);
write_asicc(GPS_time_second%10+0x30);

///////////////////////////////////////////////
//////////卫星数量///////////
LCD_xy(0,7);//LCD指针坐标
write_asicc(S);
write_asicc(A);
write_asicc(T);
write_asicc(E);
write_asicc(L);
write_asicc(L);
write_asicc(I);
write_asicc(T);
write_asicc(E);
write_asicc(:);

if(E0_temp[21]>=0 && E0_temp[21]<=12){write_asicc(E0_temp[21]/10+0x30);write_asicc(E0_temp[21]%10+0x30); }
//////////////////////////////
////////海拔//////////////
LCD_xy(0,6);//LCD指针坐标

write_asicc(H);
write_asicc(I);
write_asicc(G);
write_asicc(H);
write_asicc(:);

Altitude_change();

// write_asicc(GPS_E0_temp[12]/10+0x30); //高3位不显现
// write_asicc(GPS_E0_temp[12]%10+0x30);
// write_asicc(GPS_E0_temp[13]/10+0x30);
if(GPS_Altitude<9000)
{
write_asicc( GPS_Altitude/1000+0x30);
write_asicc((GPS_Altitude%1000)/100+0x30);
write_asicc(((GPS_Altitude%1000)%100/10)+0x30);
write_asicc(.);
write_asicc(((GPS_Altitude%1000)%100%10)/10+0x30);
write_asicc(M);
flag=0;
}
else
{;}
//////////////////速度///////////////////

LCD_xy(1,5);//LCD指针坐标
write_asicc(S);
write_asicc(P);
write_asicc(E);
write_asicc(E);
write_asicc(D);
write_asicc(:);
Speed_change();
if(GPS_speed<9000)
{
write_asicc( GPS_speed/1000+0x30);
write_asicc((GPS_speed%1000)/100+0x30);
write_asicc(((GPS_speed%1000)%100/10)+0x30);
write_asicc(.);
write_asicc(((GPS_speed%1000)%100%10)/10+0x30);

}
else
{
write_asicc(0);
}

////////////////////经纬度///////////////////////////
LCD_xy(0,3);//LCD指针坐标
Coordinates_change(1);
write_asicc(N);

//////////////2009.12.29修正/////
if(GPS_degree!=34 && GPS_minute!=44)
{
/////////////////////////////////
if(GPS_degree>100){write_asicc(GPS_degree/100+0x30);write_asicc((GPS_degree%100)/10+0x30);write_asicc((GPS_degree%100)%10+0x30); write_asicc(23);}
if(GPS_degree<100){write_asicc(GPS_degree/10+0x30);write_asicc(GPS_degree%10+0x30);write_asicc(23);}
if(GPS_minute>100){write_asicc(GPS_minute/100+0x30);write_asicc((GPS_minute%100)/10+0x30);write_asicc((GPS_minute%100)%10+0x30); write_asicc(27);}
if(GPS_minute<100){write_asicc(GPS_minute/10+0x30);write_asicc(GPS_minute%10+0x30);write_asicc(27);}

if(GPS_second>100){write_asicc(GPS_second/100+0x30);write_asicc((GPS_second%100)/10+0x30);write_asicc((GPS_second%100)%10+0x30);}
if(GPS_second<100){write_asicc(GPS_second/10+0x30);write_asicc(GPS_second%10+0x30);}
if(GPS_last>100){write_asicc(GPS_last/100+0x30);write_asicc((GPS_last%100)/10+0x30);write_asicc((GPS_last%100)%10+0x30);}
if(GPS_last<100){write_asicc(GPS_last/10+0x30);write_asicc(GPS_last%10+0x30);}
}
else
{
write_asicc(0);write_asicc(0);write_asicc(23);write_asicc(0);write_asicc(0);write_asicc(27);write_asicc(0);write_asicc(0);write_asicc(0);write_asicc(0);write_asicc(0);
}

Coordinates_change(2);
LCD_xy(0,4);//LCD指针坐标
write_asicc(E);
if(GPS_degree!=135 && GPS_minute!=21)
{
if(GPS_degree>100){write_asicc(GPS_degree/100+0x30);write_asicc((GPS_degree%100)/10+0x30);write_asicc((GPS_degree%100)%10+0x30); write_asicc(23);}
if(GPS_degree<100){write_asicc(GPS_degree/10+0x30);write_asicc(GPS_degree%10+0x30);write_asicc(23);}
if(GPS_minute>100){write_asicc(GPS_minute/100+0x30);write_asicc((GPS_minute%100)/10+0x30);write_asicc((GPS_minute%100)%10+0x30); write_asicc(27);}
if(GPS_minute<100){write_asicc(GPS_minute/10+0x30);write_asicc(GPS_minute%10+0x30);write_asicc(27);}

if(GPS_second>100){write_asicc(GPS_second/100+0x30);write_asicc((GPS_second%100)/10+0x30);write_asicc((GPS_second%100)%10+0x30);}
if(GPS_second<100){write_asicc(GPS_second/10+0x30);write_asicc(GPS_second%10+0x30);}
if(GPS_last>100){write_asicc(GPS_last/100+0x30);write_asicc((GPS_last%100)/10+0x30);write_asicc((GPS_last%100)%10+0x30);}
if(GPS_last<100){write_asicc(GPS_last/10+0x30);write_asicc(GPS_last%10+0x30);}
}
else
{
write_asicc(0);write_asicc(0);write_asicc(23);write_asicc(0);write_asicc(0);write_asicc(27);write_asicc(0);write_asicc(0);write_asicc(0);write_asicc(0);write_asicc(0);
}

flag=0;
// sei();

}
else
{;}
}
////////////主程序/////////////////////
int main(void)
{
unsigned char i,j,n,m;

uchar uart_temp;
uchar mode_flag;//形式标志位,用来切换界面

uchar tubiao1,tubiao2,tubiao3,tubiao4;//界说首界面图标
tubiao1=0x00;
tubiao2=0x00;
tubiao3=0x00;
tubiao4=0x00;
mode_flag=0x01;//形式标志位flag=0x00开机界面flag=0x01初始界面;flag=0x02日历界面;flag=0x03东西界面;
//flag=0x04导航界面;flag=0x05文件夹界面

delayms(50000);
flag=0;
gps_flag=0;//初始化

PLL_Init();//体系时钟装备,有必要设置

PINSEL0 |= 0x00000005; //设置I/O连接到UART0
PINSEL1 |= 0x00000000;

UART0_INT(); //串口初始化
UART0_SendStr(“LPC2103 UART0 Test OK!”); //向串口发送字符串
delayms(60000);

LCD_RCU6093_int(); //初始化液晶
LCD_xy(0,0);//LCD指针坐标

mode_flag=0x05;
while(1)
{
key1_flag=0x00;
key2_flag=0x00;
key3_flag=0x00;

LCD_RCU6093_int(); //初始化液晶
LCD_xy(0,0);//LCD指针坐标

data_num0=1;
data_num1=1;

///////////显现电池和信号强度////////////
LCD_xy(94,1);//LCD指针坐标
write_hanzi(19);//
LCD_xy(94,0);//LCD指针坐标
write_hanzi(17);//
LCD_xy(0,1);//LCD指针坐标
write_hanzi(20);//
LCD_xy(0,0);//LCD指针坐标
write_hanzi(24);//
////////////////////////////

LCD_xy(16,0);//LCD指针坐标

write_hanzi(7); //小
write_hanzi(8);// 文
write_hanzi(0); //电
write_hanzi(11);//子

write_asicc(0);//空白
write_asicc(0);//空白
write_asicc(G);
write_asicc(P);
write_asicc(S);

LCD_xy(0,7);//LCD指针坐标
write_asicc(O);
write_asicc(K);
LCD_xy(72,7);//LCD指针坐标
write_asicc(B);
write_asicc(A);
write_asicc(C);
write_asicc(K);

while(mode_flag==0x01)
{
//cli();

///////图标//////////////////////
write_hanzi16(0,2,3,tubiao1);
write_hanzi16(1,2*14+2,3,tubiao2);
write_hanzi16(2,4*14+2,3,tubiao3);
write_hanzi16(3,6*14+2,3,tubiao4);
//////////显现手持式导航仪/////////////////
write_hanzi16(4,4,5,0);
write_hanzi16(5,1*16+4,5,0);
write_hanzi16(6,2*16+4,5,0);
write_hanzi16(7,3*16+4,5,0);
write_hanzi16(8,4*16+4,5,0);
write_hanzi16(9,5*16+4,5,0);

keytest();
if( key1_flag==0){tubiao1=0;tubiao2=0;tubiao3=0;tubiao4=0;key2_flag=0;}
if( key1_flag==1){tubiao1=1;tubiao2=0;tubiao3=0;tubiao4=0;key2_flag=0;}
if( key1_flag==2){tubiao1=0;tubiao2=1;tubiao3=0;tubiao4=0;key2_flag=0;}
if( key1_flag==3){tubiao1=0;tubiao2=0;tubiao3=1;tubiao4=0;}
if( key1_flag==4){tubiao1=0;tubiao2=0;tubiao3=0;tubiao4=1;}
if( key1_flag==5){key1_flag=0;}
if( key1_flag==3 &&key2_flag==1){key2_flag=0;mode_flag=0x04;}
if( key1_flag==4 &&key2_flag==1){key2_flag=0;mode_flag=0x05;}

}

///////////////////////////////////////////////////////////////
while(mode_flag==0x04)
{
UART0_INT(); //串口初始化
//sei(); //中止使能(avr/interrupt.h 中调用)
LCD_RCU6093_Clear();
key3_flag=0;
gps_flag=0;
break;
}
while(mode_flag==0x04)
{

while(gps_flag==0)//假如GPS没收到指令就一向发送09.12.29
{
U0THR=0xc0;
delayms(10000);
U0THR=0xa3;
delayms(10000);
U0THR=0x8f;
delayms(10000);
U0THR=0xec;
delayms(10000);
U0THR=0xca;
delayms(50000);
LCD_xy(24,3);//LCD指针坐标
write_asicc(N);
write_asicc(O);
write_asicc(0);
write_asicc(G);
write_asicc(P);
write_asicc(S);
keytest();
if( key3_flag==1){key3_flag=0;mode_flag=0x01;break;}
}
while(1)
{
GPS_display();
keytest();
if( key3_flag==1){key3_flag=0;mode_flag=0x01;break;}
}

}

while(mode_flag==0x05)
{
banbenxinxi();
key3_flag=0;
break;
}
while(mode_flag==0x05)
{

keytest();
if( key3_flag==1){key3_flag=0;mode_flag=0x01;break;}

}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/267186.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部