|
说是下面的程序没有中断的程序,怎么写,求大神帮忙,多谢啊啊!!!
#include
#include "1602.h"
//GPGMC
unsigned char gps_time[10]; //时间数据
unsigned char gps_mode; //模式数据
unsigned char gps_longitude[9]; //经度数据
unsigned char gps_longitude_dir; //经度方向N/S?
unsigned char gps_latitude[10]; //纬度数据
unsigned char gps_latitude_dir; //纬度方向E/W?
#define MAX_RX_BUF 12 //长度
unsigned char gps_rx_mode; //模式
unsigned char rx_pointer; //指针
unsigned char com_rx_buf[MAX_RX_BUF]; //串口接收缓冲区
void Uart_Init1();
void dis_jwdu();
void rx_gps_data(unsigned char com_rx_byte) ;
unsigned char gcount,k;
void delay_ns(unsigned int time) ;
void Jingzhen();
void usart1_rx ();
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P3SEL |= 0xc0; //P3.6,7用作UTXD1/URXD1
P3DIR |= 0x40; //P3.6输出
P1DIR |= 0x40;
Uart_Init1(); //串口初始化
// clear();
P1OUT=0x00;
P1OUT|=0x00;
delay_ns(3); //延迟3秒
while(1)
{
dis_jwdu();//1602显示经纬度
}
}
void Jingzhen(void) //晶振初始化
{
unsigned int n;
BCSCTL1 &= ~XT2OFF; // 启动XT2,XT2上电后默认是关闭的
do
{
IFG1 &= ~OFIFG; // 清除震荡器失效标志
for (n = 0xFF; n > 0; n--); // 延时,待稳定
}
while ((IFG1 & OFIFG)); // 检查震荡器失效标志位
BCSCTL2 = 0x88 ; // MCLK = SMCLK = XT2 (safe)
}
void Uart_Init1(void) //串口1初始化
{
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
UCTL1 = CHAR; // 8-bit character
UTCTL1 = SSEL1; // UCLK = SMCLK
UBR01 = 0X41; // 波特率9600
UBR11 = 0X03;
UMCTL1 = 0X00; // modulation
IE2 |= URXIE1; // Enable USART1 RX interrupt
UCTL1 &= ~SWRST; // Initialize USART stat
}
void rx_gps_data(unsigned char com_rx_byte) //读取经纬度
{
unsigned char i;
if(com_rx_byte=='$')
{
gps_rx_mode=0;
rx_pointer=0;
for(i=0;i
com_rx_buf=0;
}
else
{
if(rx_pointer
{
com_rx_buf[rx_pointer]=com_rx_byte;
rx_pointer++;
}
}
switch(gps_rx_mode)
{
case 0: //接收GPRMC字段
if(com_rx_byte==',')
{
if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='R')&&(com_rx_buf[3]=='M')&&(com_rx_buf[4]=='C')) //GPRMC
gps_rx_mode=1;
rx_pointer=0;
}break;
case 1: //接收时间字段
if(com_rx_byte==',')
{
for(i=0;i<10;i++)
{
gps_time=com_rx_buf;
}
gps_rx_mode=2;
rx_pointer=0;
}break;
case 2: //接收定位状态字段
if(com_rx_byte==',')
{
gps_mode=com_rx_buf[0];
gps_rx_mode=3;
rx_pointer=0;
}break;
case 3: //纬度ddmm.mmmm,度分格式
if(com_rx_byte==',')
{
for(i=0;i<9;i++)
{
gps_longitude=com_rx_buf;
}
gps_rx_mode=4;
rx_pointer=0;
}break;
case 4: //纬度N(北纬)或S(南纬)
if(com_rx_byte==',')
{
gps_longitude_dir=com_rx_buf[0];
gps_rx_mode=5;
rx_pointer=0;
}break;
case 5: //经度dddmm.mmmm,度分格式
if(com_rx_byte==',')
{
for(i=0;i<10;i++)
{
gps_latitude=com_rx_buf;
}
gps_rx_mode=6;
rx_pointer=0;
}break;
case 6: //经度E(东经)或W(西经)
if(com_rx_byte==',')
{
gps_latitude_dir=com_rx_buf[0];
gps_rx_mode=7;
rx_pointer=0;
}break;
default:
gps_rx_mode=0;
rx_pointer=0;
break;
}
}
void dis_jwdu(void)
{
unsigned i;
LCD_disp_char(1,0,gps_latitude_dir);
for(i=0;i<9;i++)
{
LCD_disp_char(4,0,gps_latitude);
}
LCD_disp_char(1,1,gps_longitude_dir);
for(i=0;i<10;i++)
{
LCD_disp_char(4,1,gps_longitude);
}
}
void delay_ns(unsigned int time) //延时n秒
{
unsigned int d1,d2,j;
for(j=0;j
for(d1=0;d1<1020;d1++)
for(d2=0;d2<1300;d2++)
{
_NOP(); //执行空操作
}
}
void delay_nus(unsigned int time) //延时n微秒
{
unsigned int d1,d2,j;
for(j=0;j
for(d1=0;d1<1020;d1++)
{
for(d2=0;d2<1030;d2++)
{
_NOP();
}
}
}
void delay_nms(unsigned int time) //延时n毫秒
{
unsigned int d1,d2,j;
for(j=0;j
for(d1=0;d1<1;d1++)
for(d2=0;d2<1300;d2++)
{
_NOP();
}
}
void usart1_rx (void)
{
if(gcount<200)
{
rx_gps_data(RXBUF1);
gcount=gcount+1;
clear();
}
else
gcount=0;
}
|
|