打印

想用51单片机做一个GPS液晶显示,求程序啊!

[复制链接]
3026|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LegendSong|  楼主 | 2011-4-8 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
angehan| | 2011-4-8 22:45 | 只看该作者
留个记号。。等着学习

使用特权

评论回复
板凳
uconny47| | 2011-4-8 23:44 | 只看该作者
到这里看看 肯定能找到你需要的
http://bbs.uconny.com/thread-htm-fid-35.html

使用特权

评论回复
地板
aihe| | 2011-4-9 20:10 | 只看该作者
求人不如求己,自己找资料自己弄
碰到问题上来求助,很多人会热心帮助的

使用特权

评论回复
5
LegendSong|  楼主 | 2011-4-10 08:41 | 只看该作者
//串口大师 发送数据到单片机 1602显示
#include <reg52.h>
#include <intrins.h>
#define uchar  unsigned char
#define uint   unsigned int
sbit LCD_RS = P2^0;            
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                          0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;
bit   playflag=0;
//uchar code  cdis1[ ] = {" SERILA TRANFER "};
uchar code  cdis2[ ] = {"                "};
/**********************************************************
延时子程序
**********************************************************/
void delay1(uint ms)
{
   uchar k;
   while(ms--)
   {
     for(k = 0; k < 120; k++);
   }
}
/******************************************************************/
/*                                                                */
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
/*                                                                */
/******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{
    delay1(15);   
    lcd_wcmd(0x01);      //清除LCD的显示内容            
    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x0c);      //开显示,显示光标,光标闪烁
    delay1(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay1(5);
}

/*********************************************************

  串行中断服务函数
*********************************************************/
void  serial() interrupt 4
{
   ES = 0;                //关闭串行中断
   RI = 0;                //清除串行接受标志位  RI-接受中断标志位
   buf = SBUF;            //从串口缓冲区取得数据
   playflag=1;
     
   switch(buf)
   {
                  
      default:     
         SBUF =buf;                 //发送数据
     while(!TI);         //TI-发送中断标志位 发送完毕后置1
     TI = 0; break;  //发送数据给计算机         
   }
   if(buf!=0x0D)
   {   
     if(buf!=0x0A)
     {
       temp =buf;
       if(count<16)
       {         
         RXDdata[count]=temp;
         count++;
       }
     }
   }
   ES = 1;    //允许串口中断
}
/*********************************************************
  数据显示函数
*********************************************************/
void  play()
{
   if(playflag)
   {
     lcd_wcmd(0x80+0x40);           //设置位置为第二行
     for(m=0;m<16;m++)
     lcd_wdat(cdis2[m]);      //清LCD1602第二行
     for(m=0;m<16;m++)
     {
       lcd_wcmd(0x80+0x40+m);       //设置显示位置为第二行
       lcd_wdat(RXDdata[m]);  //显示字符
     }
     playflag=0;              
     count=0x00;
     for(m=0;m<16;m++)      
     RXDdata[m]=0x20;         //清显存单元   
   }         
   delay1(500);     
}
/*********************************************************
  主函数
*********************************************************/
void main(void)
{
    P0 = 0xff;
    P2 = 0xff;         
   
    SCON=0x50;           //设定串口工作方式
    PCON=0x00;           //波特率不倍增
   
    TMOD=0x20;           //定时器1工作于8位自动重载模式, 用于产生波特率
    EA=1;
    ES = 1;              //允许串口中断
    TL1=0xfa;
    TH1=0xfa;             //波特率4800
    TR1=1;
    lcd_init();
    //lcd_pos(0x00);        //设置显示位置为第一行
    //for(m=0;m<16;m++)
    //lcd_wdat(cdis1[m]);   //显示字符
    lcd_wcmd(0x80+0x40);        //设置显示位置为第二行
    for(m=0;m<16;m++)
    lcd_wdat(cdis2[m]);   //显示字符            

    while(1)        
    {
      play();      
    }
}
/*********************************************************/
这只是个液晶显示 还没有过滤

使用特权

评论回复
6
LegendSong|  楼主 | 2011-4-10 08:45 | 只看该作者
说的对!!!!!!!!!!!

使用特权

评论回复
7
ljwdee| | 2011-5-5 16:20 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:上帝创造了我,然后把模子打碎了。

0

主题

34

帖子

1

粉丝