[DemoCode下载]

M051驱动LCD1602液晶屏程序

[复制链接]
1702|24
手机看帖
扫描二维码
随时随地手机跟帖
500days|  楼主 | 2016-2-27 20:36 | 显示全部楼层 |阅读模式
#include "LCD1602.h"
/***************************************************
*          大量宏定义,便于代码移植和阅读
***************************************************/
#define LCD1602_LINE1        0
#define LCD1602_LINE2        1
#define LCD1602_LINE1_HEAD   0x80
#define LCD1602_LINE2_HEAD   0xC0
#define LCD1602_DATA_MODE    0x38
#define LCD1602_OPEN_SCREEN  0x0C
#define LCD1602_DISP_ADDRESS 0x80
#define LCD1602_RS_PIN   0
#define LCD1602_RW_PIN   1
#define LCD1602_EN_PIN   2
#define LCD1602_RS(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RS_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RS_PIN);}//RS引脚控制
#define LCD1602_RW(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RW_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RW_PIN);}//RW引脚控制
#define LCD1602_EN(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_EN_PIN;else   P0_DOUT&=~(1UL<<LCD1602_EN_PIN);}//EN引脚控制
#define LCD1602_PORT(x)     LS164Send((x))                       //发送数据
/********************************************
*函数名称:LCD1602WriteByte
*输    入:ucByte 要写入的字节
*输    出:无
*说    明:LCD1602 写字节
********************************************/
VOID LCD1602WriteByte(UINT8 ucByte)
{
     LCD1602_PORT(ucByte);
     LCD1602_RS(HIGH);
     LCD1602_RW(LOW);
     LCD1602_EN(LOW);
     Delayus(5000);
     LCD1602_EN(HIGH);
}
/********************************************
*函数名称:LCD1602WriteCommand
*输    入:ucCmd 要写入的命令
*输    出:无
*说    明:LCD1602 写命令
********************************************/
VOID LCD1602WriteCommand(UINT8 ucCmd)
{
     LCD1602_PORT(ucCmd);
     LCD1602_RS(LOW);
     LCD1602_RW(LOW);
     LCD1602_EN(LOW);
     Delayus(5000);
     LCD1602_EN(HIGH);
}
/********************************************
*函数名称:LCD1602SetXY
*输    入:x 横坐标 y 纵坐标
*输    出:无
*说    明:LCD1602 设置坐标
********************************************/
VOID LCD1602SetXY(UINT8 x,UINT8 y)
{
  UINT8 address;
     if(y == LCD1602_LINE1)
     {
        address=LCD1602_LINE1_HEAD+x;
     }
     else
     {
        address=LCD1602_LINE2_HEAD+x;
     }
  LCD1602WriteCommand(address);
}
/********************************************
*函数名称:LCD1602PrintfString
*输    入:x 横坐标 y 纵坐标 s字符串
*输    出:无
*说    明:LCD1602 打印字符串
********************************************/
VOID LCD1602PrintfString(UINT8 x,
                         UINT8 y,
                         UINT8 *s)
{
  LCD1602SetXY(x,y);       //设置显示坐标

     while(s && *s)
     {
        LCD1602WriteByte(*s);     //显示逐个字符
        s++;

     }
}
/********************************************
*函数名称:LCD1602ClearScreen
*输    入:无
*输    出:无
*说    明:LCD1602 清屏
********************************************/
VOID LCD1602ClearScreen(VOID)
{
  LCD1602WriteCommand(0x01);
     Delayus(5000);
}
/********************************************
*函数名称:LCD1602Init
*输    入:无
*输    出:无
*说    明:LCD1602 初始化
********************************************/
VOID LCD1602Init(VOID)
{
     P0_PMD &= ~(3UL<<(LCD1602_RS_PIN<<1));
     P0_PMD &= ~(3UL<<(LCD1602_RW_PIN <<1));
     P0_PMD &= ~(3UL<<(LCD1602_EN_PIN <<1));
  P0_PMD |= 1UL<<(LCD1602_RS_PIN<<1);
  P0_PMD |= 1UL<<(LCD1602_RW_PIN <<1);
  P0_PMD |= 1UL<<(LCD1602_EN_PIN <<1);
  LCD1602ClearScreen();
     LCD1602WriteCommand(LCD1602_DATA_MODE);   //显示模式设置,设置16x2显示,5x7点阵,
                                               //8位数据接口
     LCD1602WriteCommand(LCD1602_OPEN_SCREEN); //开显示
     LCD1602WriteCommand(LCD1602_DISP_ADDRESS);//起始显示地址   
     LCD1602ClearScreen();
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
//     Un_Lock_Reg();        //ISP下载时保护FLASH存储器
PROTECT_REG
(
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
   LS164Init();           //74LS164初始化
   LCD1602Init();           //LCD1602初始化
  )
     LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!");  //打印第一行
  LCD1602PrintfString(0,LCD1602_LINE2,"I Love You!");  //打印第二行

  while(1);
}

