目錄
1 LM016L液晶顯示模塊
1.1 基本參數
1.2 引腳定義
1.3硬件連接示例(AT89C52)
1.4 常用指令集(HD44780 子集)
1.5 常見問題與注意事項
1.8 結論
2 LM016L液晶顯示模塊控制電路原理圖
3 LM016L液晶顯示模塊控制程序
4 常用16進制數的ASCLL字符對照表
摘要:LM016L是一款基于HD44780控制器的16×2字符型液晶顯示模塊,具有5×8點陣顯示、5V工作電壓和并行接口。文章詳細介紹了其引腳定義、硬件連接示例(以AT89C52為例)、常用指令集及常見問題解決方案。同時提供了完整的控制程序代碼,包括初始化、字符串顯示和數值顯示功能。該模塊兼容性強,適合與各類微控制器配合使用,是嵌入式系統開發的經典顯示解決方案。文中還附有ASCII字符對照表供參考。
1 LM016L液晶顯示模塊
LM016L 是一款基于 Hitachi HD44780 控制器或其兼容芯片的 16×2 字符型液晶顯示模塊(LCD Module),能夠顯示兩行、每行 16 個 ASCII 字符(或自定義符號)。
1.1 基本參數
項目 | 典型值 / 說明 |
顯示容量 | 16 字符 × 2 行 |
字符點陣 | 5 × 8 點陣(可顯示 5 × 10) |
外形尺寸 | 80.0 mm × 36.0 mm(常見公模) |
視域尺寸 | 64.5 mm × 16.0 mm |
工作電壓 | 4.7 V – 5.3 V(大多 5 V 單電源) |
背光類型 | 黃綠 LED(可帶或不帶背光) |
接口方式 | 并行 8 位/4 位可選 |
控制器 | HD44780 或兼容(KS0066、ST7066 等) |
工作溫度 | ?20 °C – +70 °C |
儲存溫度 | ?30 °C – +80 °C |
1.2 引腳定義
LM016L 采用 單排 16-pin(2.54 mm 間距) 直插排針,常見引腳排列如下:
引腳 | 符號 | 功能說明 |
1 | VSS | 電源地(GND) |
2 | VDD | 正電源 +5 V |
3 | VEE | 對比度調節電壓(0 – 5 V,通常接 10 kΩ 電位器) |
4 | RS | 寄存器選擇(0:指令寄存器;1:數據寄存器) |
5 | R/W | 讀/寫選擇(0:寫;1:讀;常直接接地做“只寫”) |
6 | E | 使能端(下降沿觸發) |
7 – 14 | D0 – D7 | 8 位并行數據總線 |
15 | A/LED+ | 背光陽極(若帶背光) |
16 | K/LED– | 背光陰極 |
提示:如果只需 4 位模式,D0–D3 可懸空或接地,只接 D4–D7 即可節省 MCU IO。
1.3硬件連接示例(AT89C52)
LCD 引腳 | 連接AT89C52 |
VSS | GND |
VDD | +5 V |
VEE | GND |
RS | P0.2 |
R/W | P0.1 |
E | P0.0 |
D4 – D7 | P0.4\P0.5\P0.6\P0.7(4位模式) |
1.4 常用指令集(HD44780 子集)
指令 | 二進制 | HEX | 功能 |
清屏 | 0000 0001 | 0x01 | 清屏并把光標移到左上角 |
光標歸位 | 0000 0010 | 0x02 | 光標返回原點,DDRAM 地址清零 |
輸入模式 | 0000 01 I/D S | 0x06 | 設置光標移動方向、是否整體移位 |
顯示開關 | 0000 1 D C B | 0x0C | D=顯示,C=光標,B=光標閃爍 |
功能設定 | 001 DL N F – | 0x28 | DL=8/4 位,N=行數,F=點陣 |
1.5 常見問題與注意事項
對比度無顯示:調節 V0 電位器,或檢查背光是否亮。
顯示方塊、亂碼:通常是初始化時序不對或電源/地線接觸不良。
背光過暗/過亮:在 A 與 K 之間串聯 100 Ω 左右電阻限流。
3.3 V 系統驅動:HD44780 需 5 V 供電,但輸入高電平需 ≥0.7 VDD ≈ 3.5 V,故 3.3 V MCU 需電平轉換或選用 3.3 V 兼容型號(如 SPLC780D1)。
I2C 轉接板:市面上常把 LM016L 與 PCF8574T I2C 轉接板焊成一體,可節省 IO,僅需 2 根信號線(SDA/SCL)。
1.8 結論
LM016L = 經典的 16×2 字符 LCD,與 HD44780 指令完全兼容,資料豐富、社區生態完善。無論是拿 Arduino、STM32、Raspberry Pi Pico 還是 8051,都能快速上手。
2 LM016L液晶顯示模塊控制電路原理圖
如上圖所示,LM016L液晶顯示模塊控制電路由AT89C52單片機、上拉排阻、LM016L液晶顯示屏和晶振與復位電路,能夠實現字符、數字等數據的顯示。
3 LM016L液晶顯示模塊控制程序
如上圖所示,LM016L液晶顯示模塊控制程序能夠實現顯示屏顯示兩行字符串數據,控制程序如下所示。
//頭文件與位定義
#include <reg52.h>
#include <string.h>typedef unsigned char uchar;
typedef unsigned int uint;sbit EN = P0^0;//使能端
sbit RW = P0^1;//讀0寫1選擇
sbit RS = P0^2;//寄存器選擇0:指令1:數據int time=1314; //time:占空比(0~10)
int freq=6666;void Write_Cmd(uchar cmd); //寫指令函數
void Write_Dat(uchar dat); //寫入數據
void LCD1602_Init(); //LCD初始化
void PrintStr(char *str); // LCD輸出字符串
void DisplayNum(int m); // LCD顯示數值
void delayms(unsigned int xms); //微秒級延時函數
void delay(unsigned int x);/*****************主函數***********************/
void inittimer()
{TMOD = 0x01; // T0 方式 1TH0 = 0xFC; // 1 msTL0 = 0x18;TR0 = 1; ET0 = 1; EA = 1;//中斷設置值
}
void delay(unsigned int ms)
{unsigned int i;for (i = 0; i < ms; i++){while (!TF0); // 等待定時器T0溢出TF0 = 0; // 清除溢出標志}
}//中斷服務函數
void Timer0_ISR() interrupt 1
{TH0 = 0xFC; TL0 = 0x18;}void main()
{inittimer();LCD1602_Init(); // 初始化LCD1602while(1){Write_Cmd(0x80 | 0x00); //顯示地址,0x80是第一行的的首地址。0x80|0x06表示數據從第一行第1個字符位置開始顯示PrintStr("CSDN:");DisplayNum(freq);PrintStr("!");Write_Cmd(0xc0| 0x00); // 顯示第二行PrintStr("STUDY:");DisplayNum(time);Write_Dat('!');}
}
void Write_Cmd(uchar cmd) //寫指令函數
{P1 = cmd; //寫入十六進制形式的指令(command)RS = 0;//指令寄存器EN = 0;delay(1);EN = 1; //寫指令的操作時序:RS=0,RW=0,EN=高脈沖delay(1);EN = 0; //獲得高脈沖后使能端重新置零
}
void Write_Dat(uchar dat) //寫入數據
{P1 = dat; //P0口寫入數據RS = 1;//數據寄存器EN = 0;delay(1);EN = 1; //寫數據操作時序:RS=0,RW=0,EN=高脈沖delay(1);EN = 0; //獲得高脈沖后使能端重新置零
}void LCD1602_Init()
{RW = 0;//讀Write_Cmd(0x38);//設置16*2顯示delay(8);Write_Cmd(0x0f);//開顯示 顯示光標,光標閃爍delay(8);Write_Cmd(0x01);//清屏delay(8);Write_Cmd(0x06);//地址指針移位命令delay(8);//Write_Cmd(0x80 | 0x00);//顯示地址,0x80是第一行的的首地址。0x80|0x06表示數據從第一行第7個字符位置開始顯示}
// 打印字符串的函數,使用到了strlen函數,需要引入string.h頭文件
void PrintStr(char *str) // LCD輸出字符串
{char i,len;len = strlen(str); // 獲取字符串長度for(i=0;i<len;i++){Write_Dat(*str);str++;}
}void DisplayNum(int m) // LCD顯示數值
{int disdata[4]; //數值disdata[0] = m/1000+0x30;disdata[1] = m%1000/100+0x30;disdata[2] = m%100/10+0x30;disdata[3] = m%10+0x30;if(disdata[0]==0x30) //如果千位為0,讓LCD不顯示{disdata[0]=0x20;if( disdata[1]==0x30) //如果百位為0,讓LCD不顯示{disdata[1]=0x20;if( disdata[2]==0x30) //如果百位為0,讓LCD不顯示{disdata[2]=0x20;}}}Write_Dat(disdata[0]);delay(4);Write_Dat(disdata[1]);delay(4);Write_Dat(disdata[2]);delay(4);Write_Dat(disdata[3]);delay(4);}
4 常用16進制數的ASCLL字符對照表
下面給出常用的十六進制數 → ASCII 字符 對照表(僅列 0x00–0x7F 的標準 7-bit ASCII)。
HEX | Char | HEX | Char | HEX | Char | HEX | Char |
0x00 | NUL | 0x20 | (空格) | 0x40 | @ | 0x60 | ` |
0x01 | SOH | 0x21 | ! | 0x41 | A | 0x61 | a |
0x02 | STX | 0x22 | " | 0x42 | B | 0x62 | b |
0x03 | ETX | 0x23 | # | 0x43 | C | 0x63 | c |
0x04 | EOT | 0x24 | $ | 0x44 | D | 0x64 | d |
0x05 | ENQ | 0x25 | % | 0x45 | E | 0x65 | e |
0x06 | ACK | 0x26 | & | 0x46 | F | 0x66 | f |
0x07 | BEL | 0x27 | ' | 0x47 | G | 0x67 | g |
0x08 | BS | 0x28 | ( | 0x48 | H | 0x68 | h |
0x09 | HT | 0x29 | ) | 0x49 | I | 0x69 | i |
0x0A | LF | 0x2A | * | 0x4A | J | 0x6A | j |
0x0B | VT | 0x2B | + | 0x4B | K | 0x6B | k |
0x0C | FF | 0x2C | , | 0x4C | L | 0x6C | l |
0x0D | CR | 0x2D | - | 0x4D | M | 0x6D | m |
0x0E | SO | 0x2E | . | 0x4E | N | 0x6E | n |
0x0F | SI | 0x2F | / | 0x4F | O | 0x6F | o |
HEX | Char | HEX | Char | HEX | Char | HEX | Char |
0x10 | DLE | 0x30 | 0 | 0x50 | P | 0x70 | p |
0x11 | DC1 | 0x31 | 1 | 0x51 | Q | 0x71 | q |
0x12 | DC2 | 0x32 | 2 | 0x52 | R | 0x72 | r |
0x13 | DC3 | 0x33 | 3 | 0x53 | S | 0x73 | s |
0x14 | DC4 | 0x34 | 4 | 0x54 | T | 0x74 | t |
0x15 | NAK | 0x35 | 5 | 0x55 | U | 0x75 | u |
0x16 | SYN | 0x36 | 6 | 0x56 | V | 0x76 | v |
0x17 | ETB | 0x37 | 7 | 0x57 | W | 0x77 | w |
0x18 | CAN | 0x38 | 8 | 0x58 | X | 0x78 | x |
0x19 | EM | 0x39 | 9 | 0x59 | Y | 0x79 | y |
0x1A | SUB | 0x3A | : | 0x5A | Z | 0x7A | z |
0x1B | ESC | 0x3B | ; | 0x5B | [ | 0x7B | { |
0x1C | FS | 0x3C | < | 0x5C | \ | 0x7C | | |
0x1D | GS | 0x3D | = | 0x5D | ] | 0x7D | } |
0x1E | RS | 0x3E | > | 0x5E | ^ | 0x7E | ~ |
0x1F | US | 0x3F | ? | 0x5F | _ | 0x7F | DEL |