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

📄 1602驱动源代码.txt

📁 硬件电路液晶显示模块1602引脚程序。初学者必备
💻 TXT
字号:
主题: LCD1602的电路图及驱动源代码 



--------------------------------------------------------------------------------



 大家可以作为学习的例子参考!
 



--------------------------------------------------------------------------------




 提供一个1601液晶屏的应用资料供参考
============================================================== 

SMC1602A(16*2)模拟口线接线方式
连接线图: 
---------------------------------------------------
|LCM-----51  | LCM-----51 | LCM-----51    |
-------------------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RS--------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E  --------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
---------------------------------------------------


[注:AT89S51使用12M晶振]
=============================================================*/

#define LCM_RW P2_0 //定义引脚
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#i nclude <at89x51.h>

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);

unsigned char code cdle_net[] = { http://www.cdle.net -www.cdle.net };
unsigned char code email[] = {"pnzwzw@cdle.net"};

void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)

DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
ReadDataLCM();//测试用句无意义
while(1);
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0; 
LCM_E = 0;
LCM_E = 0;
LCM_E = 1; 
}

//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1; 
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF; 
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms(); 
WriteCommandLCM(0x38,0);
Delay5Ms(); 
WriteCommandLCM(0x38,0);
Delay5Ms(); 

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;

ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}

//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
 



--------------------------------------------------------------------------------



 LCD1602的滚动显示

**************************************LCD1602头文件*********************************/ 

#ifndef _LCD1602_H_
#define _LCD1602_H_


//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06   //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04   //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05   //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04   //数据读、写操作,画面不动
#define LCD_GO_HOME               0x02   //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁

//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位

//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
#define LCD_CLEAR_SCREEN  0X01   //清屏

/***********************LCD1602地址相关******************************/

#define LINE1_HEAD    0x80   // 第一行DDRAM起始地址 
#define LINE2_HEAD    0xc0   //  第二行DDRAM起始地址
#define LINE1         0      //第一行
#define LINE2         1      //第二行
#define LINE_LENGTH   16     //每行的最大字符长度

/***********************LCD1602接线引脚定义**************************/

#define LCDIO     P2         //定义P2口与LCD1602的数据口相接
  sbit   LCD_RS=P1^4;         
  sbit   LCD_RW=P1^3;         
  sbit   LCD_EN=P1^2;
  sbit  LCD_BUSY=LCDIO^7;
/**********************另外相关的定*********************************/
#define HIGH               1
#define LOW                0   
#define TURE               1
#define  FALSE             0
#define  uchar unsigned char
#define  uint  unsigned int

/*************************以下是函数的申明部*************************/
void LCD_init(void);                    //LCD1602初始化
void LCD_send_command(uchar command);   //
void LCD_send_data(uchar dat);
void LCD_write_char(uchar x,uchar y,uchar dat);
void LCD_disp_string(uchar x,uchar y,char *Data);
void delay_ms(uint n);
void LCD_check_busy(void);
#endif
/******************************************************************


/#include <reg51.h>
#include "LCD1602.h"
/*******************主函数**********************************/
uchar string[]="     I LOVE YOU! ";            //这里是要显示的字符
void main(void)
{
uchar *cp;
cp=string;
LCD_init();
while(1)
{
  LCD_send_command(LCD_CLEAR_SCREEN);
  delay_ms(2);
  LCD_disp_string(0,1,cp);
  delay_ms(100);
         cp ;
  if(*cp==''\0'')
  {
   cp=string;                 //到达字符的尾部时,改变指针,重新指向字符串的头部
  }
}
}
/*********************************************************/
/**************LCD1602的初始化***************************/
void LCD_init(void)
{
LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
LCD_send_command(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_send_command(LCD_CLEAR_SCREEN);
}
/********************************************************/

void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
{
do
  {
   LCD_EN=0;
   LCD_RS=0;
   LCD_RW=1;
   LCDIO=0xff;
   LCD_EN=1;
   }
   while(LCD_BUSY==1);
  
    LCD_EN=0;
}

/************LCD1602写命令*******************************/
void LCD_send_command(uchar command)
{
LCD_check_busy();
LCD_RS=LOW;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=command;
LCD_EN=LOW;
}
/********************************************************/
/*****************LCD1602写数据**************************/
void LCD_send_data(uchar dat)
{
LCD_check_busy();
LCD_RS=HIGH;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=dat;
LCD_EN=LOW;
}
/********************************************************
void LCD_write_char(uchar x,uchar y,uchar dat)
{
     unsigned char address;
     if (y == LINE1) 
         address = LINE1_HEAD x;
     else 
        address = LINE2_HEAD x;
     LCD_send_command(address); 
    LCD_send_data(dat);
}
******************LCD1602显示字符串*********************/
void LCD_disp_string(uchar x,uchar y,uchar *Data)
{
if(y==LINE1)
{
  if(x<LINE_LENGTH)
  {
   LCD_send_command(LINE1_HEAD x);
   for(;x<LINE_LENGTH&&*Data!=''\0'';x )
   {
    LCD_send_data(*(Data ));
   }
   if(*Data!=''\0'')
   {
    x=0;
    y=LINE2;
   }
  }
}
if(y==LINE2)
{
  LCD_send_command(LINE2_HEAD x);
  for(;x<LINE_LENGTH&&*Data!=''\0'';x )
  {
   LCD_send_data(*(Data ));
  }
}
}
/****************************************************************/
/********************延时函数***********************************/
  
/***************************************************************/
void delay_ms(uint n)
{
uint i,j;
for(i=n;i>0;i--)
    for(j=0;j<1140;j )
    ;
}
/*********************************************************************/ 
 

⌨️ 快捷键说明

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