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

📄 lcd1602_8.c

📁 LCD1602的4位和8位并行传输程序
💻 C
字号:
/*==============================================================
2007-8-7
SMC1602A(16*2)模拟口线接线方式

连接线图:
---------------------------------------------------
|LCD-----51   | LCD-----51   | LCD------51 |
---------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
|DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
|DB2-----P0.2 | DB6-----P0.6 | EN-------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接10欧左右电阻到GND|
---------------------------------------------------

[注:AT89S51使用12M晶振]
=============================================================*/
#include <reg51.h>

#define ustring unsigned char code
#define uchar unsigned char
#define uint unsigned int

sbit LCD_RS = P2^0;              //定义引脚
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;

#define LCD_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

//---------------------------函数申明------------------------
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(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);


ustring uctech[] = {"4788 9ab!*\n"};
ustring net[] = {" ucte.icp cn\n"};

uchar CHR[] = {'0','1','2','3','4','5','6','7','8'
                    ,'9','a','b','c','d','e','f','.'};
//--------------------主程序---------------------
void main(void)
{

   Delay400Ms(); //启动等待,等LCD讲入工作状态
   LCDInit(); //LCD初始化
   Delay5Ms(); //延时片刻(可不要)
   DisplayListChar(0, 0,uctech);
   //DisplayOneChar(5, 0, CHR[11]);
   //DisplayOneChar(0, 0, c);
   DisplayListChar(0, 1, net);
  // ReadDataLCD();//测试用句无意义,没有复位后不带保持
   while(1);
}


//--------------------写数据---------------------
void WriteDataLCD(uchar WDLCD)
{
   ReadStatusLCD(); //检测忙
   LCD_Data = WDLCD;
   LCD_RS = 1;
   LCD_RW = 0;
   LCD_EN = 0; //若晶振速度太高可以在这后加小的延时
   LCD_EN = 0; //延时
   LCD_EN = 1;
}

//--------------------写指令----------------------
void WriteCommandLCD(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测
{
   if (BuysC) ReadStatusLCD(); //根据需要检测忙
   LCD_Data = WCLCD;
   LCD_RS = 0;
   LCD_RW = 0;
   LCD_EN = 0;
   LCD_EN = 0;
   LCD_EN = 1;
}

//--------------------读数据----------------------
uchar ReadDataLCD(void)
{
   LCD_RS = 1;
   LCD_RW = 1;
   LCD_EN = 0;
   LCD_EN = 0;
   LCD_EN = 1;
   return(LCD_Data);
}

//--------------------读状态----------------------
uchar ReadStatusLCD(void)
{
   LCD_Data = 0xFF;
   LCD_RS = 0;
   LCD_RW = 1;
   LCD_EN = 0;
   LCD_EN = 0;
   LCD_EN = 1;
   while (LCD_Data & Busy); //检测忙信号
   return(LCD_Data);
}

//-------------------LCD初始化---------------------- ??????????
void LCDInit(void)
{
   LCD_Data = 0;
   WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
   Delay5Ms();
   WriteCommandLCD(0x38,0);
   Delay5Ms();
   WriteCommandLCD(0x38,0);
   Delay5Ms();
   WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
   WriteCommandLCD(0x08,1); //关闭显示
   WriteCommandLCD(0x01,1); //显示清屏
   WriteCommandLCD(0x06,1); // 显示光标移动设置
   WriteCommandLCD(0x0C,1); // 显示开及光标设置
}

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

//---------------------按指定位置显示一串字符---------------------------
void DisplayListChar(uchar X, uchar Y, ustring *DData)
{
   uchar ListLength;
   ListLength = 0;
   Y &= 0x1;
   X &= 0xF; //限制X不能大于15,Y不能大于1
   //while (DData[ListLength]>=0x20) //若到达字串尾则退出
   while (DData[ListLength]!='\n')
   {
     if (X <= 0xF) //X坐标应小于0xF
     {
        DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
        ListLength ++;
        if(ListLength>0xf) break;
        X ++;
     }
   }
}

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

//---------------------------------400ms延时----------------------------
void Delay400Ms(void)
{
   uchar TempCycA = 5;
   uint TempCycB;
   while(TempCycA--)
   {
     TempCycB=7269;
     while(TempCycB--);
   };
}

⌨️ 快捷键说明

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