字符型1602液晶显示实验目的
字符型1602液晶显示实验目的如下。
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 举报,一经查实,本站将立刻删除。