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

📄 lcd1602.txt

📁 lcd1602c语言程序可以直接使用 非常方便
💻 TXT
字号:
/*********************LCD模块1602底层驱动库***********************
*  LCD模块与单片机的硬件连接:
*
*!!!!!!!!!!!!!!!!!!!通过对头文件的宏定义可以适应各种端口连接!!!!!!!!!!!!!!!!!!!!
*
*                                        *宏定义名称* *LCD端口* *端口意义* 
*    RS数据/指令选择线   RS    LCD_RS_PORT  4       //RS端口选择
*                                         LCD_RS               //RS端口号选择
*            
*            R/W读写选择线   R/W   NC     5
*            
*            EN写使能线          EN    LCD_EN_PORT  6       //使能端口选择
*                                         LCD_EN               //使能端口号选择
*            
*            三态双向数据总线    LCD_DATA_PORT         D4-D7   //数据端口选择
*                                LCD_DATA                      //数据端口号选择
*                          
*  其他端口连接:
*            电源负     VSS             1
*    电源正+4.5--+5.5V   VDD         2
*    对比度调节    VL       3
*    背光负     BLK      15
*    背光正              BLA      16
*  
*  说明:*采用节省端口的4线线连接方式,即将8位的数据分两次传输;同
*         时将R/W接地RW(只用W不需要R,所以可以省一根线)
*        *功能显示函数:
*                     Locate                           //显示定位
*                     LCD_Write_String                 //写入字符串
*                     Flash_String                     //字符串闪烁效果
*                     String_Run                       //字符串滚动效果
*                     DEC_Num_Disp                     //十进制数据显示
*                     HEX_Num_Disp                     //16进制数据显示
*                     Point_Disp                       //小数显示
*        *为了避免程序"死等",故在功能函数中尽量避免调用Delay函数,
*         定义了Flash_Counter,String_Run_Counter.在使用本头文件时,
*         应将这些变量放在定时器中断里累加。   
*****************************************************************/
  
/*****************定义MCU与LCD的接口******************/
#define LCD_EN_PORT      P2         //写使能。高有效,下降沿时锁定数据
#define LCD_RS_PORT      P2          //指令/数据选择
#define LCD_DATA_PORT    P1                         //数据总线


#define LCD_EN           0x04                          //PORTD2         out 20
#define LCD_RS           0x08                          //PORTD3   out 10
#define LCD_DATA         0xf0                          //PORTD4/5/6/7   out

#define Data_Write       LCD_RS_PORT |=  LCD_RS      //写数据模式
#define Command_Write    LCD_RS_PORT &= ~LCD_RS     //写指令模式

#define Write_En         LCD_EN_PORT |=  LCD_EN     //写使能
#define Write_Lock      LCD_EN_PORT &= ~LCD_EN     //锁定数据

#define CLS              LCD_Write_Char(0x01,0)        //清屏


/********************数组定义区***********************/
const char CHR[] = {'0','1','2','3','4','5','6','7','8'
                    ,'9','a','b','c','d','e','f','.'};
unsigned char LCD_Buff[] = {0,0,0,0,0,0,0,0};  


/******************全局变量定义区*********************/
char Length = 0;                                       //字符串长度值
char Flash_Counter = 0;
char String_Run_Counter = 0;
int  Jump_Counter = 0;

 
/******************功能函数声明区*********************/
void Delay_nus(unsigned int j);                                                                  //微秒级延时函数
void Delay_nms(unsigned int n);                                                                  //毫秒级延时函数
void LCD_Write_Char(char Command,char Data);                                                     //写入单个字符或指令
void LCD_Init(void);                                                                             //LCD模块初始化
char StringLenth(char *String);                                                                  //字符串长度测量函数
void Locate( unsigned char x, unsigned char y );                                                 //显示定位
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String);                    //写入字符串
void DEC_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit);                   //十进制数据显示
void HEX_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit);                   //16进制数据显示
void Point_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit,char Point);          //小数显示

 
/*******************N us延时函数**********************/
void Delay_nus(unsigned int j)                        
{
   unsigned int i=0;
   for(i=j;i>0;i--)
   {
      ;
   }   
}

/********************N ms延时函数*********************/
void Delay_nms(unsigned int n)                         
{
   unsigned int m = 0;
   unsigned int k = 0;
   for (m=n;m>0;m--)
   {
      for (k=1140;k>0;k--)
   {  
      Delay_nus(1);
      }   
   }   
}

