————————————————————————————————————————————
LCD1602
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 1602的意思是每行显示16个字符,一共可以显示两行。如果是12232液晶(图形型液晶)则表示由122列32行组成,即共有122*32个点
- p.s.注意使用温度,通常液晶的工作范围为0~+55℃,存储温度范围为-22~+60℃。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
引脚情况:
images/loading.gif' data-original="http://images2015.cnblogs.com/blog/1146465/201705/1146465-20170522170317288-2094319333.png" >
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本操作时序:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RAM内部映射:80个字节
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
状态字说明://状态字反应了当前液晶屏的情况,当STA7为1时说明显示器正在忙碌状态,不可进行操作
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
数据指针设置:
用户可以通过以下的数据地址指针访问内部的80个字节RAM,用来设置数据地址
80H+地址码(0~27H,40~67H)
例:对第一个地址进行操作,0x80+0x01
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
其他指令码:
01H | 显示清屏(数据指针清零,所有显示清零) |
02H | 显示回车(数据指针清零) |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
初始化:
- 显示模式设置:38H
- 显示开/关及光标设置
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
读写操作时序:
- 写操作
- 操作时间参数
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
操作方式:
- 对LCD的操作可以分为数据和指令两部分。
- 通过操作RS,R/W,E,执行四种操作:读状态,读数据,写指令,写数据
- D0~D7用来输入输出指令码和数据
————————————————————————————————————————————
LCD1602使用实例:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
使用LCD1602显示两行字符,显示两行字,两个按键控制着显示或清屏
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计思路:
- 初始化液晶显示屏 //参照上文"初始化"
- 打开使能
- 指令码操作
- 设置16*2显示,5*7点阵,8位数据结构
- 开显示,显示光标,不闪烁
- 读写完字符后地址指针+1,光标+1,整屏显示不移动
- 清屏
- 设置地址显示的首字符
- 初始化中断
- 死循环等待中断
- 按键中断
- 按键"显示"
- 循环写入数据(字符数组)
- 指令"换行"
- 循环写入第二行数据
- 按键"清屏"
- 子函数 //参照上文"读写操作时序表"
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include <reg52.h> 2 typedef unsigned char uchar; 3 sbit en = P3 ^ 4; 4 sbit rs = P3 ^ 5; 5 uchar code table1[] = 6 { 7 "SMC1602 0x01..." 8 }; 9 uchar code table2[] =10 {11 " Hugh Dong."12 };13 void Delay(uchar m)14 {15 uchar i, j;16 for (i = m; i > 0; --i)17 for (j = 110; j > 0; --j);18 }19 /* 写数据 */20 void write_date(uchar date)21 {22 //参考写操作时序图23 rs = 1; //RS高电平,写数据24 P2 = date; //写入数据,对应时序图t_SP2数据建立25 Delay(5);26 en = 1; //打开使能,给E一个高脉冲,开始写入数据27 Delay(5);28 en = 0; //关闭使能,写入数据完成29 }30 /* 写指令 */31 void write_com(uchar com)32 {33 //基本原理同写数据34 rs = 0; //RS低电平,写指令35 P2 = com;36 Delay(5);37 en = 1;38 Delay(5);39 en = 0;40 }41 /* 初始化LCD */42 void Init()43 {44 en = 1;45 write_com(0x38); //00111000 设置16*2显示,5*7点阵,8位数据接口46 write_com(0x0E); //00001110 开显示,显示光标,不闪烁47 write_com(0x06); //00000110 读写字符后地址指针+1,光标+1,屏幕不移动48 write_com(0x01); //清屏49 write_com(0x80 + 0x01); //设置数据地址指针从第一个开始50 }51 int main()52 {53 /* 初始化LCD */54 Init();55 Delay(100);56 /* 初始化中断 */57 EA = 1;58 EX0 = 1;59 EX1 = 1;60 /* 死循环 */61 while(1);62 }63 void Display()interrupt 0 using 164 {65 uchar i;66 for (i = 0; i < 16; ++i) //遍历逐个写入第一行数据67 {68 write_date(table1[i]);69 Delay(20);70 }71 write_com(0x02); //换行72 write_com(0x80 + 0x40); //数据地址指针指向第二行73 for(i = 0; i < 16; ++i) //逐个遍历写入第二行数据74 {75 write_date(table2[i]);76 Delay(20);77 }78 }79 void Clear() interrupt 1 using 180 {81 write_com(0x01);82 }
原标题:51单片机实现SMC1602液晶屏显示实例
关键词: