单片机控制LCD1602显示屏动态显示字符串

仿真电路图:

单片机控制LCD1602显示屏动态显示字符串_第1张图片

仿真实验结果:

单片机控制LCD1602显示屏动态显示字符串_第2张图片

C语言程序代码:


//------------------------------------------------*/
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include

sbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
    while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{  
    while(t--)
    {
        //大致延时1mS
        DelayUs2x(245);
        DelayUs2x(245);
    }
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void) 
{ 
    DataPort= 0xFF; 
    RS_CLR; 
    RW_SET; 
    EN_CLR; 
    _nop_(); 
    EN_SET;
    return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com) 
{  
    // while(LCD_Check_Busy()); //忙则等待
    DelayMs(5);
    RS_CLR; 
    RW_CLR; 
    EN_SET; 
    DataPort= com; 
    _nop_(); 
    EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data) 
{ 
    //while(LCD_Check_Busy()); //忙则等待
    DelayMs(5);
    RS_SET; 
    RW_CLR; 
    EN_SET; 
    DataPort= Data; 
    _nop_();
    EN_CLR;
}

/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void) 
{ 
    LCD_Write_Com(0x01); 
    DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
    if (y == 0) 
    {     
        LCD_Write_Com(0x80 + x);     //表示第一行
    }
    else 
    {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
    }        
    while (*s) 
    {     
        LCD_Write_Data( *s);     
        s ++;     
    }
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
{     
    if (y == 0) 
    {     
        LCD_Write_Com(0x80 + x);     
    }    
    else 
    {     
        LCD_Write_Com(0xC0 + x);     
    }        
    LCD_Write_Data( Data);  
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void) 
{
    LCD_Write_Com(0x38);    /*显示模式设置*/ 
    DelayMs(5); 
    LCD_Write_Com(0x38); 
    DelayMs(5); 
    LCD_Write_Com(0x38); 
    DelayMs(5); 
    LCD_Write_Com(0x38);  
    LCD_Write_Com(0x08);    /*显示关闭*/ 
    LCD_Write_Com(0x01);    /*显示清屏*/ 
    LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
    DelayMs(5); 
    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}

/*------------------------------------------------
主函数[上面已经把显示功能封装好了,今后再写其他显示就直接调用]
------------------------------------------------*/ 
void main(void)
{
    unsigned char i;
    unsigned char *p;
    LCD_Init();//初始化
    while(1)
    {
        i=1;
        p="Xian of China";
        LCD_Clear();//清屏
        LCD_Write_String(2,0,"Welcome to");
        DelayMs(250);
        while(*p)
        {
             LCD_Write_Char(i,1,*p);
             i++;//位置移动一个
             p++;//字符串移动一个
             DelayMs(250);
        }
        DelayMs(250);
    }
}


你可能感兴趣的:(单片机)