/*************************************************************
* LCD_Write_Char      :英文单字符显示函数
* 
* 向LCD发送数据/指令。  Command=1    发送显示数据
*       Command=0    发送指令数据
*
* 输入参数     :Command         数据/指令寄存器选择
*      Data   显示内容   
*                         
**************************************************************/
void LCD_Write_Char(char Command,char Data)            
{
   unsigned Command_Temp,Data_Temp;
   Command_Temp = Command;
   Data_Temp    = Data;
   Delay_nus(50);                      //延时1ms,以避开"写繁忙"时期
 
   if (Command == 0)           //数据输入模式
   {  
      Write_En;
   Data_Write;
   LCD_DATA_PORT &= 0x0f;
   LCD_DATA_PORT |= Data_Temp&0xf0;         //先送高4位
   Write_Lock;
   }   
   else                  //指令输入模式
   {
      Write_En;
   Command_Write;
   LCD_DATA_PORT &= 0x0f;
   LCD_DATA_PORT |= Command_Temp&0xf0;
   Write_Lock;
   }

 Command_Temp=Command_Temp << 4;               
    Data_Temp=Data_Temp       << 4;
  
    LCD_DATA_PORT &= 0X0F;
    if (Command==0)                    //再送低4位
 {
       Write_En;
    LCD_DATA_PORT |= Data_Temp&0xf0;
    Write_Lock;
 }
    else
    {
    Write_En;
    LCD_DATA_PORT |= Command_Temp&0xf0;
    Write_Lock;
 }  
 
}

/***********LCD模块初始化**************/
void LCD_Init(void)                                   
{
 Delay_nms(1);
 
 LCD_Write_Char(0x28,0);          //4位数据线格式
 Delay_nus(10);
 LCD_Write_Char(0x0c,0);              //显示开        
 Delay_nus(10);
 LCD_Write_Char(0x01,0);          //清屏
 Delay_nms(1);
 LCD_Write_Char(0x06,0);          //光标模式设置
}

 

/**************************************************************
* Locate              : 设置LCD显示的起始位置
*
* 输入参数:x、y      : 显示字符串的坐标,X:0-15,Y:0-1
*                      LCD第一行显示寄存器地址:0X80-0X8F
*                      LCD第一行显示寄存器地址:0XC0-0XCF  
**************************************************************/
void Locate( unsigned char x, unsigned char y )
{
    unsigned char  Address;
 if (y == 0) 
 {
     Address = 0x80 + x;                   //第一行显示的地址
 } 
    
 if (y == 1)
 { 
        Address = 0xc0 + x;           //第二行显示的地址
    }   
    LCD_Write_Char(Address,0);
}

/**************************************************************
* LCD_Write_String    : 英文字符串显示函数
*
* 输入参数:X、Y      :显示字符串的坐标
*           String    :英文字符串指针
*           
**************************************************************/
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String)
{
 
 Locate(X,Y);                        //先送显示起始坐标 
    while (*String)                 //再依次送显示字符
      {
     
        LCD_Write_Char( 0, *String );
     String ++;       
      }   
}


/**************************************************************
* DEC_Num_Disp        :10进制数值显示函数
*
* 输入参数            :X     字符起始显示行坐标
*         Y     字符起始显示列坐标
*      Num   需要显示的数值(最长8位)
*              Bit   有效显示位数
* 输出                :
**************************************************************/
void DEC_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
   unsigned char i   = 0;
   Locate( X, Y );
   for (i=0 ; i<Bit ; i++)
   {
   LCD_Buff[i] = CHR[Num%10];
   Num = Num/10;
   }
   for (i=0 ; i<Bit ; i++)
   {
      LCD_Write_Char(0,LCD_Buff[Bit-i-1]);
   }  
}

/*************************************************************
* HEX_Num_Disp        :16进制数值显示函数
*
* 输入参数            :X     字符起始显示行坐标
*         Y     字符起始显示列坐标
*      Num   需要显示的数值(最长8位)
*              Bit   有效显示位数
* 输出                :
**************************************************************/
void HEX_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
   char a = 0;
   Locate( X, Y );
   for(a=8-Bit ; a<8 ; a++)
   {
      LCD_Write_Char(0,CHR[(Num<< (a << 2)) >>28]);   
   }
} 

⌨️ 快捷键说明

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