一、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,效果图