新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2014-4-21
- 在线时间
- 0 小时
|
5金钱
这个是程序,各位大神帮忙看看啊!
#include<reg52.h>
#include<intrins.h>
#define START '$'
#define END '*'
#define TS1602_DATA P0
// LCD1602地址表
/*
0X80 0X81 0X82 0X83 0X84 0X85 0X86 0X87 0X88 0X89 0X8A 0X8B 0X8C 0X8D 0X8E 0X8F
0XC0 0XC1 0XC2 0XC3 0XC4 0XC5 0XC6 0XC7 0XC8 0XC9 0XCA 0XCB 0XCC 0XCD 0XCE 0XCF
*/
unsigned char code lcd_code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char Num_comma=0;
bit read_start=0;
unsigned char i,j=10,k=11;igps=0;
bit flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
unsigned char status[1]; //状态 A 为数据OK; V 为警告
unsigned char latitude[10]={0};//纬度
unsigned char N_S[1]; //N(北纬) 或 S(南纬)
unsigned char longitude[11]={0};//经度
unsigned char E_W[1]; //E(东经)或W(西经)
sbit RS=P2^3; //指令或数据
sbit RW=P2^4; //读或写
sbit E =P2^5; //使能端
/***************************************************
//函数功能:LCD1602驱动函数
*****************************************************/
void delay(unsigned int x)
{
unsigned int i;
for(;x>0;x--)
for(i=0;i<4;i++)
;
}
//************************************************
//函数功能:写指令
//使用说明:无
//************************************************
void write_com(unsigned char com)
{
RW=0;
RS=0;
TS1602_DATA=com;
delay(1);
E=1;
delay(1);
E=0;
}
//***************************************************
//函数功能:写数据
//使用说明:无
//****************************************************
void write_date(unsigned char date)
{
RW=0;
RS=1;
TS1602_DATA=date;
delay(1);
E=1;
delay(1);
E=0;
}
//***************************************************
//函数功能:液晶初始化
//使用说明:无
//****************************************************
void TS1602_INIT(void)
{
RS=0;
RW=0;
write_com(0x38);
write_com(0x0C); //设置液晶光标 不显示
write_com(0x06);
write_com(0x01); //清屏
write_com(0x80); //光标的位置
}
//函数功能:显示一位数字
void display_a_num(unsigned char num)
{
write_date(lcd_code[num]);
}
//函数功能:显示字符串
void display_string(unsigned char *P)
{
while(*P)
{
write_date(*P);
P++;
}
}
//****************************************************************
//函数功能:LCD显示
//参数说明:参数为地点代号
//****************************************************************
void LCD1602_display()
{
write_com(0x80); //设置液晶光标起始位置 第一行起点
write_date(N_S[0]); //显示"N"或"S"
write_date(':');
display_a_num(latitude[0]); //显示十位
display_a_num(latitude[1]); //显示个位
display_a_num(latitude[2]);
display_a_num(latitude[3]);
write_date(latitude[4]); //显示小数点
display_a_num(latitude[5]);
display_a_num(latitude[6]);
display_a_num(latitude[7]);
display_a_num(latitude[8]);
display_a_num(latitude[9]);
write_com(0x8d); //设置液晶光标起始位置
write_date(status[0]); //显示'A'或'V'
write_com(0xc0); //设置光标位置 第二行起点
write_date(E_W[0]); //显示"E"或"W"
write_date(':');
display_a_num(longitude[0]); //百位
display_a_num(longitude[1]); //十位
display_a_num(longitude[2]); //个位
display_a_num(longitude[3]);
display_a_num(longitude[4]);
write_date(longitude[5]); //显示小数点
display_a_num(longitude[6]);
display_a_num(longitude[7]);
display_a_num(longitude[8]);
display_a_num(longitude[9]);
display_a_num(longitude[10]);
}
void main()
{
TS1602_INIT(); //液晶初始化
TMOD=0X20; //单片机晶振11.0592M
TL1=0XFD; //256-253=3 波特率:9600bps
TH1=0XFD;
SCON=0X50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 串行方式1
PCON=0X00; //SMOD=0
IE=0X90; //EA=1; ET1=1;
TR1=1; //开定时器1
delay(100);
while(1) //死循环,程序一直在里面运行
{
LCD1602_display();//液晶显示
}
}
void serial()interrupt 4
{
RI=0;
if(SBUF=='$')
{ flag1=1;
igps=0;
Num_comma=0;
}
else flag1=0;
if((SBUF=='G')&&(flag1==1))flag2=1;
else flag2=0;
if((SBUF=='P')&&(flag2==1))flag3=1;
else flag3=0;
if((SBUF=='R')&&(flag3==1))flag4=1;
else flag4=0;
if((SBUF=='M')&&(flag4==1))flag5=1;
else flag5=0;
if((SBUF=='C')&&(flag5==1))read_start=1;
else read_start=0;
if(read_start==1)
{
if(SBUF==',')
{ Num_comma++;
}
if(Num_comma==2)
{ status[igps]=SBUF;
}
if(Num_comma==3)
{ for(i=0;i<j;i++)latitude[igps]=SBUF;
}
if(Num_comma==4)
{ N_S[igps]=SBUF;
}
if(Num_comma==5)
{ for(i=0;i<k;i++)longitude[igps]=SBUF;
}
if(Num_comma==6)
{ E_W[igps]=SBUF;
igps++;
}
if(SBUF=='*')
{
Num_comma=0;
read_start=0;
igps=0;
}
}
}
|
|