微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机芯片是stc89c52rc,LCD1602显示屏,怎样显示两行字符,然后滚动播放。原始C语言程序如下。有急用!

51单片机芯片是stc89c52rc,LCD1602显示屏,怎样显示两行字符,然后滚动播放。原始C语言程序如下。有急用!

时间:10-02 整理:3721RD 点击:

/********************************************************
***********************************************      
LCD1602液晶显示实验
说明:     用杜邦线: 1.将P0口与LCD的D0-D7连接起来
          2.将P2.0  接到
                  P2.1 P2.2 分别与RS  WR  E分别连接

********************************************************/
#include"AT89S52.H"
#define uchar unsigned char
#define uint  unsigned int
#define  LCD_DATA         P2        //定义LCD的D0-D7所在端口
#define  LCD_EN           P1_4      
#define  LCD_RW           P1_5      //LCD读写控制引脚
#define  LCD_RS           P1_6     //LCD指令或数据选择引脚
void nus_delay(uint nus);
void nms_delay(uint nms);
void mcu_io_init(void);
void lcd_init(void);
void LCD_en_write(void);
void wait_LCD_Ready(void);
void set_LCD_xy(uchar x, uchar y );
void LCD_write_onechar(uchar COMM,uchar DAT);
void LCD_write_string(uchar X,uchar Y,uchar *string);
/****************************************************
函数名称:main
功能描述:主函数
输 入: 无
输 出: 无
*****************************************************/
void main(void)
{
        uchar START_DISPLAY1[]={"welcome to wtu"};
    uchar START_DISPLAY2[]={"   thank you  "};       
        mcu_io_init();
        lcd_init();
        nms_delay(10);
    while(1)
        {
        LCD_write_string(1,0,START_DISPLAY1);
        nms_delay(100);
    LCD_write_string(1,1,START_DISPLAY2);
        nms_delay(1000);
        }
}
/****************************************************
函数名称:mcu_io_init
功能描述:上电CPU IO口初始化
输 入: 无
输 出: 无
*****************************************************/
void mcu_io_init(void)
{
    LCD_DATA=0xff;
        LCD_EN=1;
        LCD_RW=1;
        LCD_RS=1;
}
/****************************************************
函数名称:lcd_init
功能描述:LCD初始化
输 入: 无
输 出: 无
说明:注意初始化过程并加上适当延时
     后面LCD的显示方式可按实际需要修改
*****************************************************/
void lcd_init(void)
{
    nms_delay(15);
    LCD_write_onechar(0x38,0);
        nms_delay(1);
    LCD_write_onechar(0x38,0);
        nms_delay(1);
    LCD_write_onechar(0x38,0);
        nms_delay(1);
    LCD_write_onechar(0x38,0);
    LCD_write_onechar(0x08,0);    /*显示关闭*/
    LCD_write_onechar(0x01,0);    /*显示清屏*/
        LCD_write_onechar(0x06,0);    /*显示光标移动设置*/
        nms_delay(1);;  
    LCD_write_onechar(0x0C,0);    /*显示开及光标设置*/
}
/****************************************************
函数名称:LCD_en_write
功能描述:EN端产生一个脉冲,写LCD
输 入: 无
输 出: 无
*****************************************************/
void LCD_en_write(void)        
{
    LCD_EN=1;
    nus_delay(150);  //E脉冲周期最小150ns
    LCD_EN=0;
}
/****************************************************
函数名称:wait_LCD_Ready
功能描述:判断LCD忙标志
输 入: 无
输 出: 无
*****************************************************/
void wait_LCD_Ready(void)
{
        uchar temp1;
    LCD_DATA=0XFF;
                                   //判断LCD忙标志
                                   //1为忙  0为空闲
        LCD_RS=0;
    LCD_RW=1;                      //读
        LCD_EN=1;
        nus_delay(2);
        do
        {
        temp1=LCD_DATA;
    temp1&=0x80;
        }while(temp1);
        LCD_EN=0;
    LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_onechar
功能描述:写一个字节到LCD
输 入: COMM(指令)   DAT(显示数据)
输 出: 无
*****************************************************/
void LCD_write_onechar(uchar COMM,uchar DAT)
{
         wait_LCD_Ready();         //等待LCD空闲
         LCD_RW=0;                 //写
         
         //写数据
         if(COMM==0)
         {
            LCD_RS=1;  //RS高电平向LCD写数据
                LCD_DATA=DAT;
         }
         //写命令
         else
         {
            LCD_RS=0;
        LCD_DATA=COMM;
         }
         LCD_en_write();
         nus_delay(2);
         LCD_RW=1;
         LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_string
功能描述:LCD字符串显示函数
输 入: x/y(X与Y坐标)   *string(字符串首地址)
输 出: 无
*****************************************************/
void LCD_write_string(uchar X,uchar Y,uchar *string)
{
    set_LCD_xy( X, Y );                //设置LCD显示坐标
    while (*string)
    {
      LCD_write_onechar(0,*string );
          string ++;                       //指向下一显示字符地址
    }
}
/****************************************************
函数名称:set_LCD_xy
功能描述:设置显示坐标
输 入: x/y(X与Y坐标)
输 出: 无
说明:  LMB1602第一行首地址为0x80
              第二行为0xC0
*****************************************************/
void set_LCD_xy(uchar x, uchar y )
{
    uchar DIS_address;
    if (y == 0)
           DIS_address = 0x80 + x;            //第一行X列
    else
       DIS_address = 0xc0 + x;
    LCD_write_onechar( DIS_address, 0 );  //第二行X列
}
/****************************************************
函数名称:nus_delay
功能描述:微秒级延时子程序
输 入: 无
输 出: 无
说明:   
晶振为11.0592M时  
*****************************************************/
void nus_delay(uint nus)
{
    int j=10;
    while(nus--)
    {
       while(j--);
           j=10;
    }
}
/****************************************************
函数名称:nms_delay
功能描述:毫秒级延时子程序
输 入: 无
输 出: 无
说明:   
晶振为11.0592M时            
*****************************************************/
void nms_delay(uint nms)
{
        while(nms--)
        nus_delay(300);
}

滚动字符你就操作坐标就行了啊,你把整个字符串的坐标逐步增加或者减小就是了

这个可以对1602进行配置的吧,滚动显示模式,我记得是有的,你看看。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top