1. 首页 > 智能数码 >

1602lcd显示屏实验步骤_lcd1602显示器实验

字符型1602液晶显示实验目的

字符型1602液晶显示实验目的如下。

1602lcd显示屏实验步骤_lcd1602显示器实验1602lcd显示屏实验步骤_lcd1602显示器实验


1、了解LCD1602的基本原理,掌握其基本的工作流程。

2、学习用VerilogHDL语言编写LCD1602的控制指令程序,能够在液晶屏上显示出正确的符号。

3、能够自行改写程序,并实现符号的动态显示。

LCD1602显示简介

1、LCD1602液晶显示原理

LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

2、LCD1602液晶显示器的分类

液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。 3、

LCD1602液晶显示器各种图形的显示原理:

1.线段的显示

点阵图形式液晶由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显示的基本原理。

2.字符的显示

用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

3.汉字的显示

汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

具体使用时需要用板子,写程序,让在1602LCD上显示你想要显示的内容,南京罗姆液晶专业工业液晶屏!!!

你好:

据我所学,1602做这些现实几乎不可能,因为1602不具备绘图功能,也许只有通过改变点阵字符来模拟,但是很不灵活。

最好使用带绘图功能的液晶,比如12864。

个人见解。

希望我的回答能帮助到你。

1602液晶显示屏显示程序

1602液晶的程序我有,要做数字锁的话其实用到液晶也不多。

因为你显示密码是时候不应该都是现实*****吗?

你只需把键盘写入的数据存在一个数组中,然后跟密码数组对比就好了。

还有就是值得注意的是数据类型问题。

输入的键值看你处理的方式而定,密码存放的格式,还有输出显示的是ascll码。注意转换。

下面附带一段51的1602LCD的C程序,自己仔细琢磨。

#include

#define uchar unsigned char

#define uint unsigned int

uchar table[16]="abcdefghijklmnyz";

uchar table1[16]="0123456789abcdef";

sbit lcden=P2^0;

sbit lcdrs=P2^1;

sbit dula=P2^6;

sbit wela=P2^7;

uchar num;

void delay(uint z)

{uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}void write_com(uchar com)

{ wela=0;

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}void write_data(uchar date)

{ wela=0;

lcdrs=1;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}void init()

{lcden=0;

write_com(0x38);

write_com(0x0e);

write_com(0x06);

write_com(0x01);

write_com(0x80);

}void main()

{init();

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

{write_data(table[num]);

delay(20);

}write_com(1);

write_com(0x80+0x40);

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

{write_data(table1[num]);

delay(20);

}while(1);

}

这个是1602内部结构决定的,你只需要在初始化的时候先设置三次显示,然后再设置你的其他要求。

芯片厂家推荐的用法:

INT:

MOV

A,#30H

MOV

DATR,#CW_ADD

MOV

R2,#03H

INT1:

MOVX

@DPTR,A

CALL

DELAY

DJNZ

R2,INT1

这上面就是1602对于51单片机推荐的初始化之前加的三次模式设置

单片机1602液晶显示的DS1302实时时钟帮我分析以下程序运行步骤,详细解释一下,尤其是Bcd转换

这是我写的一个成功的,你仔细对比下就知道了!

#include

#include

#define U8 unsigned char

#define U16 unsigned int

#define BOOL bit

U8 secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;

U8 monthl,monthh,month,day,datel,dateh,date,year,yearl,yearh;

/***********定义LCD功能管脚**************************************/

sbit LCDRS = P2^6 ; //控制LCD数据或命令的读写

sbit LCDRW = P2^5 ; //控制LCD读写信号

sbit LCDEN = P2^7 ; //使能LCD

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

/***********定义DS1302功能管脚*********************************/

sbit DSRST = P3^5 ; //DS1302复位管脚

sbit DSIO = P3^4 ; //控制DS1302数据传输

sbit DSCLK = P3^6 ; //DS1302时钟

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

/*******************延时函数***********************************/

void delay(U16 time)

{U16 time1,time2;

for(time1=time;time1>0;time1--)

for(time2=110;time2>0;time2--);

}/**************************************************************/

/***********检测LCD忙碌状态***********************************/

BOOL judge_lcd()

{BOOL flag;

LCDEN = 0;

LCDRS = 0;

LCDRW = 1;

LCDEN = 1;

delay(1);

flag=(BOOL)(P0&0x80); //状态位第7位为1时禁止读写,为0时可读写

LCDEN = 0;

return flag;

}/**************************************************************/

