天天看點

C51單片機學習筆記(六)——液晶顯示屏的使用

C51單片機學習筆記(六)——液晶顯示屏的使用

文章目錄

    • C51單片機學習筆記(六)——液晶顯示屏的使用
      • 1.LCD1602的認識
      • 2.LCD1602的引腳及其功能
      • 3.LCD子產品的内部結構
      • 4.LCD1602的工作時序
      • 5.LCD1602的指令說明
      • 6.LCD1602的程式設計執行個體

1.LCD1602的認識

  • 液晶顯示屏簡稱液晶、LCD。各種型号的液晶通常是按顯示字元的行數或液晶點陣的行、列進行命名的。1602的意思就是每一行顯示16個字元,共可以顯示2行,常見的液晶還有0801、0802、1601等,這類液晶是字元型液晶,隻能顯示ASCII碼字元。而LCD12864屬于圖形型液晶,由128*64個像素點構成,可以顯示各種圖形包括漢字。
  • LCD1602可顯示2行ASCII碼字元,每行包括16個5*10點陣(像素),有16個引腳,其實物圖如下所示:
    C51單片機學習筆記(六)——液晶顯示屏的使用

2.LCD1602的引腳及其功能

C51單片機學習筆記(六)——液晶顯示屏的使用

3.LCD子產品的内部結構

  • LCD1602子產品的内部結構分為三部分:LCD控制器、LCD驅動器、LCD顯示器
    C51單片機學習筆記(六)——液晶顯示屏的使用
  • LCD控制器和LCD驅動器一般由專用內建電路實作,大部分是HD44780或相容晶片,HD44780是低功耗CMOS大規模點陣LCD控制器,它包含有下面的電路,他們的功能如下表:
    C51單片機學習筆記(六)——液晶顯示屏的使用
  • LCD1602顯示字元的過程

    HD447780内部有80*8bit的DDRAM緩沖區,其顯示位置與DDRAM位址的對應關系如下表:

    C51單片機學習筆記(六)——液晶顯示屏的使用
  • 一行有40個位址,可以存入40個字元資料,但每行最多隻能顯示其中的16個。可以用多餘的位址存入其他資料,實作顯示的快速切換。注意:程式設計時需要将表中的位址加上80H才能正确顯示,如果要在第一行顯示“R”,應該将“R”的ASCII碼(0x52)寫到位址0x80+ox03即0x83處。

4.LCD1602的工作時序

  • LCD1602的讀操作時序
    C51單片機學習筆記(六)——液晶顯示屏的使用
    LCD1602讀操作程式設計流程:
  • 給RS加電平(1為資料,0為指令)給R/W加高電平(讀模式)
  • E = 1(使能,高電平有效),延時
  • LCD1602送資料到DB0~DB7
  • E = 0
  • 讀結束
  • LCD1602的寫操作時序
    C51單片機學習筆記(六)——液晶顯示屏的使用
    LCD1602的寫操作程式設計流程:
  • 給RS加電平(1為資料,0為指令),R/W = 0(為寫)
  • 單片機送資料到DB0~DB7
  • E = 1 (拉高使能線)
  • E = 0,寫入生效
  • 改變RS、R/W的狀态,為下次操作做準備

5.LCD1602的指令說明

C51單片機學習筆記(六)——液晶顯示屏的使用

LCD1602液晶子產品共有11條指令,下面根據上面的表格做出說明:

  • 指令一:清除顯示,指令碼為0x01,其實質是将DDRAM全部寫入空格的ASCII碼0x20,位址計數器AC清零。該過程需要時間較長。
  • 指令二:光标複位,光标傳回00H(複位到屏的左上方),位址計數器AC清零,DDRAM内容不變
  • 指令三:光标和顯示模式設定。N——設定光标的移動方向,N=1時,讀或寫一個字元後,位址加1,光标加1;N=0時,位址減1,光标減1.S——用于設定整屏字元是否左移或右移,當S= 1且N = 1時,寫一個字元整平左移,當S= 1且N = 0時,寫一個字元時整屏顯示右移,若S = 0,則整屏字元移動無效,是以常用的光标右移指令為0x06
  • 指令4:顯示開/關控制D——控制整體顯示的開與關,高電平顯示,低電平關顯示;C——控制光标的開關,高電平表示有光标,低電平無光标;B——控制光标是否杉樹,高電平閃爍,低電平不閃爍常用的開顯示關光标的指令為0x0c
  • 指令5:指令光标或字元移動。S/C控制光标或字元,R/L控制左右

    (S/C)(R/L) = (0)(0),文字不動,光标左移一格,AC減1

    (S/C)(R/L) = (0)(1),文字不動,光标右移一格,AC加1

    (S/C)(R/L) = (1)(0),文字全部右移一格,光标不動

    (S/C)(R/L) = (1)(1),文字全部左移一格,光标不動

  • 指令六:功能設定指令DL——高電平為8位資料總線,低電平為4位資料總線;N——低電平單行顯示,高電平雙行顯示;F——低電平顯示57的點陣字元,高電平顯示510的點陣字元,常用的兩行、八位資料總線、5*7的點陣指令為0x38
  • 指令七:指令為0x40+add(當D5-D0全為0時,D7~D0為0x40)該指令用于設定自定義字元的CGRAM位址。ADD前三位用于選擇字元,後三位用于選擇字元的8位字模資料
  • 指令八:指令為0x80+add,用于設定下一個要存入資料的DDRAM位址。add的範圍是0x00~0x27,對應第一行,0x40-0x67對應顯示第二行,每行可輸入40個字元,預設隻能顯示前16個,可以通過指令3的字元移動指令來顯示其他内容
  • 指令九:讀忙信号和光标位址。BF:忙标志位,高電平表示忙,此時子產品不能就收指令或資料,如果為低電平表示閑,可以操作
  • 指令10:寫資料
  • 指令11:讀資料

