目錄
LCD1602液晶
引腳定義說(shuō)明
字庫(kù)概述?
LCD1602原理圖
?LCD1602時(shí)序圖
LCD1602代碼
接線圖
用結(jié)構(gòu)體的方式顯示字符
LCD1602動(dòng)態(tài)顯示數(shù)字
4線驅(qū)動(dòng)LCD1602
LCD1602液晶
液晶模塊和數(shù)碼管相比,液晶模塊會(huì)顯得更加專業(yè)、漂亮。液晶顯示器以其體積小、功耗低、超薄、輕巧、顯示內(nèi)容豐富、使用方便等等諸多有點(diǎn),在電子設(shè)備、通訊、家用電器、儀器儀表等低功耗應(yīng)用系統(tǒng)之中得到越來(lái)越廣泛的應(yīng)用了,使得這一些電子設(shè)備的人機(jī)界面變得越來(lái)越直觀、越來(lái)越形象了,液晶模塊現(xiàn)在已經(jīng)廣泛的應(yīng)用于液晶電視機(jī)、電子表、復(fù)印機(jī)、計(jì)算器、便攜式電腦、IC卡電話機(jī)、掌上型電子玩具、傳真機(jī)等許多方面。1602的字符型液晶模塊(帶背光),是現(xiàn)在工控系統(tǒng)之中使用最為廣泛的液晶屏之一了。1602采用了標(biāo)準(zhǔn)的16腳接口。
引腳定義說(shuō)明
字庫(kù)概述?
????????1602的液晶模塊內(nèi)一般都是帶有標(biāo)準(zhǔn)字庫(kù)的,在內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)是存儲(chǔ)了192個(gè)5×7的點(diǎn)陣字符,32個(gè)5×10的點(diǎn)陣字符。另外還會(huì)有字符生成RAM(CGRAM) 512字節(jié),供給用戶來(lái)自定義字符,比如表1所示,這一些字符都有:英文字母的大小寫、阿拉伯?dāng)?shù)組、常用的符號(hào)以及日文假名等,每一個(gè)字符都會(huì)有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示是模塊會(huì)吧地址41H中的點(diǎn)陣字符圖形給顯示出來(lái),我們就能看到字母“A”了。
????????液晶顯示模塊時(shí)一個(gè)慢顯示器件,所以在執(zhí)行每一條指令之前都一定要確認(rèn)模塊得忙標(biāo)志位為低電平,代表不忙,否則此指令會(huì)失效。要顯示字符時(shí)需要先輸入顯示字符地址,也就是說(shuō)告訴模塊在哪里顯示字符。
LCD1602原理圖
?LCD1602時(shí)序圖
RS = 0 寫指令;RS = 1 寫數(shù)據(jù)
LCD1602代碼
LCD1602.c
#include "LCD1602.h"
void LCD1602_UserInit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
//配置控制I/O口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Pin = RS | RW | EN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT, &GPIO_InitStructure);
//配置數(shù)據(jù)I/O口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Pin = DATA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT, &GPIO_InitStructure);
}
void LCD1602_Write_Cmd_Data(uint8_t cmd, uint8_t data)
{
if (cmd) //1 數(shù)據(jù)
{
RS_HIGH;
RW_LOW;
EN_LOW;
GPIO_Write(DATA_PROT, data); Delay_ms(3);
EN_HIGH; Delay_ms(3);
EN_LOW;
}
else //0 指令
{
RS_LOW;
RW_LOW;
EN_LOW;
GPIO_Write(DATA_PROT, data); Delay_ms(3);
EN_HIGH; Delay_ms(3);
EN_LOW;
}
}
void LCD1602_Write_Init(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x06); //顯示光標(biāo)移動(dòng)位置
LCD1602_Write_Cmd_Data(CMD, 0x0C); //開啟顯示 不顯示光標(biāo) 并且光標(biāo)不閃爍
LCD1602_Write_Cmd_Data(CMD, 0x01); //清除屏幕內(nèi)容
LCD1602_Write_Cmd_Data(CMD, 0x80); //設(shè)置起始地址
}
//開啟顯示
void LCD1602_Open(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x0C);
}
//關(guān)閉顯示
void LCD1602_Shut(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x08);
}
/**
* @brief
* @param com 寫的地址 //1602 第一行數(shù)據(jù)0x80~0x8F 第二行數(shù)據(jù)0xC0~0xCF
* @param num 寫的長(zhǎng)度
* @param *dat 寫的內(nèi)容
* @retval 無(wú)
*/
void LCD1602_Write_Word_Display(uint8_t com, uint8_t num, uint8_t *dat)
{
LCD1602_Write_Cmd_Data(CMD, com);
for (uint8_t i = 0; i < num; i ++)
{
LCD1602_Write_Cmd_Data(DAT,*dat++);
}
}
LCD1602.h?
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "stm32f10x.h" // Device header
#include "Delay.h"
#define RS GPIO_Pin_0 //RS = 0,指令;RS = 1,數(shù)據(jù)
#define RW GPIO_Pin_1 //RW = 0,寫 ;RW = 1,讀
#define EN GPIO_Pin_2
#define CMD_PROT GPIOC
#define DATA 0x00FF //0~7引腳
#define DATA_PROT GPIOF
#define RS_HIGH GPIO_SetBits (CMD_PROT, RS)
#define RS_LOW GPIO_ResetBits(CMD_PROT, RS)
#define RW_HIGH GPIO_SetBits (CMD_PROT, RW)
#define RW_LOW GPIO_ResetBits(CMD_PROT, RW)
#define EN_HIGH GPIO_SetBits (CMD_PROT, EN)
#define EN_LOW GPIO_ResetBits(CMD_PROT, EN)
#define CMD 0 //代表RS = 0,指令
#define DAT 1 //代表RS = 1,數(shù)據(jù)
void LCD1602_UserInit(void); //LCD1602初始化
void LCD1602_Write_Init(void); //LCD1602寫初始化
void LCD1602_Open(void);
void LCD1602_Shut(void);
void LCD1602_Write_Word_Display(uint8_t com, uint8_t num, uint8_t *dat);
#endif
主函數(shù)?
#include "stm32f10x.h" // Device header
//#include "Delay.h"
#include "LCD1602.h"
int main(void)
{
Delay_Init (72);
LCD1602_UserInit(); //LCD1602初始化
LCD1602_Write_Init(); //LCD1602寫初始化
// LCD1602_Open();
// LCD1602_Shut();
LCD1602_Write_Word_Display(0x80, 16, (u8*)&"xiaoliangtongxue" );
while(1)
{
}
}
/***********************************END OF FILE***********************************/
接線圖
(參考51單片機(jī)接線圖)
RS RW EN 分別是PC0、PC1、PC2,數(shù)據(jù)線依次為PF0、PF1、PF2……
崩潰瞬間
插了好一會(huì)杜邦線,你竟然不亮?
?
這塊LCD1602好像是壞了?
算了算了,繼續(xù)敲
用結(jié)構(gòu)體的方式顯示字符
在LCD1602.h文件里添加結(jié)構(gòu)體的聲明
//使用結(jié)構(gòu)體
typedef struct{
uint8_t com;
uint8_t num;
uint8_t *data;
}LCD_InitTypeDef;
將LCD1602.c文件里最后一個(gè)函數(shù)的形參改成結(jié)構(gòu)體,函數(shù)里對(duì)應(yīng)的數(shù)據(jù)也要修改成結(jié)構(gòu)體成員
void LCD1602_Write_Word_Display(LCD_InitTypeDef LCD_InitStructure)
{
LCD1602_Write_Cmd_Data(CMD, LCD_InitStructure.com);
for (uint8_t i = 0; i < LCD_InitStructure.num; i ++)
{
LCD1602_Write_Cmd_Data(DAT,*LCD_InitStructure.data++);
}
}
main.c
#include "stm32f10x.h" // Device header
//#include "Delay.h"
#include "LCD1602.h"
LCD_InitTypeDef LCD_InitStructure;
int main(void)
{
Delay_Init (72);
LCD1602_UserInit(); //LCD1602初始化
LCD1602_Write_Init(); //LCD1602寫初始化
// LCD1602_Open();
// LCD1602_Shut();
LCD_InitStructure.com = 0xC0; //第二行
LCD_InitStructure.num = sizeof("xinniankuaile666")-1; //計(jì)算長(zhǎng)度
LCD_InitStructure.data = (u8*)&"xinniankuaile666"; //顯示的內(nèi)容
LCD1602_Write_Word_Display(LCD_InitStructure);
while(1)
{
}
}
LCD1602動(dòng)態(tài)顯示數(shù)字
void LCD1602_Number_Display(u8 com, u8 num) //數(shù)據(jù)范圍0~255
{
const u8 numcode[] = {"0123456789"}; //只讀,不可修改
LCD1602_Write_Cmd_Data(CMD, com);
LCD1602_Write_Cmd_Data(DAT, numcode[num/100]);//數(shù)位分離
LCD1602_Write_Cmd_Data(DAT, numcode[num/10%10]);
LCD1602_Write_Cmd_Data(DAT, numcode[num%10]);
}
while(1)里的代碼
for(u8 i = 0; i < 255; i ++)
{
LCD1602_Number_Display(0x87, i);
Delay_ms(300);
}
4線驅(qū)動(dòng)LCD1602
只用4567? 四個(gè)數(shù)據(jù)引腳?
數(shù)據(jù)以四位四位的方式發(fā)送
代碼部分
#include "LCD1602.h"
void LCD1602_UserInit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
//配置控制I/O口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Pin = RS | RW | EN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT, &GPIO_InitStructure);
//配置數(shù)據(jù)I/O口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Pin = DATA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT, &GPIO_InitStructure);
}
/*4線傳輸*/
void LCD1602_Write_Cmd_Data(uint8_t cmd, uint8_t data)
{
// /*代碼優(yōu)化*/
// if (cmd) //1 數(shù)據(jù)
// RS_HIGH;
// else //0 指令
// RS_LOW;
//對(duì)上面四行代碼繼續(xù)優(yōu)化,用到了三目運(yùn)算符
(CMD) ? RS_HIGH : RS_LOW;
//依次執(zhí)行
RW_LOW;
EN_LOW;
GPIO_Write(DATA_PROT, data | 0x0f); Delay_ms(3);//傳輸高四位數(shù)據(jù)
EN_HIGH; Delay_ms(3);
EN_LOW;
GPIO_Write(DATA_PROT, (data << 4) | 0x0f); Delay_ms(3);//左移四位,將低四位數(shù)據(jù)傳輸
EN_HIGH; Delay_ms(3);
EN_LOW;
}
void LCD1602_Write_Init(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x33); //設(shè)置顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x32); //設(shè)置8線轉(zhuǎn)4線顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x28); //設(shè)置指定模式初始化
LCD1602_Write_Cmd_Data(CMD, 0x06); //顯示光標(biāo)移動(dòng)位置
LCD1602_Write_Cmd_Data(CMD, 0x0C); //開啟顯示 不顯示光標(biāo) 并且光標(biāo)不閃爍
LCD1602_Write_Cmd_Data(CMD, 0x01); //清除屏幕內(nèi)容
LCD1602_Write_Cmd_Data(CMD, 0x80); //設(shè)置起始地址
}
//開啟顯示
void LCD1602_Open(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x33); //設(shè)置顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x32); //設(shè)置8線轉(zhuǎn)4線顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x28); //設(shè)置指定模式初始化
LCD1602_Write_Cmd_Data(CMD, 0x0C);
}
//關(guān)閉顯示
void LCD1602_Shut(void)
{
LCD1602_Write_Cmd_Data(CMD, 0x38); //基本設(shè)置 顯示模式設(shè)置
LCD1602_Write_Cmd_Data(CMD, 0x33); //設(shè)置顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x32); //設(shè)置8線轉(zhuǎn)4線顯示模式
LCD1602_Write_Cmd_Data(CMD, 0x28); //設(shè)置指定模式初始化
LCD1602_Write_Cmd_Data(CMD, 0x08);
}
/**
* @brief
* @param com 寫的地址 //1602 第一行數(shù)據(jù)0x80~0x8F 第二行數(shù)據(jù)0xC0~0xCF
* @param num 寫的長(zhǎng)度
* @param *dat 寫的內(nèi)容
* @retval 無(wú)
*/
void LCD1602_Write_Word_Display(LCD_InitTypeDef LCD_InitStructure)
{
LCD1602_Write_Cmd_Data(CMD, LCD_InitStructure.com);
for (uint8_t i = 0; i < LCD_InitStructure.num; i ++)
{
LCD1602_Write_Cmd_Data(DAT,*LCD_InitStructure.data++);
}
}
void LCD1602_Number_Display(u8 com, u8 num) //數(shù)據(jù)范圍0~255
{
const u8 numcode[] = {"0123456789"}; //只讀,不可修改
LCD1602_Write_Cmd_Data(CMD, com);
LCD1602_Write_Cmd_Data(DAT, numcode[num/100]);//數(shù)位分離
LCD1602_Write_Cmd_Data(DAT, numcode[num/10%10]);
LCD1602_Write_Cmd_Data(DAT, numcode[num%10]);
}
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "stm32f10x.h" // Device header
#include "Delay.h"
//使用結(jié)構(gòu)體
typedef struct{
uint8_t com;
uint8_t num;
uint8_t *data;
}LCD_InitTypeDef;
#define RS GPIO_Pin_0 //RS = 0,指令;RS = 1,數(shù)據(jù)
#define RW GPIO_Pin_1 //RW = 0,寫 ;RW = 1,讀
#define EN GPIO_Pin_2
#define CMD_PROT GPIOC
#define DATA 0x00F0 //4~7引腳
#define DATA_PROT GPIOF
#define RS_HIGH GPIO_SetBits (CMD_PROT, RS)
#define RS_LOW GPIO_ResetBits(CMD_PROT, RS)
#define RW_HIGH GPIO_SetBits (CMD_PROT, RW)
#define RW_LOW GPIO_ResetBits(CMD_PROT, RW)
#define EN_HIGH GPIO_SetBits (CMD_PROT, EN)
#define EN_LOW GPIO_ResetBits(CMD_PROT, EN)
#define CMD 0 //代表RS = 0,指令
#define DAT 1 //代表RS = 1,數(shù)據(jù)
void LCD1602_UserInit(void); //LCD1602初始化
void LCD1602_Write_Init(void); //LCD1602寫初始化
void LCD1602_Open(void);
void LCD1602_Shut(void);
void LCD1602_Write_Word_Display(LCD_InitTypeDef LCD_InitStructure);
void LCD1602_Number_Display(u8 com, u8 num);
#endif
#include "stm32f10x.h" // Device header
//#include "Delay.h"
#include "LCD1602.h"
LCD_InitTypeDef LCD_InitStructure;
int main(void)
{
Delay_Init (72);
LCD1602_UserInit(); //LCD1602初始化
LCD1602_Write_Init(); //LCD1602寫初始化
LCD1602_Open();
// LCD1602_Shut();
LCD_InitStructure.com = 0xC0; //第二行
LCD_InitStructure.num = sizeof("xinniankuaile666")-1; //計(jì)算長(zhǎng)度
LCD_InitStructure.data = (u8*)&"xinniankuaile666"; //顯示的內(nèi)容
LCD1602_Write_Word_Display(LCD_InitStructure);
while(1)
{
for(u8 i = 0; i < 255; i ++)
{
LCD1602_Number_Display(0x87, i);
Delay_ms(300);
}
}
}
好像是這個(gè)函數(shù)沒(méi)有取消注釋才不亮 LCD1602_Open();文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-575661.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-575661.html
到了這里,關(guān)于【STM32】驅(qū)動(dòng)LCD1602液晶8線并、4線并的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!