我在学单片机但是不会打开1602的液晶,求大神帮忙编下程序,资料如下,不够再发,最好是C语音的,

我在学单片机但是不会打开1602的液晶,求大神帮忙编下程序,资料如下,不够再发,最好是C语音的,,第1张

/
程序作者:yuki1406
程序作用:STC89CXX的1602液晶8BIT *** 作模式 测试环境MCU:STC89C51RC 晶振频率110592MHZ 以及外部晶振24MHZ加1倍频到48M测试正常
编写时间:2012年07月17日
结束时间:2012年07月17日
程序版本:V11
使用说名:

先调用初始化
然后检测忙状态
写入地址
检测忙状态
写入数据
while(LCD1602_readway()); 忙状态检测
器件说明:
显示容量:162个字符
芯片工作电压:45-55v
工作电流:2MA(50v)
模块最佳工作电压:5V
字符尺寸:295x435(WXH)mm
接口信号说明
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 DATA 1/0
2 VDD 电源正极 10 D3 DATA 1/0
3 VL 液晶显示偏压信号 11 D4 DATA 1/0
4 RS 数据/命令选择端(H/L) 12 D5 DATA 1/0
5 R/W 读/写选择端(H/L) 13 D6 DATA 1/0
6 E 使能信号 14 D7 DATA 1/0
7 D0 DATA 1/0 15 BLA 背光源正极
8 D1 DATA 1/0 16 BLK 背光源负极
基本 *** 作时序:
11读状态:输入:RS=L,RE=H,E=H 输出:D0-D7=状态字
12写状态:输入:RS=L,RE=L,D0-D7=指令码,E=高脉冲 输出:无
13读数据:输入:RS=H,RE=H,E=H 输出:D0-D7=数据
14写数据:输入:RS=H,RE=L,D0-D7=数据,E=高脉冲 输出:无
指令说明
初始化设置
11显示模式设置
指令码 功能
00111000 设置16x2显示 5x7点阵 8位数据接口
显示开/关及光标设置
指令码 功能
00001DCB D=1开显示: D=0 关显示
C=1显示光标:C=0 不显示光标
B=1光标显示:B=0光标不显示
000001NS N=1当读或写一个字符后地址指针加一,且光标加一
N=0当读或写一个字符后地址指针剪一,且光标减一
S=1当写一个字符,整平显示左移(N=1)
或右移(N=0),以得到光标不移动而屏幕移动的效果。
S=0当写一个字符,整屏显示不移动

