发 帖  
用单片机开发可靠的嵌入式产品之字符型LCD
2018-7-13 01:37:12  145 单片机 嵌入式
收藏 0 收藏 推荐 0 推荐
分享
在电子产品的开发中,越来越多的人机显示界面采用LCD。LCD以其显示内容丰富、显示画面效果好、功率消耗小等优点,越来越受到嵌入开发工程师的喜爱。本章我们以字符型LCD1602为例来讲解LCD的使用。
  本模块采用的1602为长沙太阳人的液晶显示模块,所用控制器为日立公司的HD4478,所以本章我讨论的内容适合于任何基于HD44780所做的LCD。
  HD44780的特性:
  1、控制包含多达80个字符的LCD模块
  2、显示ASCII码字符集
  3、允许用户定义8个基于5×7点阵的符号
  4、显示条状图
液晶显示器
液晶显示器是一种被动显示技术。这就是说LCD本身不会发光,而是利用周围的光。通过利用这些光,LCD可以利用非常低的能源来显示图像。控制使用LCD总是需要一些诀窍。LCD几乎是用专门的硬件来控制的。目前,常用的LCD主要有三种:
  1、用单独的段控制定制显示。(与LED数码管相类似,使用方法也和数码管类似)
  2、字母数字或者字符显示。(我们今天讨论的1602就是这样的模块)
  3、全图显示。(我们常用的电脑的LCD就是这样的显示方式)

字符LCD模块
  一个字符模块包含了LCD和驱动显示电子。字符显示由1-4行组成,每行有16-40个字符块。每一个字符块包含了一个5×8的点阵,该点阵可用来显示任何ASCII码字符和一定数目的符号。本章给字符显示模块提供了一个软件接口模块。字符模块正在大量应用到嵌入式系统中。如:空调、传真机、打印机、医疗设备、安全系统、电话等。

硬件连接:
  通常我们使用一个MCU来使用LCD模块,它和LCD模块的连接方式如下图所示:

  HD44780需要花费一定的时间来处理发送给它的数据或者命令,HD44780的数据手册中给出了所需要的时间,正是基于这个原因,本模块在发送一个命令或者数据后,在发送下一个命令或者数据之前,至少需要等待指定的时间。注意:HD44780本身允许微处理器读忙(BUSY)状态。处理器应该读出该状态以便确定HD44780是否准备接收另一个命令或者更多的数据。如果能够的话,应该使用HD44780的这个功能。然而,如果接口出现故障,应提供一个超时机制来避免程序进入死循环。
  HD44780的数据总线和命令总线是共用的。所以需要使用一根线来区分当前所发送的内容是什么,这根线就是D/I。当此线为高电平时,表示本次发送的数据是数据,低电平表示本次发送的数据是命令。E信号为时钟信号,此信号由低到高的一个跳变把数据发送出去。R./W信号表示本次的操作是读还是写。高电平表示你读,低电平表示写。读操作主要用来判断LCD的忙状态。这里我们使用延时来代替,所以就把此信号线接地了。
程序的流程图
  目的:在屏幕上第1行显示“www.edu118.com”,第二行显示“86629510”。

初始化LCD过程;
写指令38H:显示模式设置第一次
延时3ms
写指令38H:显示模式设置第二次
延时3ms
写指令38H:显示模式设置第三次
延时3ms
写指令38H:显示模式设置第四次
延时3ms
写指令08H:显示关闭
写指令01H:显示清屏
延时3ms
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置

  从上面的过程我们可以看出,初始化的时候主要是通过总线向1602发送命令,在这里我们写发送命令的功能函数:
void SendCommand(unsigned char com)
{
        delay(50); //延时一段时间,等待上一个命令处理完毕
        DI = 0; //命令
        RW = 0; //写操作
        P0 = com; //发送命令码
        E = 0;
        delay(1);
        E = 1; //E信号的一个上升沿把数据发送出去
}

显示字符串函数
void LCD_DispStr(char *pstr,unsigned char length,unsigned char Line)
{
        unsigned char i;

        if(Line == 1)
        {
            SendCommand(LCD_1602_Line1);
        }
        else
        {
            SendCommand(LCD_1602_Line2);
        }


        for(i=0;i<length;i++)
        {
            SendData(*(pstr+i));
        }
}

发送一字节数据的函数
void SendData(unsigned char Data)
{
    delay(50);
    DI=1;
    RW=0;
    P0=Data;
    E=0;
    delay(1);
    E=1;
}
2018-7-13 01:37:12   评论

只有小组成员才能发言,加入小组>>

268个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

电路设计论坛

电子元器件论坛

传感技术

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

Orcad论坛

-

综合技术与应用

电机控制

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

物联网技术

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

高校联盟

深圳大学电子协会

西藏民族学院电子设计协会

西安电子科技大学西电实验室

桂林电子科技大学机电工程协会

鉴鹰电子科技协会

广东海洋大学科技创新协会

福建农林大学电子科技创新协会

湖北理工学院电子技术协会

深圳职业技术学院电子精英训练营

浙江科技学院Zuster

湘潭大学电子科技协会

青岛理工大学琴岛学院天宏开发团队

河南理工大学大学生电器开发部

广西科技大学电气信息创新协会

浙江机电职业技术学院电子制作协会

郑州大学西亚斯国际学院爱电工作室

新乡学院电子创新工作室

洛阳理工学院SmartTeam

苏州工业职业技术学院创新工作室

浙江工业大学GC315团队

杭电-微芯大学生科技创新孵化器

西安工业大学电信科协

商洛学院科技创新协会

大连民族学院创新工作室

南京信息工程大学帆木工作室

-

供求信息发布

方案交易

供需广告

芯片求购|供应发布区