⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.c

📁 音乐盒程序:基于AT89S52的数字音乐盒程序
💻 C
字号:
#include<c8051f020.h>
#define uchar unsigned char
#define uint  unsigned int

//***************程序说明*******************
// 对字符型液晶显示器定义三根地址线:
// sbit RS=P4^0;sbit RW=P4^1;sbit EN=P4^2;		 
// 由于P4口在f020单片机上不可位寻址,故以下
// 程序均采用对P4口赋值的形式给三根控制位赋值
//*******************************************

//*******************************************
// 该部分主要是对要用到的函数进行申明
// 后面将具体的对相关函数进行定义,可选择性的选
// 择相关函数
//*******************************************
void Lcd1602_Initial( );
void Lcd1602_Write_Command(uchar Command_Code);
void Lcd1602_Write_Data(uchar row,uchar column,uchar Data);
void Lcd1602_Write_String(uchar row,uchar column,uchar *dis_buffer);
//void Lcd1602_Clear_Char(uchar row,uchar column);
//void Lcd1602_Clear_Line(uchar line); //前两个函数没用
//void Lcd1602_Clear_All( );   //这个函数只在AD9851中用

void Lcd_delay(uint t1,t2);
//void Lcd_delay(uint t1,uint t2); 可以写成上面这种方式

//**********************************************
// 功能说明:对字符型液晶显示器LCD1602进行初始化
// 输入变量:无 ; 全局变量:无
// 返回值: 无
// 调用函数:Lcd1602_Write_Command()
//**********************************************
void Lcd1602_Initial( )
{  
    Lcd1602_Write_Command(0x38);//显示模式设置:0011(数据位8位),1(双行显示)0(5*7点阵)**
    Lcd1602_Write_Command(0x0c);//显示开关设置:0000,11(开显示),1(开光标),1(字符闪烁)
    Lcd1602_Write_Command(0x01);//清屏显示设置:显示清屏。
    Lcd1602_Write_Command(0x06);//输入方式设置:0000,011(光标自左向右移)0(整屏不移动)。
	Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
    Lcd1602_Write_Command(0x02);//光标复位命令:数据指针清零
    Lcd1602_Write_Command(0x0c);//开显示,显示光标,光标闪烁
    Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
} 

//**************************************************
// 功能说明:对字符型液晶显示器LCD1602写入控制字
// 输入变量:uchar Command_Code ;全局变量:无
// 返回值 :无
// 调用函数 :无 
//************************************************** 
void Lcd1602_Write_Command(uchar Command_Code)
{
    P4=0x00; 				 //RS=0;RW=0;EN=0;开始写入指令
    P5=Command_Code;		 //将待写入指令赋给P5口
    Lcd_delay(10,1);
    P4=0x04;                 //NE=1;开启使能      
    Lcd_delay(10,10);
    P4=0x00;                 //EN=0;当EN由高向底转变时,LCD接收数据或指令       
}

//**************************************************
// 功能说明:对字符型液晶显示器LCD1602写入数据
// 输入变量:uchar row,uchar column,uchar Data 
// 其中   row的取值范围为:1-- 2
//     column的取值范围为:0--15
// 全局变量 :无   ;返回值 : 无
// 调用函数 :Lcd1602_Write_Command()
//**************************************************
void Lcd1602_Write_Data(uchar row,uchar column,uchar Data)
{
    if (row==2) 
        column |= 0x40;            //当要显示第二行时,相应的地址码为当前列数+0x40;
        column |= 0x80;            //算出指令码即让DDRAM指针指向相应的位置

    Lcd1602_Write_Command(column); //这里不检测忙信号,发送地址码

    P4=0x01;					   //RS=1;RW=0;EN=0;开始写入数据
    P5=Data;    				   
    Lcd_delay(10,10);
    P4=0x05;                       //EN=1
    Lcd_delay(10,10);
    P4=0x01;                       //EN=0
}

//***********************************************************
// 功能说明:写字符串到LCD,如果一行写不下,则写到下一行
//           如果一屏写不下,则只写一屏;
// 输入变量:uchar row,uchar column,uchar *dis_buffer
// 全局变量 :无  ;返回值 : 无
// 调用函数 :Lcd1602_Write_Data();
//            Lcd1602_Write_Command	;
//***********************************************************
void Lcd1602_Write_String(uchar row,uchar column,uchar *dis_buffer)
{
 	uchar i=0;
    while(dis_buffer[i]!='\0')
        {
            Lcd1602_Write_Data(row,column,dis_buffer[i]);
            i++;column++;
            if(column==40)
            {               
                column=1;
                row++;
                if(row==2) return;
                else
                {
                  switch(row)                                     //这种结构保持以后升级到多行显示液晶
                  {
                    case 1:Lcd1602_Write_Command(0x80);break;
                    case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新调整数据地址指针
                    default:break;
                  }
                }
            }
        } 
}   

//************************************************************
// 功能说明:清除指定的位置的字符,光标返回最左边第一个字符位置
// 输入变量:uchar row,uchar column ;全局变量:无
// 返回值 : 无
// 调用函数 : Lcd1602_Write_String()
//************************************************************
/*void Lcd1602_Clear_Char(uchar row,uchar column)
{
    Lcd1602_Write_String(row,column," ");
}*/ 

//*************************************************************
// 功能说明:清除指定的行,光标返回最左边第一个字符位置
// 输入变量:uchar line ; 全局变量 : 无
// 返回值  : 无
// 调用函数 :Lcd1602_Write_String();Lcd1602_Write_Command()
//*************************************************************
/*void Lcd1602_Clear_Line(uchar line)
{
    Lcd1602_Write_String(line,0,"                ");
    switch(line)                                           //这种结构保持以后升级到多行显示液晶
        {
           case 1:Lcd1602_Write_Command(0x80);break;       //将数据地址指针定位到第一行
           case 2:Lcd1602_Write_Command(0x80+0x40);break;  //将数据地址指针定位到第二行
           default: break;
        }   
} */

//**************************************************************
//	功能说明:清屏,并将DDRAM指针指向第一行第一列
//	输入变量:无 ;全局变量: 无 ;返回值:无
//  调用函数:Lcd1602_Write_Command()
//***************************************************************
/*void Lcd1602_Clear_All( )
{
   Lcd1602_Write_Command(0x01);//显示清屏。
   Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
} */

//**************************************************************
//	功能说明:延时
//	输入变量:uint t1,t2	全局变量:无   ;返回值:无
//	调用函数:无
//*************************************************************

//void Lcd_delay(uint t1,uint t2)可以写成下面这种方式
void Lcd_delay(uint t1,t2)
{   
	uint i,j;
	for(i=1;i<t1;i++)
    for(j=1;j<t2;j++);
	      
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -