设计与开发

单片机1602显示程序 1602液晶屏的显示

小编 2024-11-25 设计与开发 23 0

1602液晶屏的显示

1、1602字符型液晶又名1602液晶,是专门显示字母、数字、符号等的点阵型液晶模块。能够显示16x02即32个字符,即02行,16列。

2、1602液晶分为上下两行各16位显示,处于不同行时的字符显示地址如下

3、1602引脚图如下

  1脚:VSS接5V电源"-";

  2脚:VDD接5V电源"+";

  3脚:VO为对比度调整;VO是偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/RM063蓝白可调电阻。

  4脚:RS为数据/指令寄存器选择位,RS=1时选择数据寄存器、RS=0时选择指令寄存器;

  5脚:R/W为读写信号线,R/W=1时进行读操作,R/W=0时进行写操作。当RS=0和RW=0时写入指令或者显示地址,当RS=0、RW=1时可以读忙信号,当RS=1、RW=0时可以写入数据;

  6脚:E端为使能端,下降沿有效;

  7~14脚:D0~D7为8位双向数据线;

  15脚:背光电源正极;

16脚:背光电源负极。

4、1602带有字库,只能显示字库中的字符,字符库如下图

5、指令表

1、 电路图

2、 程序设计

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit rs=P3^0;

sbit rw=P3^1;

sbit e=P3^2;

uchar code a[]="Welcome to JiDian142 Class!+_%$#@";

void delayu(uint u)

{

while(u--);

}

void delaym(uint m)

{

uchar i;

while(m--)

for(i=0;i<120;i++);

}

void zhiling(uchar com)

{

delayu(60);

rs=0;

rw=0;

P2=com;

e=1;

delaym(1);

e=0;

}

void shuju(uchar dat)

{

delayu(60);

rs=1;

rw=0;

P2=dat;

e=1;

delaym(1);

e=0;

}

void init()

{

zhiling(0x38);delaym(1);

zhiling(0x06);delaym(1);

zhiling(0x01);delaym(1);

zhiling(0x0c);delaym(1);

}

void main()

{

uchar i;

init();

zhiling(0x80);

for(i=0;i<16;i++)

{

shuju(a[i]);

}

zhiling(0x80+0x40);

for(i=16;i<32;i++)

{

shuju(a[i]);

}

while(1);

}

3、 下载程序并调试

另外,如果1602不显示,可从以下找原因。

1)、首先检查电路图是否画对,如果你的数据口用的是P0口,别忘记加上排阻。

2、检查仿真软件中的引脚接法是否与程序中的引脚一一相对应,如果不对应结果肯定出不来的。

3、最有可能出错的地方便是程序了。而程序当中可能出错的地方我碰到过几处。void write_com(uchar com)和void write_dat(uchar date)子程序中的延时函数delayus(60),时间过长或者过短都有可能显示不出来;void init()中的几个必备的指令使用不当也会导致无法显示;其他的原因一般都是小问题了,基本都能解决了。

51单片机学习25-1602液晶显示自定义图形

这篇写液晶1602显示自定义图形,显示2个简单汉字

第一行第六个显示---日

第二行第七个显示---月 作为举例,方便大家在特定位置显示特定汉字或图形

仿真图:

这里需要用到一个取模软件:

1 先选8*8的大小

2 放大图形

3.参数设置

4 取特定图形 需要注意的是左边3列不要用到。然后根据需要取模

程序:

程序内容比较多,详细参考源代码

源代码:

#include<reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //短延时

sbit LCD_RS = P2^0;

sbit LCD_RW = P2^1;

sbit LCD_EN = P2^2;

//自定义字符

uchar code mytab1[8] = {0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,};//日

uchar code mytab2[8] = {0x0F,0x09,0x0F,0x09,0x0F,0x09,0x0B,0x19,}; //月

void delay1(int ms) //带参数ms级延时函数

