51单片机(六).单片机输出电路实践——LCD1602与LCD12864的使用
一、LCD簡介
LCD作為一種常見的外設,是廣泛應用在單片機外圍電路的一種顯示設備。LCD1602和LCD12864是典型的單片機顯示電路中常用的模塊,兩種該模塊都屬于點陣式液晶顯示模塊。
1、LCD1602模塊
1602液晶也叫160字符型液晶,它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊。1602LCD是指顯示內容為16*2,顯示兩行,每行可以顯示16個字符液晶模塊。液晶1602引腳說明如下表中所示:
| 編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 |
| 1 | VSS | 電源地 | 9 | D2 | 數據口 |
| 2 | VDD | 電源正極 | 10 | D3 | 數據口 |
| 3 | VO | 液晶顯示對比度調節 | 11 | D4 | 數據口 |
| 4 | RS | 數據/命令選擇端 | 12 | D5 | 數據口 |
| 5 | R/W(—) | 讀寫選擇端 | 13 | D6 | 數據口 |
| 6 | E | 使能信號 | 14 | D7 | 數據口 |
| 7 | D0 | 數據口 | 15 | BLA | 背光電源正極 |
| 8 | D1 | 數據口 | 16 | BLK | 背光電源負極 |
對LCD1602有兩種操作方式,即“讀”和“寫”。“讀”操作就是讀液晶是否處于“忙”狀態,如果是,就等液晶“空閑”時再往液晶“寫”(寫指令或數據)。一般情況下對于LCD1602可以不用“讀”操作,用一個短暫延時即可。液晶1602工作之前,要對1602進行一些設置。
Function set功能設置
1602模塊的功能設置指令碼如下表中所示:
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 1 | DL | N | F | - | - |
設置模塊數據接口的寬度和1602顯示屏的顯示方式,即單片機1602模塊接口數據總線4位或8位、LCD顯示行數和顯示字符點陣的規格。DL:數據接口寬度標志。DL=1,8位數據DB7~DB0;DL=0,四位數據總線DB7~DB4;DB3~DB0不用,使用此方式傳送數據,需分兩次進行。N:顯示行數標志。N=1,雙行顯示;N=0,單行顯示方式。F:現實點陣字符字體標志。F=1,5*10點陣+光標顯示;F=0:5*7點陣+光標顯示方式。
Display on/off control(顯示開/關控制)
1602模塊的指令代碼如下表所示:
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
D:顯示開/關標志。D=1,開顯示;D=0,關顯示。
C:光標顯示控制標志。C=1,光標顯示;C=0,光標不顯示。
B:閃爍控制標志。B=1,光標所指位置上,交替顯示全黑點陣和顯示字符,產生閃爍效果,f=250KHZ時,閃爍頻率為0.4ms左右,通過設置,光標可以與其所指位置的字符一起閃爍。
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | N | S |
N=1,當讀和寫一個字符后地址指針加1,且光標加1;N=0,當讀和寫一個字符后地址指針減1,且光標減1.
S=1,當寫一個字符時,整屏顯示左移(N=1)或右移(N=0)。S=0,當寫一個字符時,整屏顯示不移動。
Clear display(清屏)
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
所謂清屏就是把數據指針清零和所有顯示清零
2、12864模塊
12864是128*64點陣液晶模塊的點陣數簡稱,其引腳說明如下表中所示:
| 編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 |
| 1 | VSS | 電源地 | 11 | D4 | 數據口 |
| 2 | VDD | 電源正極 | 12 | D5 | 數據口 |
| 3 | VO | 液晶顯示對比度 調節 | 13 | D6 | 數據口 |
| 4 | RS | 數據/命令選擇端(H/L)(串口片選) | 14 | D7 | 數據口 |
| 5 | R/W | 讀寫選擇端(H/L)(串口數據) | 15 | PSB | 并串選擇,H并行,L串行 |
| 6 | E | 使能信號 | 16 | NC | 懸空 |
| 7 | D0 | 數據口 | 17 | RST | 復位,低電平有效 |
| 8 | D1 | 數據口 | 18 | NC | 懸空 |
| 9 | D2 | 數據口 | 19 | BLA | 背光電源正極 |
| 10 | D3 | 數據口 | 20 | BLK | 背光電源負極 |
對于液晶12864同1602也有兩種工作方式,“讀”和“寫”。“讀”操作即判斷液晶是否處于“忙”狀態,一般對12864用一個短延時即可。
?
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 1 | DL | X | 0 RE | X | X |
DL:數據接口寬度標志。DL=1(必須是1),8位數據DB7~DB0。
RE=1,擴充指令集動作;RE=0,基本指令集動作。
RS和R/W均為低電平的情況下,是“寫指令”。
Display on/off control(顯示開/關控制)
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
D:顯示開/關標志。D=1,開顯示;D=0,關顯示。
C:光標顯示控制標志。C=1,光標顯示;C=0,光標不顯示。
B:光標位置反白開關控制位。B=1,光標位置反白ON(將光標所在處的資料反白顯示);B=0,光標位置反白OFF。
Clear display(清屏)
| RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
同1602,清屏就是把數據指針清零和所有顯示清零。
12864串行顯示
串行工作模式下:
CS(RS):片選信號線,進行數據操作時必須將CS端拉高。
SCLK(R/W):串行同步時鐘,每操作一位數據都要有一個SCLK跳變沿,上升沿有效,當SCLK由低電平變為高電平的瞬間,液晶將SID上的數據讀入或輸出。
SID(EN):串行數據,每一次操作都由三個字符組成,第一個字節向控制器發送命令控制字,若為寫指令則發送1111 1000,若為寫數據則發送1111 1010。第二個字節高四位發送指令或數據的高四位,第二個字節低四位補0。第三個字節低四位發送指令或數據的低四位,第三個字節的低四位補0。
漢字顯示LCD12864顯示漢字,只能顯示4行,每行顯示8個漢字或16個字符。漢字的地址分布如下: LCD12864顯示漢字,只能顯示4行,每行顯示8個漢字或16個字符。漢字的地址分布如下:
| 第一行漢字 | 0x80 | 0x81 | 0x82 | 0x83 | 0x84 | 0x85 | 0x86 | 0x87 |
| 第二行漢字 | 0x90 | 0x91 | 0x92 | 0x93 | 0x94 | 0x95 | 0x96 | 0x97 |
| 第三行漢字 | 0x88 | 0x89 | 0x8a | 0x8b | 0x8c | 0x8d | 0x8e | 0x8f |
| 第四行漢字 | 0x98 | 0x99 | 0x9a | 0x9b | 0x9c | 0x9d | 0x9e | 0x9f |
二、電路設計
以12864顯示模塊的電路為例。
1、并行顯示電路
2、串行顯示電路
三、程序設計
1、1602顯示單個數字
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit Lcd1602_EN=P2^5; //使能端 sbit Lcd1602_RS=P1^0; //數據命令選擇端 sbit Lcd1602_RW=P1^1; //讀寫選擇端,可以直接電路置地,只使用寫功能 void delay(uint i) {uint x,y;for(x=i;x>0;x--)for(y=110;y>0;y--); }void write_com(uchar com) { Lcd1602_RS=0;//命令Lcd1602_RW=0;//寫Lcd1602_EN=0;P0=com; delay(5);Lcd1602_EN=1;delay(5);Lcd1602_EN=0; } void write_data(uchar dat) {Lcd1602_RS=1;Lcd1602_RW=0;Lcd1602_EN=0;P0=dat;delay(5);Lcd1602_EN=1;delay(5);Lcd1602_EN=0; } void Lcd_Init() { write_com(0x38);//16*2顯示,8位數據接口write_com(0x0c);//顯示器開,光標開,光標閃爍write_com(0x06);//顯示字符不動,光標右移write_com(0x01);//清屏 } void display(uchar c,int v)//顯示一個三位的數字 {uint shu;write_com(c);write_com(0x80);//設置第一行第一列寫shu=v/100;write_data(shu+'0');shu=v%100/10;write_data(shu+'0');shu=v%10;write_data(shu+'0');} void main() {int v;v=789;Lcd_Init();while(1){display(0x80,v);} }2、1602顯示單個字符
#include <reg52.h> #include "LCD1602.h" uchar table[]={"www.baidu.com"}; uchar num; void display(int v) {int shu;write_com(0x80);for(num=0;num<13;num++){write_data(table[num]);delay(5);}write_com(0x80+40);shu=v/100;write_data(shu+'0');shu=v%100/10;write_data(shu+'0');shu=v%10;write_data(shu+'0');write_data(0xdf);write_data('C');delay(5); } void main() {uint v;Lcd_Init();while(1){v=100;display(v);} }//lcd1602.h文件 #ifndef _LCD1602_ #define _LCD1602_ #define uchar unsigned char #define uint unsigned int sbit Lcd1602_EN=P2^5; //ê1?ü?? sbit Lcd1602_RS=P1^0; //êy?Y?üá??????? sbit Lcd1602_RW=P1^1; //?áD′??????,?éò??±?óμ??·??μ?£???ê1ó?D′1|?üvoid delay(uint i){uint x,y;for(x=i;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){ Lcd1602_RS=0;//?üá?Lcd1602_RW=0;//D′Lcd1602_EN=0;P0=com; delay(5);Lcd1602_EN=1;delay(5);Lcd1602_EN=0;}void write_data(uchar dat){Lcd1602_RS=1;Lcd1602_RW=0;Lcd1602_EN=0;P0=dat;delay(5);Lcd1602_EN=1;delay(5);Lcd1602_EN=0;}void Lcd_Init(){ write_com(0x38);//16*2??ê?£?8??êy?Y?ó?úwrite_com(0x0c);//??ê??÷?a£?1a±ê?a£?1a±êéá??write_com(0x06);//??ê?×?·?2??ˉ£?1a±êóòò?write_com(0x01);//???á}#endif3、12864顯示漢字
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P1^0; sbit RW=P1^1; sbit EN=P2^5; sbit PSB=P1^2; uchar code table1[]={"人生若只如初見,"}; uchar code table2[]={"何事秋風悲畫扇。"}; uchar code table3[]={"等閑變卻故人心,"}; uchar code table4[]={"卻道故人心易變。"}; void delay(uint i) {uint x,y;for(x=i;x>0;x--)for(y=110;y>0;y--); } void write12864_cmd(uchar cmd) {RS=0;RW=0;EN=0;P0=cmd;delay(5);EN=1;delay(5);EN=0; } void write12864_data(uchar dat) {RS=1;RW=0;EN=0;P0=dat;delay(1);EN=1;delay(1);EN=0; } void lcd12864_init() {PSB=1;write12864_cmd(0x30);//設置數據寬度為8位delay(5);write12864_cmd(0x0c);//開顯示delay(5);write12864_cmd(0x01);//清屏delay(5); } void lcd_pos(uchar x,uchar y)//顯示位置坐標 {uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write12864_cmd(pos); } void main() {lcd12864_init();while(1){uchar i;lcd_pos(0,0);for(i=0;i<16;i++){write12864_data(table1[i]);}lcd_pos(1,0);for(i=0;i<16;i++){write12864_data(table2[i]);}lcd_pos(2,0);for(i=0;i<16;i++){write12864_data(table3[i]);}lcd_pos(3,0);for(i=0;i<16;i++){write12864_data(table4[i]);}} }4、12864串行顯示程序
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit CS=P1^0; sbit SCLK=P1^1; sbit SID=P2^5; sbit PSB=P1^2; uchar code table1[]={"人生若只如初見,"}; uchar code table2[]={"何事秋風悲畫扇。"}; uchar code table3[]={"等閑變卻故人心,"}; uchar code table4[]={"卻道故人心易變。"}; void delay(uint i) {uint x,y;for(x=i;x>0;x--)for(y=110;y>0;y--); } void sendbyte(uchar zdata)//根據液晶串口通信協議,發送數據 {uint i;for(i=0;i<8;i++){if((zdata<<i)&0x80){SID=1;}else{SID=0;}SCLK=0;SCLK=1;} } void write12864_com(uchar cmdcode) {CS=1;sendbyte(0xf8);//寫指令sendbyte(cmdcode&0xf0);//指令高四位sendbyte((cmdcode<<4)&0xf0);//低四位delay(1); } void write12864_data(uchar dispdata) {CS=1;sendbyte(0xfa);//寫數據sendbyte(dispdata&0xf0);//數據高四位sendbyte((dispdata<<4)&0xf0);//低四位delay(1); } void lcd12864_init() {PSB=0;write12864_com(0x30);delay(5);write12864_com(0x0c);delay(5);write12864_com(0x01);delay(5); } void lcd_pos(uchar x,uchar y)//顯示位置坐標 {uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write12864_com(pos); } void display(uchar *s) {while(*s>0){write12864_data(*s);s++;delay(1);} } void main() {lcd12864_init();while(1){ lcd_pos(0,0);display(table1);lcd_pos(1,0);display(table2);lcd_pos(2,0);display(table3);lcd_pos(3,0);display(table4);} }
?
總結
以上是生活随笔為你收集整理的51单片机(六).单片机输出电路实践——LCD1602与LCD12864的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EXCEL出错 8000401a
- 下一篇: 杂志社的电子邮件地址