单片机笔记之LCD1602显示屏
2016-01-05 19:45
267 查看
LCD1602显示屏概念:
工业字符型液晶,能够同时显示16x02即32个字符。
LCD1602显示屏原理图:
第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脚背光负极。
LCD1602显示程序:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6; //定义数据命令选择端
sbit RW=P2^5; //定义读写选择端
sbit E=P2^7; //定义使能端
uchar shuju1[]="JackTao";
uchar shuju2[]="Helloworld";
void delay_ms(uint z) //延时函数(1毫秒)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*****************侧忙函数****************/
uchar Lcd1602_ReadBusy() //判断lcd1602是否处于忙的状态
{
uchar temp;
RS=0;
RW=1;
_nop_();
P0=0xff; //读某IO口数据前,先将该口置为1
/*原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
_nop_();
E=1;
_nop_();
temp=P0; //读取此时lcd1602的状态字
_nop_();
E=0;
return (temp&0x80); //如果忙
/*状态字为temp(8位2进制数)的最高位,最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙*/
}
/*****************写命令****************/
void Lcd1602_WriteCom(uchar com)
{
while(Lcd1602_ReadBusy()); //判忙
RS=0; //命令
RW=0; //写
_nop_();
P0=com; //准备发送命令
_nop_();
E=1; //由时序图知,使能端为高电平时才允许数据交换
_nop_();
_nop_();
E=0; //由时序图知,使能端在完成数据交换后要拉低
_nop_();
_nop_();
}
/****************写数据****************/
void Lcd1602_WriteData(uchar dat)
{
while(Lcd1602_ReadBusy()); //判忙
RS=1; //数据
RW=0; //写
_nop_();
P0=dat;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
_nop_();
}
void Lcd1602_init() //初始化函数
{
delay_ms(15);
write_com(0x38); //显示模式设置
delay_ms(5);
write_com(0x38);
delay_ms(5);
write_com(0x38);
write_com(0x0c); //显示开
write_com(0x01); //显示清屏
write_com(0x06); //显示光标
}
void main()
{
uchar i,j;
Lcd1602_init(); //Lcd初始化
Lcd1602_WriteCom(0x80); //0x80是第一行的第一个字符的地址
for(i=0;i<7;i++)
Lcd1602_WriteData(shuju1[i]);
Lcd1602_WriteCom(0x80+0x40); //0xc0是第二行的第一个字符的地址,可以用0xc0,0x80+0x40,0x80|0x40等等
for(j=0;j<10;j++)
Lcd1602_WriteData(shuju2[j]);
}
工业字符型液晶,能够同时显示16x02即32个字符。
LCD1602显示屏原理图:
第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脚背光负极。
LCD1602显示程序:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6; //定义数据命令选择端
sbit RW=P2^5; //定义读写选择端
sbit E=P2^7; //定义使能端
uchar shuju1[]="JackTao";
uchar shuju2[]="Helloworld";
void delay_ms(uint z) //延时函数(1毫秒)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*****************侧忙函数****************/
uchar Lcd1602_ReadBusy() //判断lcd1602是否处于忙的状态
{
uchar temp;
RS=0;
RW=1;
_nop_();
P0=0xff; //读某IO口数据前,先将该口置为1
/*原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
_nop_();
E=1;
_nop_();
temp=P0; //读取此时lcd1602的状态字
_nop_();
E=0;
return (temp&0x80); //如果忙
/*状态字为temp(8位2进制数)的最高位,最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙*/
}
/*****************写命令****************/
void Lcd1602_WriteCom(uchar com)
{
while(Lcd1602_ReadBusy()); //判忙
RS=0; //命令
RW=0; //写
_nop_();
P0=com; //准备发送命令
_nop_();
E=1; //由时序图知,使能端为高电平时才允许数据交换
_nop_();
_nop_();
E=0; //由时序图知,使能端在完成数据交换后要拉低
_nop_();
_nop_();
}
/****************写数据****************/
void Lcd1602_WriteData(uchar dat)
{
while(Lcd1602_ReadBusy()); //判忙
RS=1; //数据
RW=0; //写
_nop_();
P0=dat;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
_nop_();
}
void Lcd1602_init() //初始化函数
{
delay_ms(15);
write_com(0x38); //显示模式设置
delay_ms(5);
write_com(0x38);
delay_ms(5);
write_com(0x38);
write_com(0x0c); //显示开
write_com(0x01); //显示清屏
write_com(0x06); //显示光标
}
void main()
{
uchar i,j;
Lcd1602_init(); //Lcd初始化
Lcd1602_WriteCom(0x80); //0x80是第一行的第一个字符的地址
for(i=0;i<7;i++)
Lcd1602_WriteData(shuju1[i]);
Lcd1602_WriteCom(0x80+0x40); //0xc0是第二行的第一个字符的地址,可以用0xc0,0x80+0x40,0x80|0x40等等
for(j=0;j<10;j++)
Lcd1602_WriteData(shuju2[j]);
}
相关文章推荐
- VS编译时自动生成版本
- 股市的起源发展和意义
- [ 笔记 ] coreseek/sphinx 全文检索简介
- android三个小球互换位置loading动画
- 原来Java中有两个ArrayList
- 判断用户登陆信息(一)硬性判断
- POJ 1002_487-3279
- mysql 乱码 utf8
- 索尼PS4和微软Xbox One对比解析
- BulkCopy频繁执行产生的性能问题
- bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)
- BZOJ 1030 - AC自动机 + DP
- Hadoop 下一代 MapReduce - 集群参数设置与启动
- 关于媒体查询
- C#中调用控制台程序时隐藏控制台窗口
- EXT4参数优化及测试
- Mysql 数据库学习 简单的增删改查
- iOS Mac系统下Ruby环境安装
- CCNP学习笔记17--vlan间路由
- java数据结构(1)