[资料分享] 液晶画面滚动起来!

songbo   2008-5-5 09:29 楼主
以前的文章写过1602液晶的显示程序,现在将液晶显示的画面移动起来,其实很简单,大家实验!(本实验经过本博客开发板实验)

/*
***************************************************************************
*     (C) Copyright 2007,单片机初学者园地
*                          All Rights reserved.
*项目名称:    51单片机学习开发系统           
*本文件名称:LCD1602.c   
* 完成作者 : 单片机初学者 QQ:50501160   ahai0306@sina.com
* 当前版本 : V1.0        
* 完成日期 : 2007年4月3日
* 描    述 :  
*                此程序实现,完成液晶的驱动程序,可以显示任意的ASCII字符
*            
*  我的博客:http://blog.ednchina.com/ahai0306/
*  开发板介绍:http://blog.ednchina.com/ahai0306/84416/message.aspx
*  淘宝网店铺地址:http://shop35284066.taobao.com/
*  我的论坛:http://dianzi.5d6d.com/?fromuser=mcu_51           
****************************************************************************
*/
#include       //调用头文件(单片机内部的寄存器定义)

/******本段为硬件I/O口定义********/
sbit  KEY0   = P0 ^ 0;  //KEY和发光管复用,请将跳线插到KEY端
sbit  KEY1   = P0 ^ 1;
sbit  KEY2   = P0 ^ 2;
sbit  KEY3   = P0 ^ 3;
sbit  DIG0   = P0 ^ 4;  //数码管位0
sbit  DIG1   = P0 ^ 5;  //数码管位1

sbit  BUZZ   = P3 ^ 3;  //蜂鸣器
sbit  LCD_RW = P3 ^ 6;  
sbit  LCD_RS = P3 ^ 7;  
sbit  LCD_E  = P3 ^ 4;

#define  LED_SEG    P1  //数码管
#define  LCD_DATA   P2   //LCD DATA
#define  LCD_BUSY   0x80  // 用于检测LCD的BUSY标识(本程序中用的延时,未检测)
//LCD显示内容,定义到代码段
unsigned  char code LcdBuf1[]= {"welcom!"};
unsigned  char code LcdBuf2[]= {"MCU-STUDY-BOARD"};

//函数声明
void  lcd_init(void);
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s);
void  disp_selec(unsigned  char bit_selec,unsigned  char  seg);

void  WriteCommandLcd(unsigned  char wdata);


/**************************************************
** 函数名称: dellay
** 入口参数:h(unsigned int型)
** 出口参数:无
** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
****************************************************/
void dellay(unsigned int  h)
{
  while(h--);    //0.01MS
}


/************主程序**************/
main()
{
    lcd_init();
display_string(3,0,LcdBuf1);  //显示第一行,从第3个位置开始
display_string(0,1,LcdBuf2);  //显示第二行,从第0个位置开始

   while(1)    //单片机待机
   {

    dellay(23000);            //滚动的延时时间
   WriteCommandLcd(0x18);   //画面向左移动1位

    //WriteCommandLcd(0x1c);   //画面向右移动1位

    }

}

/**************************************************
** 函数名称: WriteDataLcd
** 入口参数:wdata(unsigned  char型)
** 出口参数:无
** 功能描述: 写数据到LCD
****************************************************/
void  WriteDataLcd(unsigned  char wdata)
{
   LCD_DATA=wdata;
   LCD_RS=1;
   LCD_RW=0;
   LCD_E=0;
   dellay(100);     //短暂延时,代替检测忙状态

   LCD_E=1;
}
/**************************************************
** 函数名称: WriteCommandLcd
** 入口参数:wdata(unsigned  char型)
** 出口参数:无
** 功能描述: 写命令到LCD
****************************************************/
void  WriteCommandLcd(unsigned  char wdata)
{
   LCD_DATA=wdata;
   LCD_RS=0;
   LCD_RW=0;
   LCD_E=0;
   dellay(100);      //短暂延时,代替检测忙状态
   LCD_E=1;
}

//LCD初始化
void  lcd_init(void)
{
     LCD_DATA=0;
     WriteCommandLcd(0x38);
     dellay(1000);
     WriteCommandLcd(0x38); //显示模式设置
    WriteCommandLcd(0x08); //关闭显示
    WriteCommandLcd(0x01); //显示清屏
    WriteCommandLcd(0x06); //显示光标移动设置
    WriteCommandLcd(0x0c); //显示开及光标移动设置
}
/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned  char型),y(unsigned  char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是列号,y是行号
****************************************************/
void  display_xy(unsigned  char x,unsigned  char y)
{
    if(y==1)
   x+=0x40;
  x+=0x80;
  WriteCommandLcd(x);
}
/********************************************************************
** 函数名称: display_char
** 入口参数:x(unsigned  char型),y(unsigned  char型),dat(unsigned  char型)
** 出口参数:无
** 功能描述: 在具体位置显示单个字符,x是列号,y是行号
*********************************************************************/
void  display_char(unsigned  char x,unsigned  char y,unsigned  char dat)
{
  display_xy(x,y);
  WriteDataLcd(dat);
}

/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned  char型),y(unsigned  char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s)
{
  display_xy(x,y);
  while(*s)
  {
   WriteDataLcd(*s);
   s++;
  }
}
增加硬件原理图:
  • 351f2c8a-0e71-4fdb-9126-ff2d8bee59d2.jpg

回复评论 (4)

支持!沙发.

支持!沙发.沙发.沙发.
点赞  2008-5-5 09:56
呵呵 不错啊
点赞  2008-5-5 10:56

Re: [分享] 液晶画面滚动起来!

先下再顶,也总是入不敷出啊。
点赞  2009-1-13 09:48
谢谢分享,研究一下
点赞  2010-6-12 18:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复