《電子DIY》之使用51單片機驅動LCD12864顯示器(LCD12864顯示屏介紹),ST7920,TS12864A-3(帶漢字庫)

一、LCD12864介紹:

1,實物圖:
在這裏插入圖片描述
2,LCD12864介紹
12864液晶是一種統稱,只說明類屏的一個特徵,對於液晶屏的特性則沒有說明。12864是128*64點陣液晶模塊的點陣數簡稱。
此次使用的驅動芯片爲ST7920,該顯示屏可以並行操作也可串行操作。操作電壓3.3-5V,內置中文庫

引腳定義:
在這裏插入圖片描述
顯示RAM
在這裏插入圖片描述
顯示座標關係
在這裏插入圖片描述
在這裏插入圖片描述

二,LCD12864操作時序

1,並行方式
(1)寫數據到LCD

在這裏插入圖片描述
(2)從LCD讀數據
在這裏插入圖片描述
2,串行方式
在這裏插入圖片描述
在這裏插入圖片描述
時序時間表格
在這裏插入圖片描述

三,指令集

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
指令詳細介紹

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

四,程序源碼

/*
	作者:liuxianfei0810
	文件:LCD12864顯示實驗
*/

/*                                                                 
*  LCD型號:TS12864A-3(帶漢字庫)或兼容型號  控制器ST7920      
*  MCU:51 ,晶體頻率:11.0592MHz                              
*/

#include <reg51.h>
#include <intrins.h>
	
#define uchar unsigned char
#define uint  unsigned int

/*12864端口定義*/
#define LCD_data  P0             //數據口
sbit LCD_RS  =  P2^6;            //寄存器選擇輸入 
sbit LCD_RW  =  P2^5;            //液晶讀/寫控制
sbit LCD_EN  =  P2^7;            //液晶使能控制
sbit LCD_PSB =  P3^2;            //串/並方式控制
sbit wela    =  P2^6;
sbit dula    =  P2^7;

uchar code dis1[] = {"歡迎來到我的博客"};
uchar code dis2[] = {"liuxianfei0810"};
uchar code dis3[] = {"實驗名稱:"};
uchar code dis4[] = {"LCD12864顯示實驗"};

#define delay_4us(); {_nop_();_nop_();_nop_();_nop_();};

///////////////////////function declaration/////////////////////void beep();
void delay_ms(int ms);
void lcd_pos(uchar X,uchar Y);  
void display_Init(void);
bit lcd_busy(void);
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_init(void);

///////////////////////////END//////////////////////////////////

///////////////////////function define//////////////////////////

void delay_ms(int ms)
{
    while(ms--)
	{
      uchar i;
	  for(i=0;i<250;i++)  
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}		

bit lcd_busy(void)
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delay_4us();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
}

void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    delay_4us();
    LCD_EN = 1;
    delay_4us();
    LCD_EN = 0;  
}

void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delay_4us();
    LCD_EN = 1;
    delay_4us();
    LCD_EN = 0; 
}

void lcd_init(void)
{ 

    LCD_PSB = 1;         //並口方式
    lcd_wcmd(0x34);      //擴充指令操作
    delay_ms(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay_ms(5);
    lcd_wcmd(0x0C);      //顯示開,關光標
    delay_ms(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay_ms(5);
}

void display_Init(void)
{
	uchar i=0;
    lcd_pos(0,0);             //設置顯示位置爲第一行的第1個字符
    i = 0;
    while(dis1[i] != '\0')
    {                         //顯示字符
       lcd_wdat(dis1[i]);
       i++;
    }
    lcd_pos(1,0);             //設置顯示位置爲第二行的第1個字符
    i = 0;
    while(dis2[i] != '\0')
    {
       lcd_wdat(dis2[i]);      //顯示字符
       i++;
    }
 	lcd_pos(2,0);             //設置顯示位置爲第三行的第1個字符
    i = 0;
    while(dis3[i] != '\0')
    {
       lcd_wdat(dis3[i]);      //顯示字符
       i++;
    }
	lcd_pos(3,0);             //設置顯示位置爲第四行的第1個字符
    i = 0;
    while(dis4[i] != '\0')
    {
       lcd_wdat(dis4[i]);      //顯示字符
       i++;
    }	
}

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 ;  
   lcd_wcmd(pos);    
}
///////////////////////////END//////////////////////////////////

int main()
{
    lcd_init();                  
	delay_ms(20); 
	display_Init();                 
    while(1)
	{
		
	}
	return 0;
}

五,效果圖

1,效果圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章