跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码)

1 、单片机控制液晶显示模块1602 LCD的显示。

液晶显示器(Liquid Crystal Display,LCD)具有省电、体积小、抗干扰能力强等优点, LCD显示器分为字段型、字符型和点阵图形型。

(1)字段型。

以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。

(2)字符型。

专门用于显示字母、数字、符号等。

一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用 (3)点阵图形型。

广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。

它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。

引脚包括8条数据线、3条控制线和3条电源线,见表5-2。

通过单片机向模块写入命令和数据,就可对显示方式和显示内容做出选择。

2 .LCD1602字符的显示及命令字。

显示字符首先要解决待显示字符的ASCII码产生。

用户只需在C51程序中写入欲显示的字符常量或字符串常量,C51程序在编译后会自动生成其标准的ASCII码,然后将生成的ASCII码送入显示用数据存储器DDRAM,内部控制电路就会自动将该ASCII码对应的字符在LCD1602显示出来。

让液晶显示器显示字符,首先对其进行初始化设置,还必须对有、无光标、光标移动方向、光标是否闪烁及字符移动方向等进行设置,才能获得所需显示效果。

对LCD 1602的初始化、读、写、光标设置、显示数据的指针设置等,都是单片机向LCD 1602写入命令字来实现。

命令1:清屏,光标返回地址00H位置(显示屏的左上方)。

命令2:光标返回到地址00H位置(显示屏的左上方)。

命令3:光标和显示模式设置。

I/D —地址指针加1或减1选择位。

I/D=1 ,读或写一个字符后地址指针加1; I/D=0 ,读或写一个字符后地址指针减1。

S —屏幕上所有字符移动方向是否有效的控制位。

S=1 当写入一字符时,整屏显示左移(I/D=1)或右移(I/D=0); S=0 整屏显示不移动。

命令4:显示开/关及光标设置。

D —屏幕整体显示控制位,D=0关显示,D=1开显示。

C —光标有无控制位,C=0无光标,C=1有光标。

B —光标闪烁控制位,B=0不闪烁,B=1闪烁。

命令5:光标或字符移位。

S/C —光标或字符移位选择控制位。

S/C=1移动显示的字符,S/C=0移动光标。

R/L —移位方向选择控制位。

0:左移,1:右移, 命令6:功能设置命令。

DL — 传输数据的有效长度选择控制位。

1:8位数据线接口;0:4位数据线接口。

N — 显示器行数选择控制位。

0:单行显示,1:两行显示。

F — 字符显示的点阵控制位。

0:显示5  7 点阵字符,1:显示5  10 点阵字符。

命令7:CGRAM地址设置。

命令8:DDRAM地址设置。

LCD内部有一个数据地址指针,用户可通过它访问内部全部80字节的数据显示RAM。

命令格式为:80H+地址码。

其中,80H为命令码 命令9:读忙标志或地址。

BF—忙标志。

BF=1表示LCD忙,此时LCD不能接受命令或数据;BF=0表示LCD不忙。

命令10:写数据。

命令11:读数据。

例如,将显示模式设置为“16 * 2 显示,5 * 7 点阵,8位数据接口”,只需要向1602写入光标和显示模式设置命令(命令3)“00111000B ” ,即38H即可。

再如,要求液晶显示器开显示,显示光标且光标闪烁,那么根据显示开关及光标设置命令(命令4),只要令D=1,C=1和B=1,也就是写入命令“00001111B”,即0FH,就可实现所需的显示模式。

3 、LCD1602的RS、R/W*和E这3个引脚分别接在P2.0、P2.1和P2.2引脚,只需通过对这3个引脚置“1”或清“0”,就可实现对LCD1602的读写操作。

具体来说,显示一个字符的操作过程为“读状态→写命令→写数据→自动显示” 4 、用单片机驱动字符型液晶显示器LCD1602,使其显示两行文字:“Welcom” 与“Harbin  CHINA”。

Proteus仿真图如下 程序源码如下:

#include

#include #define uchar unsigned char #define uint unsigned int #define out P0 sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2;

void check_busy(void); void write_command(uchar com); void write_data(uchar dat); void LCD_initial(void); void string(uchar ad ,uchar *s); void lcd_test(void); void delay(uint);

//主程序

void main(void) { LCD_initial(); while(1) { string(0x80," welcome"); string(0xC0," Harbin CHINA"); delay(1000); write_command(0x01);//清屏 delay(1000); } } //1ms延时程序 void delay(uint j) { uchar i=250; for(;j>0;j--) { while(--i); i=249; while(--i); i=250; } } //查忙程序 void check_busy(void) { uchar dt; do { dt=0xff; e=0; rs=0; rw=1; e=1; dt=out; }while(dt&0x80); e=0; } //写控制指令 void write_command(uchar com) { check_busy(); e=0; rs=0; rw=0; out=com; e=1; _nop_(); e=0; delay(1); } //写数据指令 void write_data(uchar dat) { check_busy(); e=0; rs=1; rw=0; out=dat; e=1; _nop_(); e=0; delay(1); } //液晶屏初始化 void LCD_initial(void) { write_command(0x38);//8位总线,双行显示,5X7的点阵字符 write_command(0x0F);//开整体显示,光标关,无黑块 write_command(0x06);//光标右移 write_command(0x01);//清屏 delay(1); } //输出字符串 void string(uchar ad,uchar*s) { write_command(ad); while(*s>0) { write_data(*s++); delay(100); } }

相关文章