/***********实现LCD写指令**************************************/

void write_lcd_command(U16 command)

{while(judge_lcd()); //检测LCD是否为忙碌状态

P0 = command ;

LCDRS = 0 ;

LCDRW = 0 ;

LCDEN = 1 ;

delay(1);

LCDEN = 0 ;

}/***************************************************************/

/***********实现LCD写数据**************************************/

void write_lcd_date(U16 date)

{while(judge_lcd()); //检测LCD是否为忙碌状态

P0 = date ;

LCDRS = 1 ;

LCDRW = 0 ;

LCDEN = 1 ;

delay(1);

LCDEN = 0 ;

}/***************************************************************/

/***********实现LCD写指令及数据********************************/

void write_lcd_com_date(U16 addr,U16 date)

{write_lcd_command(addr);

delay(1);

write_lcd_date(date);

}/**************************************************************/

/******************初始化LCD***********************************/

void init_lcd()

{write_lcd_command(0x38); //设置16x2显示,5x7点阵,8位数据口

delay(1);

write_lcd_command(0x0c); //开显示,不显示光标,光标不闪烁

delay(1);

write_lcd_command(0x06); //读写一个字符后,地址自动加1,不移动屏幕

delay(1);

write_lcd_command(0x01); //清屏

delay(1);

}/**************************************************************/

/**********************读DS1302********************************/

U8 read_ds1302(U8 addr)

{U8 i,temp=0x00;

DSRST=0;

DSIO=1;

DSCLK=0;

DSRST=1;

for (i=0;i<8;i++) //循环8次 写入地址数据

{DSCLK=0;

DSIO=addr&0x01; //每次传输低字节

addr>>=1; //右移一位

DSCLK=1;

}delay(1);

if(DSIO)

temp|=0x80; //每次传输低字节

DSCLK=0;

temp>>=1;

for (i=0;i<7;i++) //循环8次 读取数据

{DSCLK=0;

if(DSIO)

temp|=0x80; //每次传输低字节

DSCLK=1;

temp>>=1; //右移一位

}DSCLK=1;

DSRST=0;

DSIO=0;

return temp; //返回

}/************************************************************/

/******************写DS1302**********************************/

void write_ds1302(U8 addr, U8 date)

{U8 i;

DSRST=0;

DSCLK=0;

DSRST=1;

for (i=0;i<8;i++) //循环8次 写入地址数据

{DSCLK=0;

_nop_();

DSIO=addr&0x01; //每次传输低字节

addr>>=1; //右移一位

DSCLK=1;

_nop_();

}for (i=0;i<8;i++) //循环8次 写入数据

{DSCLK=0;

_nop_();

DSIO=date&0x01; //每次传输低字节

date>>=1; //右移一位 DSCLK=1

DSCLK=1;

_nop_();

}DSRST=0;

delay(1);

}/**************************************************************/

/*****************初始化DS1302********************************/

void init_ds1302()

{//读秒

if((((second=read_ds1302(0x81))>>7)&&0x01)==1)

{write_ds1302(0x8e,0x00); //关闭写保护

write_ds1302(0x80,0x00); //00秒

write_ds1302(0x82,0x54); //54分

write_ds1302(0x84,0x17); //17点

write_ds1302(0x86,0x14); //14日

write_ds1302(0x88,0x10); //10月

write_ds1302(0x8a,0x05); //星期五

write_ds1302(0x8c,0x11); //2011年

write_ds1302(0x8e,0x80); //允许写保护

}}

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

/*********************主函数****************************/

void main()

