[DemoCode下载] M051驱动LCD1602液晶屏程序

[复制链接]
2701|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

粉丝
快速回复 在线客服 返回列表 返回顶部