程序大小:108字节
更新时间:
发现每次写入时 都手动调用读忙函数 很麻烦 把读忙函数加到了写入函数内
更新版本:无
更新日志:无
/
#ifndef __LCD_1602_8BIT_H__
#define __LCD_1602_8BIT_H__
#include<stc89h> //包含单片机寄存器的头文件
//#include<intrinsh> //包含NOP空指令的头文件
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_H 1 //宏定义手册中出现的H的定义
#define LCD1602_L 0 //宏定义手册中出现的L的定义
#define LCD1602_DAT 1 //数据
#define LCD1602_COM 0 //命令
#define LCD_15MS 300 //宏定义15MS延时需要的数值
#define LCD_5MS 100 //宏定义 5MS延时需要的数值
/显示模式指令/
#define LCD_Display_mode 0X38 //设置16x2显示 5x7点阵 8位数据接口
/显示开/关及光标设置/
#define LCD_shows0 0X0C //开显示 不显示光标 光标不闪烁
#define LCD_shows2 0X0E //开显示 显示光标 光标不闪烁
#define LCD_shows1 0X0F //开显示 显示光标 光标 闪烁
#define LCD_shows3 0X08 //关显示 不显示光标 光标不闪烁
/指针设置/
#define LCD_cursor1 0X04 //写一个字符 地址指针减1
#define LCD_cursor2 0X05 //写一个字符 地址指针减1 并屏幕右移
#define LCD_cursor3 0X06 //写一个字符 地址指针加1
#define LCD_cursor4 0X07 //写一个字符 地址指针加1 并屏幕左移
/清屏指令/
#define LCD_clear 0x01 //清屏指令 数据指针清零 所有显示清零
/忙状态字/
#define LCD_WAY 0x80 //状态字
/宏定义显示起始地址/
#define LCD_ADDH 0X80 //第一行地址0x80-0xA7
#define LCD_ADDL 0XC0 //第二行地址0xC0-0xE7
/IO口定义/
#define LCD1602_DATA P0 //宏定义8位数据线IO为P0口 D0~D7=P00~P07 8位数据线 D0=P00;
sbit LCD1602_RS=P2^5; //数据/命令选择端(H/L)
sbit LCD1602_RW=P2^6; //读/写选择端(H/L)
sbit LCD1602_E =P2^7; //使能信号
/函数声明/
void LCD1602_init(); //液晶初始化函数
void LCD1602_writecd(bit lcd_rs, uchar LCD1602_d);//写命令/数据 函数bit lcd_rs是数据还是命令 uchar LCD1602_d要写入的数据
uchar LCD1602_readway(); //读忙状态函数 由写入和读取函数调用
uchar LCD1602_readata(); //读数据函数
void LCD_DELAY(uchar LCD_delay); //
/液晶初始化函数/
void LCD1602_init() //液晶初始化函数
{ LCD_DELAY(LCD_15MS); //延时15MS 初始化
LCD1602_writecd(LCD1602_COM,LCD_Display_mode);//写指令38H 设置16x2显示 5x7点阵 8位数据接口
LCD1602_writecd(LCD1602_COM,LCD_shows0); //开显示 不显示光标 光标不闪烁
LCD1602_writecd(LCD1602_COM,LCD_cursor1); //检查忙状态
LCD1602_writecd(LCD1602_COM,LCD_clear); //写指令01H:显示清屏
}
/液晶写命令/数据函数/
void LCD1602_writecd(bit lcd_rs, uchar LCD1602_cd)//写命令/数据 函数
{ uchar LCD1602_NUM; //定义变量用来液晶无忙回答的退出死循环
LCD1602_NUM=255; //忙状态检测次数
while(LCD1602_readway()) //检查忙状态
{LCD1602_NUM--; //检测次数自减
if(LCD1602_NUM==0) //判断检测次数等于0
{break;} //退出循环判断忙
}
LCD1602_RW = LCD1602_L; //读/写选择端(H/L)
LCD1602_RS = lcd_rs; //数据/命令选择端(H/L)
LCD1602_DATA= LCD1602_cd; //IO口赋值
LCD1602_E = LCD1602_H; //拉高使能信号开始传输数据
LCD1602_E = LCD1602_L; //拉低使能信号锁存数据
LCD1602_DATA= 0xff; //IO口数据清除
}
/忙状态读取函数/
uchar LCD1602_readway()//读状态函数 由写入和读取函数调用
{ uchar LCD1602_way; //状态字变量
LCD1602_DATA=0xff; //IO口数据清除
LCD1602_RS = LCD1602_COM; //数据/命令选择端(H/L) 命令
LCD1602_RW = LCD1602_H; //读/写选择端(H/L)
LCD1602_E = LCD1602_H; //拉高使能信号开始接收状态
LCD1602_way = LCD1602_DATA; //读取状态
LCD1602_E = LCD1602_L; //拉低使能信号锁存数据
LCD1602_way = LCD1602_way&LCD_WAY;//取忙状态字
return(LCD1602_way); //返回状态字
}
/液晶读数据函数/
uchar LCD1602_readata()//读数据函数
{ uchar LCD1602_data; //数据暂存变量
while(LCD1602_readway()); //检查忙状态 --------------------
LCD1602_DATA=0xff; //IO口数据清除
LCD1602_RS = LCD1602_DAT; //数据/命令选择端(H/L) 数据
LCD1602_RW = LCD1602_H; //读/写选择端(H/L)
LCD1602_E = LCD1602_H; //拉高使能信号开始接收状态
LCD1602_data= LCD1602_DATA; //读取状态
LCD1602_E = LCD1602_L; //拉低使能信号锁存数据
return(LCD1602_data); //返回数据
}
/延时函数/
void LCD_DELAY(uchar LCD_delay)//
{ uchar lcd_del;
while(LCD_delay--) //自减
{lcd_del=100;
while(lcd_del--);}
}

我写的 参考下吧 只写了驱动 此程序不会显示任何东西 调用初始化 会看到显示屏 清屏的效果