{init_lcd();

delay(2);

write_lcd_com_date(0x81,'2');

write_lcd_com_date(0x82,'0');

delay(1);

init_ds1302();

delay(1);

while(1)

{second=read_ds1302(0x81);

secondl=second&0x0f;

secondh=second>>4;

minute=read_ds1302(0x83);

minutel=minute&0x0f;

minuteh=minute>>4;

hour=read_ds1302(0x85);

hourl=hour&0x0f;

hourh=hour>>4;

month=read_ds1302(0x89);

monthl=month&0x0f;

monthh=month>>4;

year=read_ds1302(0x8d);

yearl=year&0x0f;

yearh=year>>4;

date=read_ds1302(0x87);

datel=date&0x0f;

dateh=date>>4;

day=read_ds1302(0x8b);

day=day&0x0f;

delay(15);

write_lcd_com_date(0xca,0x30+secondl);

write_lcd_com_date(0xc9,0x30+secondh);

write_lcd_com_date(0xc8,':');

write_lcd_com_date(0xc7,0x30+minutel);

write_lcd_com_date(0xc6,0x30+minuteh);

write_lcd_com_date(0xc5,':');

write_lcd_com_date(0xc4,0x30+hourl);

write_lcd_com_date(0xc3,0x30+hourh);

write_lcd_com_date(0x84,0x30+yearl);

write_lcd_com_date(0x83,0x30+yearh);

write_lcd_com_date(0x85,'-');

write_lcd_com_date(0x87,0x30+monthl);

write_lcd_com_date(0x86,0x30+monthh);

write_lcd_com_date(0x88,'-');

write_lcd_com_date(0x8a,0x30+datel);

write_lcd_com_date(0x89,0x30+dateh);

write_lcd_com_date(0x8c,0x30+day);

}}

高手指教lcd 1602怎么学明白?他的程序太复杂,看不懂啊?

你用的是什么控制处理器。。。。你有书得吧。。。1602 就写命令控制,写数据控制。。还有初始化。。有书的话应该讲的很详细的吧,,给你一段atmage16控制的1602吧

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define EN1 PORTA|=BIT(6) //使能控制

#define EN0 PORTA&=~BIT(6)

#define RS1 PORTA|=BIT(4) //模式控制

#define RS0 PORTA&=~BIT(4)

#define WR1 PORTA|=BIT(5)//读写控制

#define WR0 PORTA&=~BIT(5)

uchar table1[]="njsahfdsd";

uchar table2[]="xue avr dpj";

uchar num;

void delay(uint xms)//延时函数

{uint i,j;

for(i=xms;i>0;i--)

for(j=8000;j>0;j--);

}//这个你可以下载1602的使用手册,,那里有时序控制

void write_com(uchar com)//写命令子函数

{RS1;

WR1;

EN0;

RS0;

WR0;

PORTB=com;

delay(1);

EN1;

delay(1);

EN0;

}void write_adata(uchar adata)//写数据子函数

{RS1;

WR1;

EN0;

RS1;

WR0;

PORTB=adata;

delay(1);

EN1;

delay(1);

EN0;

}void init()

{DDRA=0xff;

DDRB=0xff;

delay(20);

//这些初始化具体看书

write_com(0x38);

delay(5);

write_com(0x38);

delay(5);

write_com(0x38);

write_com(0x38);

write_com(0x08);

write_com(0x01);

write_com(0x06);

write_com(0x0c);

}void main()

{init();

write_com(0x80);

for(num=0;num<9;num++)

{write_adata(table1[num]);

delay(5);

}write_com(0x80+0x40);

for(num=0;num<11;num++)

{write_adata(table2[num]);

delay(5);

}while(1);

}

首先,所有1602的控制器都是一样的。即指令都是通用的。

其次,1102609226 的程序已经足够清楚了。

无赖2033 同学只是把rw rs 等管脚的操作用函数的方式定义了而已。

初学,就看看1102609226 的就行。

自己编的不好之处多包涵

#include

#define uchar unsigned char

#define uint unsigned int

sbit rs=P2^0;

sbit rw=P2^1;

sbit e=P2^2;

延时程序

void delay(uint m)

{uchar n;

for(;m>0;m--)

for(n=10;n>0;n--);

}写命令

void wr_com(uint dat)

{P0=dat;

rs=0;

rw=0;

e=1;

e=0;

}写数据

void wr_data(uint dat)

{P0=dat;

rs=1;

rw=0;

e=1;

e=0;

}初始化

void init()

{wr_com(0x01);//清屏

delay(100);

wr_com(0x08);//关画面

delay(100);

wr_com(0x0c);//画面显示

delay(100);

wr_com(0x38);//工作方式设置

delay(100);

wr_com(0x06);//输入方式画面不动光标右移

delay(100);

wr_com(0x0f);显示设置画面、光标、闪烁显示

delay(100);

}void addr(uchar ass)

{addr(ass|0x80);地址

}void main()

{init();

while(1)

{wr_com(0x80);//第一行,第一位地址是0x80,0x81。。。。。0x8f

delay(10000);

wr_data('D'); //显示字母

delay(10000);

wr_com(0xc5);//第二行,0x80+0x40+你想显示的东西

delay(1000);

wr_data('C');//显示字母

delay(10000);

}}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息