{

unsigned char y;

while(ms--)

{

for(y = 0; y<250; y++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

/******************************************************************/

/*检查LCD忙状态 */

/*lcd_busy = 1,忙,等待,lcd_busy = 0,空闲 */

/******************************************************************/

bit lcd_busy() //忙检测

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0&0x80);

LCD_EN = 0;

return(result);

}

/******************************************************************/

/*写指令到LCD */

/*RS=L,RW=L,E=高,D0-D7=指令码 */

/******************************************************************/

void lcd_wcmd(uchar cmd)

{

while(lcd_busy());

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

_nop_();

_nop_();

P0 = cmd;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/******************************************************************/

/*写数据到LCD */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据 */

/******************************************************************/

void lcd_wdat(uchar dat)

{

while(lcd_busy());

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/******************************************************************/

/* 写字符串到LCD */

/******************************************************************/

void write_str(uchar addr,uchar *p)

{

uchar i=0;

lcd_wcmd(addr);

while(p[i]!='\0')

{

lcd_wdat(p[i]);

i++;

}

}

/*********************************************************/

/* 设定显示位置 */

/*********************************************************/

void write_position(uchar row,uchar col)

{

uchar place;

if(row==1) //第一行

{

place=0x80+col-1; //位置

lcd_wcmd(place);

}

else

{

place=0xc0+col-1;

lcd_wcmd(place);

}

}

/*********************************************************/

/*自定义字符写入CGRAM */

/*********************************************************/

void writetab1()

{

unsigned char i;

lcd_wcmd(0x40); //设定CGRAM地址

for (i = 0; i< 8; i++)

lcd_wdat(mytab1[i]);

}

void writetab2()

{

unsigned char i;

lcd_wcmd(0x48); //设定CGRAM地址

for (i = 0; i< 8; i++)

lcd_wdat(mytab2[i]);

}

/******************************************************************/

/* LCD初始化 */

/******************************************************************/

void init_lcd()

{

delay1(15); //延时15ms

lcd_wcmd(0x01); //清屏

lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据

delay1(5); //延时5ms

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c); //显示开,关光标

delay1(5);

lcd_wcmd(0x06); //移动光标

delay1(5);

lcd_wcmd(0x01); //清屏

delay1(5);

}

/*

0x00:第一个(0x40) 0x01:第二个(0x48)

0x02:第三个(0x50) 0x03:第四个(0x58)

0x04:第五个(0x60) 0x05:第六个(0x68)

0x06:第七个(0x70) 0x07:第八个(0x78)

第一行第一个位置的地址是0x80,第二行一个位置的地址是0xC0

要求 第一行第六个显示日

第二行第七个显示月

*/

void main()

{

init_lcd();

while(1)

{

//显示日

writetab1(); //第一个自定义字符的内容

write_position(1,6); //指定显示位置

lcd_wdat(0x00); //显示内容

//显示月

writetab2(); //第2个自定义字符的内容

write_position(2,7);

lcd_wdat(0x01);

}

仿真结果:

相关问答

单片机1602 液晶怎样移屏?怎么设置光标闪烁?谁有没有这样的C...

单片机1602液晶怎样移屏?怎么设置光标闪烁?谁有没有这样的C程序?监视器讨论回答(5)#include#defineucharunsignedcha...

1602 液晶显示 单片机 为何屏幕亮但不 显示 数字-ZOL问答

根据我试验的结果,1602的3脚通过470~510欧左右的电阻接地就能得到最佳对比度了。现在新型的1602还不需要接电阻。电位器用来调节对比度,保证显示清晰,若不用电...

为什么 单片机 都选择LCD 1602 ?

因为LCD1602是学单片机时最简单的入门方式。1602液晶显示屏可以显示两行,每行16个字符。1602液晶显示屏操作不复杂,总线接口简单,使用几个IO口就可以了。很...

lcd 1602单片机 焊接方法?

第一步:检查集成块芯片的管脚。有无变型,如有变型,要用针把管脚拨正。要耐心点,差不多可不行,一定要拨正。再顺便检查一下电路板,焊盘是否有短路的。第二...

51 单片机 温感报警器原理?

本设计由STC89C52单片机电路+数字温度传感器DS18B20电路+按键电路+蜂鸣器报警电路+继电器控制电路+LCD1602液晶显示电路+电源电路组成。1、LCD1602液晶实时显...

lcd 1602 e脚接 单片机 哪里?

1.LCD1602E脚接单片机的位置是在单片机的IO口上。2.这是因为LCD1602E是一种液晶显示屏,需要通过单片机的IO口来控制和传输数据。通过将LCD1602E的引脚与单片...

通过按键来控制 单片机 的制冷和加热?

通过按键来控制单片机可实现LCD1602显示当前温度,可通过按键设置温度上下限温度超过限值制冷或制热,并通过蜂鸣器。报警STC89C52单片机为核心控制器,加上其...

如何将数码管与LCD同时接入 单片机 ,我想做一个999秒的倒计时,同时用LCD 显示 我的英文名字?

用个引脚比较多的单片机就可以了。比如STC89C52等等。数码管用扫描方式,LCD如果用1602就直接写,也不会占用单片机多少时间。用个引脚比较多的单片机就可以了...

lcd 1602显示 温度需要中断吗?

不需要此系统主要由AT89C51、DS18B20温度模块、LCD1602、喇叭组成。大致的原理是DS18B20温度采集到的数据传送给AT89C51的P3.4,最后通过LCD1602显示当前的实...

淄博舜意电气有限公司手机锁屏时 显示 模拟时钟的办法是什么?...

本文档介绍了LCD1602实时显示时钟的各种硬件设计和软件设计,有兴趣的话可以下载。基于51单片机用C程序编程实现一个简易时钟,该时钟能在LCD1602液晶...

猜你喜欢