历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2019年10月12日 | 51单片机开发系列之1602字符液晶显示

2019-10-12 来源:eefocus

从51单片机入门,对流水灯有了一定的认识后,就可以进入学习显示类的外设驱动,因为学习时往往需要直接验证、跟踪结果,显示类的外设可以把代码运行情况以非常直观的方式反馈回来。因此,笔者此处首先分析讲解1602字符型液晶的使用。


1. 1602字符型液晶概述

1602字符型液晶能够同时显示16列2行共32个字符信息。其内部已经存储了不同的点阵字符图形,包括阿拉伯数字、英文大小写、常用符号等。每个点阵字符图形都有一个固定的代码,与我们使用的ASCII码是一致的。例如大写英文字母’A’的代码为0x41,只需在需要显示的地址位置写入数据0x41即可显示出字符’A’。可用于一些简单信息交互的设计。


2. 硬件原理图

 

1602需三根控制线,接单片机P2口第5~7位控制线,采用8位并口接P0口。


3. 驱动编写


我们使用51的IO口来模拟1602的M6800总线,在1602.c中我们实现1602的模块功能实现,内容如下:


#include"reg52.h"

#include"1602.h"

#include

// 延时nCount * 50微秒(12M)

// 对于STC 1T 51单片机,延时nCount*50/12微秒

voidDelay_50us(unsigned int nCount)

{

while(nCount--) {

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

}

}

static voidDelay_5us()

{

_nop_();_nop_();_nop_();_nop_();_nop_();

// Proteus需加长以下延时才能仿真

// _nop_();_nop_();_nop_();_nop_();_nop_();

// _nop_();_nop_();_nop_();_nop_();_nop_();

}

static voidLCD_WriteData(unsigned char Dat)

{

LCD_RS_SET(); // 拉高RS

LCD_DATA(Dat); // 输出8位数据

Delay_5us(); // 数据保持时间,约100ns(数据手册)

LCD_EN_SET(); // 拉高EN允许信号

Delay_5us(); // 脉冲保持时间,约450ns(数据手册)

LCD_EN_CLEAR(); // 清除EN允许信号

}

static voidLCD_WriteCommand(unsigned char Dat)

{

LCD_RS_CLEAR(); // 拉低RS

LCD_DATA(Dat);

Delay_5us();

LCD_EN_SET();

Delay_5us();

LCD_EN_CLEAR();

}

unsigned charLCD_DisplayString(unsigned char Address, char *pString)

{

unsigned char i;

unsigned char MaxAddress;

if (pString == (void *)0) {

return 1; // 参数错误,指针为空

}

if (Address >= Line1Addr &&Address < Line1Addr+16) {

MaxAddress = Line1Addr+16; // 地址在1602第一行

} else if (Address >= Line2Addr&& Address < Line2Addr+16) {

MaxAddress = Line2Addr+16; // 地址在1602第二行

} else {

return 2; // LCD显示地址错误

}

LCD_WriteCommand(Address); // 写入显示地址

Delay_50us(1); // 命令处理时间约40us

// 字符串结束或到了显示行的最未地址,结束写显示

for (i=0; Address+i

if (pString[i] == 0) {

break;

}

LCD_WriteData(pString[i]);

Delay_50us(1);

}

return 0;

}

void LCD_Init()

{

LCD_RW_CLEAR();

LCD_EN_CLEAR();

// 8位总线,双行显示5x7的点阵字符

LCD_WriteCommand(0x38);

// 每个命令处理时间约40us(数据手册)

Delay_50us(1);

// 1602开显示,光标不显示

LCD_WriteCommand(0x0C);

Delay_50us(1);

// 光标右移

LCD_WriteCommand(0x06);

Delay_50us(1);

// 清屏,清屏命令处理时间为1.6ms

LCD_WriteCommand(0x01);

Delay_50us(40);

}


我们在模块头文件1602.h中实现模块的接口配置以及一些硬件寄存器的访问宏实现,使之方便移植及修改接口配置。模块头文件同时也引出模块的接口函数,void LCD_Init()用来初始化1602,unsigned char LCD_DisplayString(unsigned char Address, char*pString)用来在指定位置显示字符串信息。其内容如下:

#ifndef __1602_H__

#define __1602_H__

#ifdef __cplusplus

