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
根据我试验的结果,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液晶...