小狗爱吃骨头| | 2016-2-28 22:49 | 显示全部楼层
这个lcd1602是串行的吧

使用特权

评论回复
ccw1986| | 2016-3-5 20:35 | 显示全部楼层
这种小的LCD在工业中用的还多吗

使用特权

评论回复
小猫爱吃鱼| | 2016-3-7 14:05 | 显示全部楼层
在主函数当中,为什么还要用到protect_reg啊,为什么要保护呢

使用特权

评论回复
lueluelue| | 2016-3-7 14:42 | 显示全部楼层
怎么还有表情呢

使用特权

评论回复
huahuagg| | 2020-2-17 22:22 | 显示全部楼层
好贴,MARK。

使用特权

评论回复
hxk110| | 2024-4-26 16:07 | 显示全部楼层
LS164Send((x))在哪里能找到?

使用特权

评论回复
yangxiaor520| | 2024-4-26 22:29 | 显示全部楼层
现在还有用LCD1602得嘛

使用特权

评论回复
Undshing| | 2024-4-28 14:44 | 显示全部楼层
用的不怎么多了,占用io太多了

使用特权

评论回复
uptown| | 2024-4-29 11:08 | 显示全部楼层
在初始化LCD1602之前, 延时函数已经准备好,因为LCD1602的命令和数据的写入需要一定的延时。

使用特权

评论回复
youtome| | 2024-4-29 11:56 | 显示全部楼层
在编写驱动程序时,可以参考LCD1602的驱动手册和相关的编程示例

使用特权

评论回复
geraldbetty| | 2024-4-29 12:26 | 显示全部楼层
LCD1602对时序的要求比较严格

使用特权

评论回复
alvpeg| | 2024-5-3 12:01 | 显示全部楼层
数据线的连接通常有4线模式和8线模式。4线模式使用DB4-DB7,而8线模式使用全部DB0-DB7。

使用特权

评论回复
cemaj| | 2024-5-3 13:27 | 显示全部楼层
LCD1602的读写操作需要遵循特定的时序要求,特别是在使能(E)引脚的控制上

使用特权

评论回复
mickit| | 2024-5-6 19:14 | 显示全部楼层
RS引脚用于选择传输数据或命令。当RS引脚为高电平时,进行数据字节传输;当RS引脚为低电平时,进行命令字节传输。

使用特权

评论回复
yorkbarney| | 2024-5-7 10:06 | 显示全部楼层
如果LCD1602模块带有背光,需要注意背光电源的连接和管理

使用特权

评论回复
pl202| | 2024-5-7 15:58 | 显示全部楼层
LCD1602需要一系列初始化命令才能正确配置。这些命令包括使能显示、设置显示模式(例如,显示清零、光标移动到初始位置)、设置显示类型等。

使用特权

评论回复
elsaflower| | 2024-5-7 22:21 | 显示全部楼层
在数据传输方面,需要确保正确地发送字符或命令到LCD1602。通常,这涉及到发送起始位、数据位、和停止位。对于4-bit模式,需要先发送高位(MSB)然后再发送低位(LSB)。

使用特权

评论回复
loutin| | 2024-5-8 15:13 | 显示全部楼层
LCD1602 液晶屏支持 4 位和 8 位数据总线接口。

使用特权

评论回复
yeates333| | 2024-5-8 19:17 | 显示全部楼层
通常,LCD1602需要VSS(接地)、VDD(电源)、VO(对比度调节)、RS(寄存器选择)、RW(读写选择)、E(使能)、D0-D7(数据)等引脚。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

120

帖子

3

粉丝