extern "C" {

#endif

sbit LCD_RS = P2^5;

sbit LCD_RW = P2^6;

sbit LCD_EN = P2^7;

#define Line1Addr 0x80 // 1602第一行显示的首地址

#define Line2Addr 0xc0 // 1602第二行显示的首地址

#define LCD_EN_SET() {LCD_EN = 1;}

#define LCD_EN_CLEAR() {LCD_EN = 0;}

#define LCD_RW_SET() {LCD_RW = 1;}

#define LCD_RW_CLEAR() {LCD_RW = 0;}

#define LCD_RS_SET() {LCD_RS = 1;}

#define LCD_RS_CLEAR() {LCD_RS = 0;}

#define LCD_DATA(Dat) {P0 = (Dat);} // P0口输出8位数据

void LCD_Init(void);

unsigned charLCD_DisplayString(unsigned char Address, char *pString);

void Delay_100us(unsigned intnCount);

#ifdef __cplusplus

}

#endif

#endif /*__1602_H__*/

外部模块通过引入1602的模块头文件1602.h来实现调用1602驱动函数,简单测试调用实现如下:

#include "reg52.h"

#include "1602.h"

void main()

{

//需显示的字符串1

codechar String1[] = {

"huang20083200056"

};

//需显示的字符串2

codechar String2[] = {

};

//初始化1602

LCD_Init();

//在第一行首地址开始显示字符串1

LCD_DisplayString(Line1Addr,String1);

//在第二行第二个地址开始显示字符串2

LCD_DisplayString(Line2Addr+1,String2);

while(1);

}


推荐阅读

史海拾趣

Hirosugi-Keiki公司的发展小趣事

对于门控夜明灯电路,网友们可能会有多种问题,以下是一些常见问题及其详细回答:

一、工作原理相关问题

  1. 问:门控夜明灯电路是如何实现自动开关的?
    : 门控夜明灯电路主要通过门控开关、延迟电路、光控电路和电源电路等几部分组成。当门打开时,门控开关触发电路,使电灯点亮。同时,延迟电路控制电灯的点亮时间,一般为几十秒左右。光控电路则确保在光线较暗的环境下(如夜晚)电路才会工作,而在白天则自动封锁电路,避免电灯误亮。

  2. 问:电路中的光控部分是如何工作的?
    : 电路中的光控部分通常由光敏电阻器(如MG45型)和相关的电子元件组成。光敏电阻器的阻值会随着光照强度的变化而变化。在白天,由于光照强度大,光敏电阻器呈现低阻值状态,导致电路中的某个三极管(如VT3)导通,进而封锁整个电路,使电灯不会点亮。而在夜晚,光照强度减弱,光敏电阻器呈现高阻值状态,三极管截止,电路恢复正常工作状态,受门控开关控制。

二、安装调试相关问题

  1. 问:如何安装门控夜明灯电路?
    : 安装门控夜明灯电路时,首先需要将干簧管安装在门框上,将小磁铁安装在门上,并确保两者在门关闭时能够对准并吸合。接着,将电路板固定在合适的位置,并连接好电源线和电灯线。最后,进行电路调试,确保电路能够正常工作。

  2. 问:如何调整电灯的点亮时间?
    : 电灯的点亮时间主要由延迟电路中的电阻和电容决定。要调整点亮时间,可以通过改变电阻(如R2)的阻值或电容(如C1)的容量来实现。一般来说,电阻阻值增大或电容容量增大,都会导致点亮时间延长;反之,则点亮时间缩短。

三、故障排除相关问题

  1. 问:如果电灯不亮,可能是什么原因?
    : 如果电灯不亮,可能是由多种原因造成的。首先,应检查电源是否正常,以及电路中的保险丝是否熔断。其次,检查门控开关是否工作正常,即干簧管和小磁铁是否能够在门打开时正确触发电路。此外,还应检查光控电路是否因光线过强而处于封锁状态。最后,检查电灯本身是否损坏。

  2. 问:电灯在白天也会亮,怎么办?
    : 如果电灯在白天也会亮,可能是光控电路出现了问题。首先,应检查光敏电阻器是否损坏或受到其他光源的干扰。其次,检查与光敏电阻器相关的电子元件(如VT3)是否工作正常。如果问题依然存在,可能需要重新调整光控电路的灵敏度或更换相关元件。

四、其他相关问题

  1. 问:门控夜明灯电路适用于哪些场合?
    : 门控夜明灯电路适用于需要自动照明的各种场合,如家庭玄关、走廊、楼梯间等。它能够在人们进门时自动点亮电灯,为人们提供方便,同时也能够节省能源。

  2. 问:如何选择合适的电灯与电路匹配?
    : 在选择电灯与电路匹配时,首先需要考虑电灯的功率和类型。由于门控夜明灯电路通常设计为低功耗电路,因此建议选择功率较小、发光效率较高的电灯,如LED灯泡。此外,还需要确保电灯的电压和电流与电路的输出相匹配,以避免电路损坏或电灯烧毁。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

