《电子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,效果图
在这里插入图片描述

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