介绍:LCD1602液晶显示屏是一种字符型液晶显示模块,可以显示ASCll码的标准字符和其他一些内置的特殊字符,还可以内置8个自定义字符。

显示容量:16✖2个字符,每个字符为5*7点阵或5*10点阵

一、引脚介绍:

VO:对比度调节电压

RS:数据 / 指令选择,1为数组,0为指令

RW:读 / 写选择,1为读,0为写

E:数据使能,下降沿执行命令

D0~D7:数据的输入 / 输出

A:背光灯电源正极

K:背光灯电源负极

 二、存储器结构:D2RAM(数据显示区)和G2RAM、G2ROM(内置字模库)

                                                      D2RAM(数据显示区)

        

                                                      G2RAM、G2ROM(内置字模库) 

 三、LCD1602显示指令集

四、时序结构:

                                                                写指令/数据

 

 

                                                               读指令/数据

五、模块函数化集成使用:

 代码:

void LCD_WriteCommand(unsigned char Command) //写指令

{

LCD_RS=0;

LCD_RW=0;

// 指令 写

LCD_DataPort=Command; //并口:可以直接发送8位

LCD_E=1;

LCD_Delay1ms();

LCD_E=0;

LCD_Delay1ms();

}

代码:

void LCD_WriteData(unsigned char Data) //写数据

{

LCD_RS=1;

LCD_RW=0;

//数据 写

LCD_DataPort=Data; //并口:直接发送8位

LCD_E=1;

LCD_Delay1ms();

LCD_E=0;

LCD_Delay1ms();

}

代码:

/**

* @brief LCD1602初始化

* @param 无

* @retval 无

**/

void LCD_Init()

{

LCD_WriteCommand(0x01); //清屏

LCD_WriteCommand(0x0C); //显示开,光标关,闪烁开

LCD_WriteCommand(0x06); //数据读,写操作后,AC自动+1,画面不动

LCD_WriteCommand(0x38); //八位数据接口,两行显示,5✖7点阵

}

代码:

/**

* @brief 确定显示的首位置

* @param Line,Column

* @retval 无

**/

void LCD_Cursor(unsigned char Line,Column) //位置函数

{

if(Line==1) //根据数据显示区的地址可以得出 行和列 的关系

{

LCD_WriteCommand(0x80|(Column-1));

}else

{

LCD_WriteCommand(0x80|(Column-1)+0x40);

}

}

代码:

/**

* @brief 显示一个字符

* @param Line,Column,Char

* @retval 无

**/

void LCD_ShowChar(unsigned char Line,Column,char Char)

{

LCD_Cursor(Line,Column); //确定位置

LCD_WriteData(Char); //发送字符

}

代码:

/**

* @brief 显示一个字符串

* @param Line,Column,*String

* @retval 无

**/

void LCD_ShowString(unsigned char Line,Column,char *String)

{

char Strlen=strlen(String),i; //确定字符串长度

LCD_Cursor(Line,Column); //确定首位置

for(i=0;i

{

LCD_WriteData(String[i]);

}

}

代码:

/**

* @brief 显示一个数字

* @param Line,Column,Num,lenth

* @retval 无

**/

void LCD_ShwoNum(unsigned char Line,Column,unsigned int Num,lenth)

{

char i;

LCD_Cursor(Line,Column);

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

{

LCD_WriteData(Num/(int)pow(10,i-1)%10+'0');

}

/*

345/100%10 -> 3

345/10%10 -> 4

345/1%10 -> 5

*/

}

代码:

/**

* @brief 显示一个有符号的数字

* @param Line,Column,Num,lenth

* @retval 无

**/

void LCD_ShowSignedNum(unsigned char Line,Column,int Num,unsigned int lenth)

{

char i;

if(Num>=0)

{

LCD_ShowChar(Line,Column,'+');

}else

{

LCD_ShowChar(Line,Column,'-');

Num=-Num;

}

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

{

LCD_WriteData(Num/(int)pow(10,i-1)%10+'0');

}

/*

345/100%10 -> 3

345/10%10 -> 4

345/1%10 -> 5

*/

}

代码:

/**

* @brief 显示一个十六进制的数

* @param Line,Column,Num,lenth

* @retval 无

**/

void LCD_ShowHexnum(unsigned char Line,Column,unsigned int Num,lenth)

{

unsigned char i;

unsigned char SingleNum;

LCD_Cursor(Line,Column);

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

{

SingleNum=((Num/(int)pow(16,i-1)%16));

/*

345/16^2%16 -> 1

345/16%16 -> 5

345/1%16 -> 9

*/

if(SingleNum<10) //根据ASCll码进行补码

{

LCD_WriteData('0'+SingleNum);

}else

{

LCD_WriteData('A'+SingleNum-10);

}

}

}

代码:

/**

* @brief 显示一个二进制数字

* @param Line,Column,Num,lenth

* @retval 无

**/

void LCD_BinNum(unsigned char Line,Column,unsigned int Num,lenth)

{

unsigned char i;

LCD_Cursor(Line,Column);

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

{

LCD_WriteData((Num/(int)pow(2,i-1)%2)+'0');

/*

345/2^2%2 -> 101

345/2%2 -> 011

345/1%2 -> 001

*/

}

}

查看原文