Chen Yang Technologies最初是一家专注于半导体芯片研发的小型公司。在某个关键时期,公司成功研发出了一种低功耗、高性能的芯片技术,这一技术突破立即引起了市场的广泛关注。凭借这一技术,Chen Yang Technologies迅速扩大了其产品线,并开始向全球范围内的电子设备制造商供应芯片。随着市场份额的逐步增长,公司逐渐在电子行业中建立了自己的地位。

辉芒微(FMD)公司的发展小趣事

在EEPROM芯片取得成功之后,辉芒微并未停下脚步。2007年,公司成功量产推出PMIC(电源管理芯片),进一步丰富了产品线。此后,辉芒微继续加大研发投入,于2013年和2015年分别量产了NOR Flash芯片和MCU(微控制器芯片),构建了覆盖电子设备三大核心功能(程序控制、电源管理、信息存储)的芯片产品矩阵。这一系列的技术创新和产品线扩展,使得辉芒微在电子行业中的影响力不断提升。

GREEGOO公司的发展小趣事
时钟信号线应远离一般信号线,避免并行走线以减少耦合干扰。
Hong Kong X'Tals Ltd公司的发展小趣事
确保电源电压在LM122的允许范围内(4.5~40V),以避免损坏芯片。
American Technical Ceramics (ATC)公司的发展小趣事
选择合适的电阻和电容,以确保定时精度和电路稳定性。同时,注意元件的温漂和老化对定时时间的影响。

问答坊 | AI 解惑

便携式串口调试助手,大小仅5KB

[url=http://www.cinzy.com/soft/COMdbg.rar]便携串口调试助手 精品[/url] 软件名称:COMdbg 版本 0.2 RC 更新日期:2008/5/20 大小:5.21K 简介: 串口调试软件中的一员,不同的是此版本纯API编写,运行高效稳定,只有5K,体系非常小巧,功能强大,非常值 ...…

查看全部问答>

无线收发模块电赛资料

电赛 马上就要开始了我这里为大家收集了关于无线发射模块的资料 希望对大家有帮助…

查看全部问答>

上海交大:我国汽车电子产业发展的技术障碍与攻关战略

演讲主题:我国汽车电子产业发展的技术障碍与攻关战略 演讲嘉宾:上海交通大学 许敏 主要议题: 1、我国汽车电子的产业发展与研发现状 2、我国汽车电子产业发展的技术障碍 3、我国汽车电子产业发展的攻关战略 重点论述了我国汽车电子产 ...…

查看全部问答>

请问如何用单片机模拟SPI来访问SD卡阿????????

我网上看了很多程序,都不可以,像看看怎么样能模拟访问,…

查看全部问答>

刚才看一网友做的频率计有句代码不解

if(flag_1s==1) { tmp=T0count*65536+TH0*256+TL0 } 一秒计数的脉冲为何是tmp=T0count*65536+TH0*256+TL0,不是每次中断都T0count++?…

查看全部问答>

请问各位大侠,我需要一些用C实现的关于Wi-Fi数据传输的指导。请赐教。

我是新手 ,请大侠们赐教,使用Wi-Fi传输到底是个什么样的过程,怎么用C实现啊?比如说,我现在电脑上有一些视频文件,需要传输到另外一个电脑上,怎么用C实现?谢谢。…

查看全部问答>

初学arm问问题-关于异常返回时的问题

--------ARM异常发生时和ARM异常返回时做的工作---------         A:异常发生时,ARM微处理器执行的步骤                 1>        将下一 ...…

查看全部问答>

弄了个视频采集板。要是LM3S开发板申请成功就试试

LM3S板子申请了有段时间了,自己想做数据采集远程传输,现在也不知道板子能申请成功吗,先弄了个图像采集板,采用了应用广泛的SAA7113和SAA7121芯片,实现视频信号的采集和输出。输入输出接口采用通用的AV接口。     提供Video  ...…

查看全部问答>

NRF2401的DR1脚莫名其妙的高电平,高手请赐教

我用的MSP430与NRF2401做无线通信,问题是我没有发送信号,但是一把程序烧写进去就会出现DR1高电平。请高手看看 QQ:12676363.  怀疑是Receiveshock的问题。。 #include //2010.10.31 #define uchar unsigned char #define uint unsig ...…

查看全部问答>

Stratix IV官方中文手册(部分重要章节)

Altera发布了Stratix IV的中文手册,目前只翻译了部分章节,先传上来跟大家分享了。…

查看全部问答>