6.LCD1602的程式設計執行個體

  • 這是我的液晶電路原理圖,主要看一下與哪個引腳相連。
    C51單片機學習筆記(六)——液晶顯示屏的使用
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*******引腳定義*******/

sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
#define data1602 P0
sbit BF = data1602^7; //BF表示data1602的最高位,判斷是忙還是閑
/*******延時函數*******/
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
/*******忙檢測函數*******/
bit LCD_busy()
{
	bit busy;
	P0 = 0xff;//防止幹擾
	RS = 0;	 //指令模式
	RW = 1;   //讀模式
	E = 1;
	busy = BF;//将忙标志位的數值賦給busy
	E = 0;
	return busy;
}
/*******寫指令函數*******/
void LCD_write_cmd(uchar cmd)//cmd為需要寫的指令
{
	while(LCD_busy());//隻有當LCD_busy()為0(閑)時才跳出循環   
	RS = 0;		   //指令模式
	RW = 0;		   //寫模式
	data1602 = cmd;	   //将指令内容的十六進制送到P0端口
	E = 1;
	E = 0;			//使能端,高電平有效,使指令送到LCD1602的DB0~DB7
}
/*******寫資料函數*******/
void LCD_write_data(uchar dat)//dat為需要寫的資料
{
	while(LCD_busy());//隻有當LCD_busy()為0(閑)時才跳出循環   
	RS = 1;		   //資料模式
	RW = 0;		   //寫模式
	data1602 = dat;	   //将資料内容的十六進制送到P0端口
	E = 1;
	E = 0;			//使能端,高電平有效,使指令送到LCD1602的DB0~DB7
}
/*******LCD初始化函數*******/
void LCD_init()
{
	LCD_write_cmd(0x38); //将設定“兩行、八位資料、5*7的點陣”指令寫入LCD的控制器
	LCD_write_cmd(0x0c); //開顯示關光标
	LCD_write_cmd(0x06); //光标右移指令
	LCD_write_cmd(0x01); //清除顯示
}
/*******LCD寫顯示位址函數*******/
void LCD_write_address(uchar x,uchar y)
{
	x&=0x0f;  //列位址限制在0~15之間
	y&=0x01;  //行位址限制在0~1
	if(y==0)
		LCD_write_cmd(x|0x80);//資料指針=80+位址變量,寫入列位址
	else
		LCD_write_cmd((x+0x40)|0x80);	  //如果是第二行,将列位址寫入
}
/*******LCD顯示函數*******/
void LCD_display(uchar x,uchar y,uchar buf)	//x:列 y:行,buf:顯示的字元
{
	LCD_write_address(x,y);//先将位址寫入
	LCD_write_data(buf);	//再寫入要顯示的資料
}
/*******main函數*******/
void main()
{
	LCD_init();
	LCD_display(2,0,'H');
	LCD_display(3,0,'e');
	LCD_display(4,0,'l');
	LCD_display(5,0,'l');
	LCD_display(6,0,'o');
	LCD_display(8,0,'W');
	LCD_display(9,0,'o');
	LCD_display(10,0,'r');
	LCD_display(11,0,'l');
	LCD_display(12,0,'d');

	LCD_display(8,1,'W');
	LCD_display(9,1,'D');
	while(1);
}
           

效果如下:

C51單片機學習筆記(六)——液晶顯示屏的使用