admin 管理员组文章数量: 887021
LCD
一、引脚功能说明
一、引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下列表所示:
符号——————– 引脚说明
-VSS——————– 电源地
-VDD—————— 电源正极(电压>=4.5时后将使用默认配置)
-VL——————— 液晶显示偏压
-RS——————— 数据/命令选择
-R/W——————- 读/写选择
-E———————– 使能信号
-D0———————-数据
-D1———————-数据
-D2———————-数据
-D3———————-数据
-D4———————-数据
-D5———————-数据
-D6———————-数据
-D7———————-数据
-BLA——————– 背光源正极
-BLK——————– 背光源负极
引脚接口说明:
第1脚:VSS为地电源。
第2脚:VDD接3.3v正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
二. 1602LCD的指令说明及时序
1、1602液晶模块内部的控制器共有11条控制指令,如下列表所示:
- 指令—————RS—R/W—D7—D6—D5—D4—D3—D2—D1—D0
-清显示—————0——0——0—–0——0—–0——0—–0——0—–1
-光标返回————0——0——0—–0——0—–0——0—–0——1—–*
-置输入模式———0——0——0—–0——0—–0——0—–1——I/D—S
-显示开关控制——-0——0——0—–0——0—–0——1—–D—–C—–B
-光标或字符移位—-0——0——–0——0—–0—-1—-S/C—R/L— * – –*
-置功能—————0——0——–0 ——0—-1—-DL—N —–F—– * — *
-置字符发生器地址–0——0——-0——-1—–字符发生存贮器地址
-置数据存贮器地址–0——0——1——显示数据存贮器地址
-读忙标志————0——1——BF—– 计数器地址
-写数到—————1——0——-要写的数据内容
-读数数据————1——1——-读出的数据内容
2、控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
3、基本操作时序表
1.读数据时序图
三、实现代码
1、C代码
#include "lcd1602.h"
#include "stm32f10x.h"/* -----------------------------------初始化1602-------------------------------------------*/
void LCD1602_Init(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E)
{LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_Display_mode);LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_shows1);LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_cursor3);LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_clear);
}/* ---------------------------------写指令函数-------------------------------------------*/
void LCD1602_WriteCmd(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t Cmd)
{uint8_t PinNo = LCD1602_Get_PinNo(GPIO_Pin_Dx);LCD1602_BusyWait(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW, GPIO_InitStructure_LCD1602_E);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);GPIO_Write(GPIOx_LCD1602_Dx,(0x00ff&Cmd)<<PinNo);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS->GPIO_Pin);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RW->GPIO_Pin);GPIO_SetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);/*GPIO_WriteBit(GPIOA,GPIO_Pin_7,(BitAction)((Cmd&0x80)>>7)); //D7GPIO_WriteBit(GPIOA,GPIO_Pin_6,(BitAction)((Cmd&0x40)>>6)); //D6GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)((Cmd&0x20)>>5)); //D5GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)((Cmd&0x10)>>4)); //D4GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)((Cmd&0x08)>>3)); //D3GPIO_WriteBit(GPIOA,GPIO_Pin_2,(BitAction)((Cmd&0x04)>>2)); //D2GPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)((Cmd&0x02)>>1)); //D1GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)((Cmd&0x01))); //D0*/
}/* -----------------------------------检测忙信号-------------------------------------------*/
void LCD1602_BusyWait(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E)
{GPIO_InitTypeDef GPIO_InitStructure_LCD1602_D7;GPIO_InitStructure_LCD1602_D7.GPIO_Pin = GPIO_Pin_Dx << 7;GPIO_InitStructure_LCD1602_D7.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure_LCD1602_D7.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOx_LCD1602_Dx, &GPIO_InitStructure_LCD1602_D7);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS->GPIO_Pin);GPIO_SetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RW->GPIO_Pin);GPIO_SetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);while(GPIO_ReadInputDataBit(GPIOx_LCD1602_Dx,GPIO_InitStructure_LCD1602_D7.GPIO_Pin) == 1);GPIO_InitStructure_LCD1602_D7.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOx_LCD1602_Dx, &GPIO_InitStructure_LCD1602_D7);
}/* -----------------------------------写单个数据-------------------------------------------*/
void LCD1602_WriteDate(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t Date)
{uint8_t PinNo = LCD1602_Get_PinNo(GPIO_Pin_Dx);LCD1602_BusyWait(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW, GPIO_InitStructure_LCD1602_E);GPIO_Write(GPIOx_LCD1602_Dx,(0x00ff&Date)<<PinNo);GPIO_SetBits(GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS->GPIO_Pin);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RW->GPIO_Pin);GPIO_SetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);GPIO_ResetBits(GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_E->GPIO_Pin);
}/* -------------------------------------在第一行写数据:不能超过16个字符-----------------------------------------*/
void LCD1602_WriteFirstRowSrting(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t* pDate)
{uint8_t Count = 0;LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_ADDH);while(*pDate != 0){LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS, GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,*pDate);pDate++;Count++;}while(Count <= 15){LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS, GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,' ');Count++;}
}/* -------------------------------------在第二行写数据:不能超过16个字符-----------------------------------------*/
void LCD1602_WriteSecondRowSrting(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t* pDate)
{uint8_t Count = 0;LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_ADDL);while(*pDate != 0){LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS, GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,*pDate);pDate++;Count++;}while(Count <= 15){LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS, GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,' ');Count++;}
}/* -------------------------------------写数据:不能超过32个字符-----------------------------------------*/
void LCD1602_WriteString(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t* pDate)
{unsigned char Count = 0;LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_clear);LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_ADDH);while(*pDate != 0){if(Count == 16){LCD1602_WriteCmd(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,LCD_ADDL);}LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE,GPIO_InitStructure_LCD1602_RS,GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,*pDate);Count++;pDate++;}
/* while(Count <= 31){LCD1602_WriteDate(GPIOx_LCD1602_Dx,GPIO_Pin_Dx,GPIOx_LCD1602_RWE, GPIO_InitStructure_LCD1602_RS, GPIO_InitStructure_LCD1602_RW,GPIO_InitStructure_LCD1602_E,' ');Count++;}*/
}/* -----------------------------------确定管脚的排号,计算需要的移位-------------------------------------------*/
uint8_t LCD1602_Get_PinNo(uint16_t GPIO_Pin_Dx)
{uint8_t PinNo = 0;while(GPIO_Pin_Dx > 1){PinNo++;GPIO_Pin_Dx = GPIO_Pin_Dx >> 1;}return PinNo;
}
2.头文件
#ifndef _LCD1602_H
#define _LCD1602_H/*-----------------------------------使用说明------------------------------------------*/
/*---------------------------------------------------------------------------------------
------------VDD:接小于4.5V的电压
------------D0-D7:需要在同一组GPIOx,并且连续低位到高位
------------RS、RW、E:需要在同一组GPIOx
-----------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------*//* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"/*显示模式指令*/
#define LCD_Display_mode 0X38 //设置16*2显示、5x7点阵、8位数据解口/*显示开关及光标设置*/
#define LCD_shows0 0X08 //关显示、不现实光标、不闪烁光标
#define LCD_shows1 0X0C //开显示、不显示光标、不闪烁光标
#define LCD_shows2 0X0E //开显示、显示光标、不闪烁光标
#define LCD_shows3 0X0F //开显示、显示光标、闪烁光标/*字符指针设置*/
#define LCD_cursor1 0X04 //写一个字符、地址指针减1
#define LCD_cursor2 0X05 //写一个字符、地址指针减1并屏幕右移
#define LCD_cursor3 0X06 //写一个字符、地址指针加1
#define LCD_cursor4 0X07 //写一个字符、地址指针加1并屏幕左移/*清屏指令*/
#define LCD_clear 0x01 //清除所有显示/*忙状态字*/
#define LCD_WAY 0x80 /*宏定义显示起始地址*/
#define LCD_ADDH 0X80 //第一行地址0x80-0xA7
#define LCD_ADDL 0XC0 //第二行地址0xC0-0xE7/*函数定义*/
void LCD1602_Init(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E);void LCD1602_WriteCmd(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t Cmd);void LCD1602_BusyWait(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E);void LCD1602_WriteDate(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t Date);void LCD1602_WriteFirstRowSrting(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t* pDate);void LCD1602_WriteSecondRowSrting(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t* pDate);void LCD1602_WriteString(GPIO_TypeDef* GPIOx_LCD1602_Dx,//D0--D7的GPIOxuint16_t GPIO_Pin_Dx,//D0--D7引脚的起始位置、即D0的管脚号GPIO_TypeDef* GPIOx_LCD1602_RWE,//RS、RW、E的GPIOxGPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RS,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_RW,GPIO_InitTypeDef* GPIO_InitStructure_LCD1602_E,uint8_t *pDate);uint8_t LCD1602_Get_PinNo(uint16_t GPIO_Pin_Dx);#endif
本文标签: LCD
版权声明:本文标题:LCD 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1688176541h188419.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论