字符总线是LCD通过一个个像素点,要在LCD上显示一个字符,需要以下两步:
① 占据屏幕上的一块地方,大小由字体大小说了算;
② 在占据的地方上依次控制每个像素点是否显示。
比如中文字符24×24字体大小表示水平需要24个像素点、垂直需要24个像素点。
在这块24×24的地盘上,每个像素点是否显示由字模说了算,字模中的每1位数据表示一个像素点,如果该位为0则表示此处像素点不显示、为1则表示显示(阴码规则)。
所以,字符显示的函数只需要基于打点函数实现即可。在程序中逐位读取字模,如果该位为0则该点写入背景颜色,如果该位为1则写入前景颜色。

先利用电压互感器将市电高压降为低压,此时是电流信号经过一放大器转换为电压信号,此时依然是交流信号;然后再经过一芯片转换成有效值直流信号,由于此时信号比较小,再需要经过放大器放大,接入AD芯片,将模拟信号数字化(量化),最后接入单片机系统完成数据的处理与显示。 电压互感器选择DXPT202,结合武汉市场与性能价格比后确定的。通过DXPT202在限流电阻下取得2mA电流。然后通过OP07进行电流到电压的转换,由于考虑到后续器件的性能,这里转换来的电压信号要控制在200mV下,通过一较小电阻(小于100Ω,这里采用的是91Ω的精密电阻)即可满足要求。再通过AD736JN集成芯片前级经过OP07转换而来的交流电压信号转换成真有效值直流信号以便于模数转换。再一次将AD736JN的输出直流信号放大,由于AD736JN的输出电压信号小于200mV,不适宜模数转换。采用常用的ADC0809把OP07转换而来的模拟电压信号进行A/D转换。最后将ADC0809转换而来的数字信号送入AT89S51单片机处理并驱动LCD模块(1602)显示。

1,lcd1602工作原理是什么?
线段的显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。
字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
汉字的显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。
2,lcd1602工作原理-lcd1602的基本参数

显示容量:16×2个字符
芯片工作电压:45—55V
工作电流:20mA(50V)
模块最佳工作电压:50V
字符尺寸:295×435(W×H)mm
3,lcd1602工作原理-lcd1602与单片机连接电路图
lcd1602液晶显示模块可以只用D4-D7作为四位数据分两次传送。这样的话,可以节省MCU的I/O口资源。lcd1602可以显示2行16个字符,有8为数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。
lcd1602液晶显示模块可以和单片机AT89C51直接接口,电路连接简单,如图1所示:

lcd1602和51单片机的连接图

lcd1602和51单片机的连接图

其中图中的JPBG直接接电源,第3引脚的可调电位器的两端一定要连接电源和地。P20,P21,P22分别是RS,R/W和E三个控制位,P00-P07是8位数据线。三个控制位详见说明,RS=0表示写或读指令,RS=1表示写数据。R/W是读写指令,R/W=1是读,R/W=0是写。E是使能端,要根据时序图去写对应的程序。

lcd1602和AT89S52单片机的连接图

此电路中,上拉电阻用47K的,液晶的3脚用一个10K可调电阻接地,调节液晶亮度。
4,lcd1602工作原理-lcd1602引脚图与引脚定义
lcd1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。


1602采用标准的16脚接口,
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读 *** 作,低电平(0)时进行写 *** 作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
5,lcd1602工作原理-读写 *** 作指令编程表
各种液晶厂家均有提供几乎都是同样规格的lcd1602 模块或兼容模块,尽管各厂家的对其各自的产品命名不尽相同;但其最初采用的LCD 控制器采用的是HD44780,在各厂家生产的1602 模块当中,基本上也都采用了与之兼容的控制IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。但是它们的读写 *** 作是一样的。
lcd1602液晶模块内部的控制器共有11条控制指令,如下表所示。

lcd1602液晶模块的读写 *** 作,屏幕和光标的 *** 作都是通过指令编程来实现的。(说明1为高电平,0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。
指令4:显示开关控制。D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C :高电平时显示移动的文字,低电平时移动光标
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时为双行显示,F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。
小编推荐阅读:
lcd1602液晶显示屏介绍_lcd1602引脚功能
lcd1602在proteus中怎么找_lcd1602proteus仿真
lcd1602只亮不显示_lcd1602简单显示程序
lcd1602地址设置_LCD1602内部的控制器指令
lcd1602的封装_lcd1602的初始化程序
lcd1602的a和k是什么引脚_lcd1602与单片机的连接方法

阅读原文


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13212220.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存