12864图形显示函数
![12864图形显示函数](https://img.360docs.net/img91/1gxzz4pfaypi3yrzh7gex5z7m80fymcg-11.webp)
![12864图形显示函数](https://img.360docs.net/img91/1gxzz4pfaypi3yrzh7gex5z7m80fymcg-02.webp)
/****************************************************************************** ******************************************************************************* *********/
//程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能
//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口
//用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的
/****************************************************************************** ******************************************************************************* ********/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
//**********宏定义所需指令
#define BASIC_SET 0x30
#define EXTEND_SET 0x34
#define DRAW_ON 0x36
#define DRAW_OFF 0x34
//*************端口定义
sbit LCD_RS = P0^0;
sbit LCD_RW = P0^1;
sbit LCD_EN = P0^2;
//************变量定义
//uchar dis1[10];
//读出缓存
unsigned char tu[];
//****************短延时
void delay(uint k)
{
uint i;
uchar j;
for(i = 0; i < k ;i ++)
for(j = 0; j < 10 ;j ++);
}
//***********ms级延时函数
/*void delay_1ms(uint x)
{
uint i,j;
for(j = 0;j < x; j++)
for(i = 0;i < 110; i++);
} */
//***********12864写指令函数
void write_com(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
delay(5);
LCD_EN = 1;
P2 = cmd;
delay(5);
LCD_EN = 0;
}
//********12864写数据函数
void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
delay(5);
LCD_EN = 1;
P2 = dat;
delay(5);
LCD_EN = 0;
}
//****************从LCD中读数据
uchar read_dat(void)
{
uchar temp;
P2 = 0XFF; //释放数据线
LCD_RS = 1; //数据
LCD_RW = 1; // 读模式
LCD_EN = 1; //E为高电平进行读数据或指令delay(1);
temp = P2;
LCD_EN = 0;
return temp;
}
//********************************************************
//设置光标(地址)函数
//参数说明:x---为行号,y为列号
//********************************************************
void set_cursor(unsigned char x, unsigned char y)
{
unsigned char i;
switch(x) //确定行号
{
case 0x00: i=0x80; break; //第一行
case 0x01: i=0x90; break; //第二行
case 0x02: i=0x88; break; //第三行
case 0x03: i=0x98; break; //第四行
default : break;
}
i = y+i; //确定列号
write_com(i);
}
//********************************************************
//显示字符函数
//********************************************************
/*void display_char(unsigned char Alphabet)
{
write_dat(Alphabet); //写入需要显示字符的显示码
} */
//********************************************************
//指定位置显示字符串函数
//参数说明:x为行号,y为列号
//********************************************************
/*void display_string(unsigned char x,unsigned char y,unsigned char *Alphabet) {
unsigned char i=0;
set_cursor(x,y); //设置显示的起始地址
while(Alphabet[i]!='\0')
{
write_dat(Alphabet[i]); //写入需要显示字符的显示码
i++;
}
} */
//***************************************************************************以下为GDRAM绘图部分************************************************************************//
//*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!!!!!!!
void gui_clear()
{
uchar i , j , k;
write_com(EXTEND_SET);//扩展指令集,8位数据传输
write_com(DRAW_OFF);//绘图显示关闭
for(i = 0; i < 2; i ++)//分上下两屏写
{
for(j = 0; j < 32; j ++)
{
write_com(0x80 + j);//写y坐标
delay(1);
if(i == 0) //写x坐标
{
write_com(0x80);
delay(1);
}
else //写下半屏
{
write_com(0x88);
delay(1);
}
for(k = 0; k < 16; k ++)//写一整行数据
{
// write_dat(0x00);//写高字节
// write_dat(0x00);//写低字节
delay(10);
}
}
}
write_com(DRAW_ON);//打开绘图显示
write_com(BASIC_SET);//打开基本指令集
}
//************************************************************************//
//*********************清内部RAM************************//
void clrgdram()
{
unsigned char x,y ;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80);
//行地址
write_com(x+0x80);
//列地址
write_com(0x30);
write_dat(0x00);
write_dat(0x00);
}
}
//***************************************************************************** ********************
//***************有反白显示功能的打点函数**********************************************************
//参数:color=1,该点填充1;color=0,该点填充白色0;
//***************************************************************************** ********************
void GUI_Point(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位
unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
unsigned char GDRAM_hbit,GDRAM_lbit;
write_com(0x36); //扩展指令命令
//***X,Y坐标互换,即普通的X,Y坐标**
x_Dyte=x/16; //计算在16个字节中的哪一个
x_byte=x&0x0f; //计算在该字节中的哪一位
y_Dyte=y/32; //0为上半屏,1为下半屏
y_byte=y&0x1f; //计算在0~31当中的哪一行
write_com(0x80+y_byte); //设定行地址(y坐标),即是垂直地址write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏,即是水平地址
read_dat(); //预读取数据
GDRAM_hbit= read_dat(); //读取当前显示高8位数据
GDRAM_lbit= read_dat(); //读取当前显示低8位数据
delay(1);
write_com(0x80+y_byte); //设定行地址(y坐标)
write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
delay(1);
if(x_byte<8) //判断其在高8位,还是在低8位
{
if(color==1)
{
write_dat(GDRAM_hbit|(0x01<<(7-x_byte))); //置位GDRAM区高8位数据中相应的点
}
else
write_dat(GDRAM_hbit&(~(0x01<<(7-x_byte)))); //清除GDRAM区高8位数据中相应的点
write_dat(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
write_dat(GDRAM_hbit);
if(color==1)
write_dat(GDRAM_lbit|(0x01<<(15-x_byte))); //置位GDRAM区高8位数据中相应的点
else
write_dat(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点
}
write_com(0x30); //恢复到基本指令集
}
//***********(给定坐标并打点的)任意位置打点函数
/*void lcd_set_dot(uchar x,uchar y)
{
uchar x_byte,x_bit;//确定在坐标的那一字节哪一位
uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行
uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据
write_com(EXTEND_SET);//扩展指令集
write_com(DRAW_OFF);//绘图显示关闭
x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的
x_bit = x % 16;//& 0x0f;//算出在哪一位
y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏
y_bit = y % 32;//& 0x1f;//确定在第几行
write_com(0X80 + y_bit);//先写垂直地址(最高位必须)
write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏
read_dat();//预读取数据
tmph = read_dat();//读取当前显示高8位数据
tmpl = read_dat();//读取当前显示低8位数据
delay(1);
write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下
write_com(0x80 + x_byte + 8 * y_ping);
delay(1);
if(x_bit < 8)
{
write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM 高位在左,低位在右
write_dat(tmpl);//原低位数据送回
}
else
{
write_dat(tmph);//原高位数据送回
write_dat(tmpl | (0x01 << (15 - x_bit)));
}
write_com(DRAW_ON); //打开绘图显示
write_com(BASIC_SET);//回到基本指令集
} */
//************画水平线函数**********************************//
//x0、x1为起始点和终点的水平坐标,y为垂直坐标***************//
//**********************************************************//
/*void gui_hline(uchar x0, uchar x1, uchar y)
{
uchar bak;//用于对两个数互换的中间变量,使x1为大值
if(x0 > x1)
{
bak = x1;
x1 = x0;
x0 = bak;
}
do
{
lcd_set_dot(x0 , y);//从左到右逐点显示
x0 ++;
}while(x1 >= x0);
} */
//***********画竖直线函数***********************************// //x为起始点和终点的水平坐标,y0、y1为垂直坐标***************// //**********************************************************// /*void gui_rline(uchar x, uchar y0, uchar y1)
{
uchar bak;//用于对两个数互换的中间变量,使y1为大值
if(y0 > y1)
{
bak = y1;
y1 = y0;
y0 = bak;
}
do
{
lcd_set_dot(x , y0);//从上到下逐点显示
y0 ++;
}while(y1 >= y0);
} */
//*********任意两点间画直线*********************************// //x0、y0为起始点坐标,x1、y1为终点坐标**********************// //**********************************************************// /*void gui_line(uchar x0 , uchar y0 , uchar x1 , uchar y1)
{
char dx;//直线x轴差值
char dy;//直线y轴差值
char dx_sym;//x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym;//y轴增长方向,为-1时减值方向,为1时增值方向
char dx_x2;//dx*2值变量,用于加快运算速度char dy_x2;//dy*2值变量,用于加快运算速度char di; //决策变量
if(x0 == x1)//判断是否为垂直线
{
gui_rline(x0 , y0 , y1);//画垂直线
return;
}
if(y0 == y1)//判断是否为水平线
{
gui_hline(x0 , x1 , y0);//画水平线
return;
}
dx = x1 - x0;//求取两点之间的差值
dy = y1 - y0;
//判断增长方向,或是否为水平线、垂直线、点if(dx > 0)//判断x轴方向
dx_sym = 1;
else
{
if(dx < 0)
dx_sym = -1;
else
{
gui_rline(x0 , y0 , y1);
return;
}
}
if(dy > 0)//判断y轴方向
dy_sym = 1;
else
{
if(dy < 0)
dy_sym = -1;
else
{
gui_hline(x0 , x1 , y0);
return;
}
}
//*将dx、dy取绝对值**********
dx = dx_sym * dx;
dy = dy_sym * dy;
//****计算2倍的dx、dy值******
dx_x2 = dx * 1;//我改为了一倍,这样才跟真实的两点对应dy_x2 = dy * 1;
//***使用bresenham法进行画直线***
if(dx >= dy)//对于dx>=dy,使用x轴为基准
{
di = dy_x2 - dx;
while(x0 != x1)
{
lcd_set_dot(x0,y0);
x0 +=dx_sym;
if(di < 0)
di += dy_x2;//计算出下一步的决策值
else
{
di += dy_x2 - dx_x2;
y0 += dy_sym;
}
}
lcd_set_dot(x0, y0);//显示最后一点
}
else //对于dx { di = dx_x2 - dy; while(y0 != y1) { lcd_set_dot(x0, y0); y0 += dy_sym; if(di < 0) di += dx_x2; else { di += dx_x2 - dy_x2; x0 += dx_sym; } } lcd_set_dot(x0, y0);//显示最后一点 } } */ //***************************************************************************// //*******************画指定宽度的任意两点之间的直线**************************// //参数说明:x0、y0为起始点坐标,x1、y1为终点坐标,with为线宽*****************// //***************************************************************************// /*void gui_linewith(uchar x0 , uchar y0 , uchar x1 , uchar y1 , uchar with) { char dx; // 直线x轴差值变量 char dy; // 直线y轴差值变量 char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2; // dx*2值变量,用于加快运算速度 char dy_x2; // dy*2值变量,用于加快运算速度 char di; // 决策变量 char wx, wy; // 线宽变量 char draw_a, draw_b; // 参数过滤 if(with==0) return; if(with>50) with = 50; dx = x1-x0; // 求取两点之间的差值 dy = y1-y0; wx = with/2; wy = with-wx-1; //判断增长方向,或是否为水平线、垂直线、点 if(dx>0) // 判断x轴方向 { dx_sym = 1; // dx>0,设置dx_sym=1 } else { if(dx<0) { dx_sym = -1; // dx<0,设置dx_sym=-1 } else { //dx==0,画垂直线,或一点 wx = x0-wx; if(wx<0) wx = 0; wy = x0+wy; while(1) { x0 = wx; gui_rline(x0, y0, y1); if(wx>=wy) break; wx++; } return; } } if(dy>0) // 判断y轴方向 { dy_sym = 1; // dy>0,设置dy_sym=1 } else { if(dy<0) { dy_sym = -1; // dy<0,设置dy_sym=-1 } else { //dy==0,画水平线,或一点 wx = y0-wx; if(wx<0) wx = 0; wy = y0+wy; while(1) { y0 = wx; gui_hline(x0, x1, y1); if(wx>=wy) break; wx++; } return; } } // 将dx、dy取绝对值 dx = dx_sym * dx; dy = dy_sym * dy; //计算2倍的dx及dy值 dx_x2 = dx*2; dy_x2 = dy*2; //使用Bresenham法进行画直线 if(dx>=dy) // 对于dx>=dy,则使用x轴为基准{ di = dy_x2 - dx; while(x0!=x1) { //x轴向增长,则宽度在y方向,即画垂直线 draw_a = y0-wx; if(draw_a<0) draw_a = 0; draw_b = y0+wy; gui_rline(x0, draw_a, draw_b); x0 += dx_sym; if(di<0) { di += dy_x2; // 计算出下一步的决策值 } else { di += dy_x2 - dx_x2; y0 += dy_sym; } } draw_a = y0-wx; if(draw_a<0) draw_a = 0; draw_b = y0+wy; gui_rline(x0, draw_a, draw_b); } else // 对于dx { di = dx_x2 - dy; while(y0!=y1) { //y轴向增长,则宽度在x方向,即画水平线 draw_a = x0-wx; if(draw_a<0) draw_a = 0; draw_b = x0+wy; gui_hline(draw_a, y0, draw_b); y0 += dy_sym; if(di<0) { di += dx_x2; } else { di += dx_x2 - dy_x2; x0 += dx_sym; } } draw_a = x0-wx; if(draw_a<0) draw_a = 0; draw_b = x0+wy; gui_hline(draw_a, y0, draw_b); } } */ //***********画矩形函数*************************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// /*void gui_rectangle(uchar x0 , uchar y0 , uchar x1 , uchar y1) { gui_hline(x0 , x1 , y0); gui_rline(x0 , y0 , y1); gui_rline(x1 , y0 , y1); gui_hline(x0 , x1 , y1); }*/ //****************画填充矩形函数****************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// /*void gui_rectangle_fill(uchar x0 , uchar y0 , uchar x1 , uchar y1) { uchar i;//转换数据的中间变量,使x1、y1大 if(x0 > x1) { i = x0; x0 = x1; x1 = i; } if(y0 > y1) { i = y0; y0 = y1; y1 = i; } //***判断是否是直线***/ /* if(y0 == y1)//画水平线 { gui_hline(x0 , x1 , y0); return; } if(x0 == x1)//画竖直线 { gui_rline(x0 , y0 , y1); return; } while(y0 <= y1)//画填充矩形 { gui_hline(x0 , x1 , y0); y0 ++; } } */ //*******************画正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长****************// //********************************************************// /*void gui_square(uchar x0 , uchar y0 , uchar with) { if(with == 0) return; if((x0 + with) > 127)//横轴超出液晶边界 return; if((y0 + with) > 63) return; gui_rectangle(x0 , y0 , x0 + with , y0 + with); } */ //****************画填充正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长*****************// //*********************************************************// /*void gui_square_fill(uchar x0 , uchar y0 , uchar with) { if(with == 0) return; if((x0 + with) > 127)//横轴超出液晶边界 return; if((y0 + with) > 63) return; gui_rectangle_fill(x0 , y0 , x0 + with , y0 + with); } */ //****************画圆函数*********************************// //x0、y0为圆心坐标,r为圆的半径****************************// //*********************************************************// /*void gui_circle(uchar x0 , uchar y0 , uchar r) { char a , b; char di; if(r > 31 || r == 0)//圆大于液晶屏或者没半径则返回 return; a = 0; b = r; di = 3 - 2 * r;//判断下个点位置的标志 while(a <= b) { lcd_set_dot( x0 - b , y0 - a);//3 lcd_set_dot( x0 + b , y0 - a); //0 lcd_set_dot( x0 - a , y0 + b); //1 lcd_set_dot( x0 - b , y0 - a); //7 lcd_set_dot( x0 - a , y0 - b); //2 lcd_set_dot( x0 + b , y0 + a); //4 lcd_set_dot( x0 + a , y0 - b); //5 lcd_set_dot( x0 + a , y0 + b); //6 lcd_set_dot( x0 - b , y0 + a); a ++; //***使用bresenham算法画圆******** if(di < 0) else { di += 10 + 4 * (a - b); b --; } lcd_set_dot( x0 + a , y0 + b); } } */ //***************************************************************************// //***************************画正椭圆函数************************************// //说明:给定椭圆的四个点的参数,最左、最右点的x轴坐标值为x0、x1,最上、最下点// 的y轴坐标为y0、y1. //说明:----------------------------显示效果不好 //***************************************************************************// /*void gui_ellipse(char x0, char x1, char y0, char y1) { char draw_x0, draw_y0; // 刽图点坐标变量 char draw_x1, draw_y1; char draw_x2, draw_y2; char draw_x3, draw_y3; char xx, yy; // 画图控制变量 char center_x, center_y; // 椭圆中心点坐标变量 char radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径 int radius_xx, radius_yy; // 半径乘平方值 int radius_xx2, radius_yy2; // 半径乘平方值的两倍 char di; // 定义决策变量 ///* 参数过滤 if( (x0==x1) || (y0==y1) ) return; ///* 计算出椭圆中心点坐标 center_x = (x0 + x1) >> 1; center_y = (y0 + y1) >> 1; ///* 计算出椭圆的半径,x轴半径和y轴半径 if(x0 > x1) { radius_x = (x0 - x1) >> 1; } else } if(y0 > y1) { radius_y = (y0 - y1) >> 1; } else { radius_y = (y1 - y0) >> 1; } ///* 计算半径平方值 radius_xx = radius_x * radius_x; radius_yy = radius_y * radius_y; ///* 计算半径平方值乘2值 radius_xx2 = radius_xx<<1; radius_yy2 = radius_yy<<1; ///* 初始化画图变量 xx = 0; yy = radius_y; di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量 ///* 计算出椭圆y轴上的两个端点坐标,作为作图起点 draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x; draw_y0 = draw_y1 = center_y + radius_y; draw_y2 = draw_y3 = center_y - radius_y; lcd_set_dot(draw_x0, draw_y0); // 画y轴上的两个端点lcd_set_dot(draw_x2, draw_y2); while( (radius_yy*xx) < (radius_xx*yy) ) { if(di<0) { di+= radius_yy2*(2*xx+3); } else { di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy; yy--; draw_y0--; draw_y1--; draw_y2++; draw_y3++; } xx ++; // x轴加1 draw_x0++; draw_x1--; draw_x2++; draw_x3--; lcd_set_dot(draw_x0, draw_y0); lcd_set_dot(draw_x1, draw_y1); lcd_set_dot(draw_x2, draw_y2); lcd_set_dot(draw_x3, draw_y3); } di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy; while(yy>=0) { if(di<0) { di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy; xx ++; // x轴加1 draw_x0++; draw_x1--; draw_x2++; draw_x3--; } else { di += radius_xx2*3 - 2*radius_xx2*yy; } yy--; draw_y0--; draw_y1--; draw_y2++; draw_y3++; lcd_set_dot(draw_x0, draw_y0); lcd_set_dot(draw_x1, draw_y1); lcd_set_dot(draw_x2, draw_y2); lcd_set_dot(draw_x3, draw_y3); } } */ //******************************************************************* //*******画满屏图片-----本程序为逐行写,因此图片数据也应该是逐行取的 //参数:dat为填充的数据------用本程序时需要满屏图的数组 //******************************************************************* /*void gui_draw_full_picture (unsigned char *dat) { unsigned char i; unsigned char j; unsigned char k; unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址 unsigned char bGDRAMAddrY = 0x80; //GDRAM垂直地址 for(i = 0; i < 2; i++) { for(j = 0; j < 32; j++) { for(k = 0; k < 8; k++) { write_com(0x34); //设置为8位MPU接口,扩充指令集,关闭绘图显示 write_com(bGDRAMAddrY+j); //垂直地址Y write_com(bGDRAMAddrX+k); //水平地址X write_dat(*dat++); //写数据高字节 write_dat(*dat++); //写数据低字节 } } bGDRAMAddrX = 0x88; //写下半屏幕 } write_com(0x36); //打开绘图模式 write_com(0x30); //恢复基本指令集,关闭绘图模式 } */ unsigned char code DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; //****************************输出一行数据函数,此行可任意长,不必非得是8的倍数**和下个函数合用画任意大小(矩形)的图形或汉字 //参数:flag反显标志,1为反显,x、y为指定显示位置的起始点,*dat要输出的点阵数组,no显示此行所需的点个数,即图形一行的点数 void gui_loadline(unsigned char x,unsigned char y,unsigned char *dat,unsigned char no,unsigned char flag) 51单片机综合学习 12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚 5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入 到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。 12864液晶 一、概述 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: l 低电源电压(VDD:+3.0--+5.5V) l 显示分辨率:128×64点 l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) l 内置 128个16×8点阵字符 l 2MHZ时钟频率 l 显示方式:STN、半透、正显 l 驱动方式:1/32DUTY,1/5BIAS l 视角方向:6点 l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 l 通讯方式:串行、并口可选 l 内置DC-DC转换电路,无需外加负压 l 无需片选信号,简化软件设计 l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明 *注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 管脚号管脚名称电平管脚功能描述 1 VSS 0V 电源地 2 VCC 3.0+5V 电源正 3 V0 - 对比度(亮度)调整 RS=“H”,表示DB7——DB0为显示数据 4 RS(CS)H/L RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0 5 R/W(SID) H/L R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR 6 E(SCLK) H/L 使能信号 7 DB0 H/L 三态数据线 8 DB1 H/L 三态数据线 9 DB2 H/L 三态数据线 10 DB3 H/L 三态数据线 11 DB4 H/L 三态数据线 12 DB5 H/L 三态数据线 13 DB6 H/L 三态数据线 14 DB7 H/L 三态数据线 15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1) 16 NC - 空脚 17 /RESET H/L 复位端,低电平有效(见注释2) 18 VOUT - LCD驱动电压输出端 19 A VDD 背光源正端(+5V)(见注释3) 20 K VSS 背光源负端(见注释3) 在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图 从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图: 根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ; 12864点阵型液晶显示屏的基本原理与使用方法(很详细) 点阵LCD的显示原理 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示: 图1“A”字模图 而中文的“你”在字模中的记载却如图2所示: 图2“你”字模图 12864点阵型LCD简介 12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。 管脚号管脚名称LEVER管脚功能描述 1VSS0电源地 2VDD+5.0V电源电压 3V0-液晶显示器驱动电压 4D/I(RS)H/L D/I=“H”,表示DB7∽DB0为显示数据 D/I=“L”,表示DB7∽DB0为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DR 6E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 7DB0H/L数据线 8DB1H/L数据线 9DB2H/L数据线 10DB3H/L数据线 11DB4H/L数据线 12DB5H/L数据线 13DB6H/L数据线 14DB7H/L数据线 15CS1H/L H:选择芯片(右半屏)信号 16CS2H/L H:选择芯片(左半屏)信号 17RET H/L复位信号,低电平复位 LCD12864图形液晶并口显示 【教学引入】 液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。 液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。 【教学目标】 1、掌握LCD12864液晶屏的用法; 2、编写LCD12864液晶屏的指令代码; 【知识目标】 1、掌握LCD12864液晶屏的用法; 2、掌握LCD12864液晶屏指令代码; 【教学准备】 电脑、Proteus、Keil 【教学方法】 教法:讲授法、讨论法 学法:练习法、探究法 【教学课时】 四课时 【教学过程】 一、12864液晶介绍 (1)12864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称。12864点阵的屏显成本相对较低,适用于各类仪器,小型设备的显示领域。12864M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。 12864引脚说明 查阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集 1、指令表1:(RE=0:基本指令表),如下图,讲解了12864的基本指令集和扩充指令集。 当模块在接受指令前,微处理器必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0。“RE”为基本指令集与扩充指令集的选择控制位元,往后的指令集将维持在最后的状态。 当选择G=0 :绘图显示OFF,汉字显示的时,12864屏只能显示8X4=32个汉字,下面是汉字显示的坐标 二、12864液晶屏驱动电路 AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。 三、52代码编写 (1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类型*.uvproj,单片机型号AT89C52。在工程中添加12864 graphic LCD parallel display.c文件,如下图 12864LCD液晶显示屏中文资料 一、概述 二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 三、基本特性: (1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置 128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(11)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明: *注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 看到工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理解的 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那datasheet上关于画图那部分的内容不怎么看得懂…。现在重新拿起来看,依然一头雾水……。马上上网百度了一下“12864 7920 显示图片”,看到了不少的例子程序,可是……就是没看到有关于这部分功能实现的详细思路和讲解……下载下来的那些程序,基本上没注释,不是说晦涩难懂,但是至少看起来一团糟,让人家不想继续看下去……于是还是硬着头皮去啃那datasheet。上面对于画图这部分的内容是这样讲解的: 12864LCD液晶显示原理及使用方法 液晶简介 液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。 点阵式图形液晶显示屏是 LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。 12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。分为两种,带字库的和不带字库的。不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。带字库的LCD提供字库字模,但是只能显示GB2312的宋体。各有优缺点,根据不同应用场景灵活选择。其液晶模块原理图如下所示。 12864LCD点阵图形液晶模块原理框图 下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。 如下表所示:12864LCD 的引脚说明 管脚号管脚名称LEVER 管脚功能描述 1GND 0 电源地 2VCC+5.0V 电源电压 3VLCD - 液晶显示器驱动电压 4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据 D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0 用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性 开始画图 保存文件,注意格式: ②、然后进行取模。 ③、编程: #include 课程设计(论文)任务书 电气与电子工程学院系自动化专业13—2 班级 一、课程设计(论文)题目简易信号发生器的设计 二、课程设计(论文)工作自2016 年 1 月 5 日起至2016 年 1 月 14 日止。 三、课程设计(论文)的内容要求: 课程设计不仅仅要求学生完成所规定的题目要求,同时还要培养学生良好的科学态度和严谨的设计习惯。课程设计报告要求内容如下: (1)设计思想和设计说明 (2)硬件原理框图 (3)硬件原理图与软件配合介绍 (4)程序存储器和数据存储器的单元分配(5) 程序流程图 (6)系统功能描述 (7) 设计调试过程总结 (8) 附录里面包括:芯片资料、源程序清单和符合制图规范的硬件原理图的图纸。 设计要求内容: 用D/A实现正弦信号,三角波信号,方波信号的输出,并且在LCD上显示出当前波形。要求输出信号的频率和幅度可调。 设计内容: (1)满足设计要求内容。 (2)扩展锯齿波波形输出。 (3)汉字显示当前波形形状与当前频率的大小 学生签名 年月日课程设计(论文)评审意见 (1)题目复杂程度:复杂()、较复杂()、一般()、简单() (2)总体方案的选择是否正确:正确()、较正确()、欠正确()、不正确() (3) 系统能否满足任务要求:满足()、较满足()、欠满足()、不满足() (4) 元器件选择是否合理:合理()、较合理()、欠合理()、不太合理() (5) 学习实践态度:好()、较好()、一般()、不太好() (6) 独立工作能力:强()、较强()、一般()、较差() (7) 回答问题是否正确:正确()、较正确()、基本正确()、大多不正确() (8) 图表是否符合标准:符合()、较符合()、基本符合()、大多不符合() (9) 撰写是否规范整洁:规范整洁()、较规范()、欠规范()、不太规范() 总评成绩:优()、良()、中()、及格()、不及格() 评阅人职称副教授 2016 年 1 月日 FYD12864液晶中文显示模块 (一) (一)概述 (3) (二)(二)外形尺寸 1 方框图 (3) 2 外型尺寸图 (4) (三)(三)模块的接口 (4) (四)(四)硬件说明 (5) (五) 指令说明 (7) (五)(五)读写操作时序 (8) (六)(六)交流参数 (11) (七)(七)软件初始化过程 (12) (八)(八)应用举例 (13) (九)(九)附录 1半宽字符表 (20) 2 汉字字符表 (21) 一、概述 FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: ●●低电源电压(VDD:+3.0--+5.5V) ●●显示分辨率:128×64点 ●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) ●●内置 128个16×8点阵字符 ●●2MHZ时钟频率 ●●显示方式:STN、半透、正显 ●●驱动方式:1/32DUTY,1/5BIAS ●●视角方向:6点 ●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选 ●●内置DC-DC转换电路,无需外加负压 ●●无需片选信号,简化软件设计 ●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 二、方框图 3、外形尺寸图 一、液晶显示模块概述 12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵,16*8=128,16*4=64,一行只能写8个汉字,4行;)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。主要技术参数和显示特性: 电源:VDD 3.3V~+5V(内置升压电路,无需负压); 显示内容:128列× 64行(128表示点数) 显示颜色:黄绿 显示角度:6:00钟直视 LCD类型:STN 与MCU接口:8位或4位并行/3位串行 配置LED背光 多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等 二、外形尺寸 1.外形尺寸图 2.主要外形尺寸 二、模块引脚说明 逻辑工作电压(VDD):4.5~5.5V 电源地(GND):0V 工作温度(Ta):0~60℃(常温) / -20~75℃(宽温) 三、接口时序 模块有并行和串行两种连接方法(时序如下): 8位并行连接时序图 MPU写资料到模块 MPU从模块读出资料 2、串行连接时序图 串行数据传送共分三个字节完成: 第一字节:串口控制—格式 11111ABC A 为数据传送方向控制:H 表示数据从LCD 到MCU ,L 表示数据从MCU 到LCD B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令 C 固定为0 第二字节:(并行)8位数据的高4位—格式 DDDD0000 第三字节:(并行)8位数据的低4位—格式 0000DDDD 串行接口时序参数:(测试条件:T=25℃ VDD=4.5V) 备注: 1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF 标志时BF 需为0,方可接受新的指令;如果在送出一个指令前并不检查BF 标志,(一般在输入每天指令前加个delay )那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。 2、“RE ”为基本指令集与扩充指令集的选择控制位元,当变更“RE ”位元后,往后的指令集将维持在最后的状态,除非再次变更“ RE ”位元,否则使用相同指令集时,不需每次重设“RE ”位元。 具体指令介绍: 1、清除显示 CODE : 功能:清除显示屏幕,把DDRAM 位址计数器调整为“00H ” 2、位址归位 CODE : 功能:把DDRAM 位址计数器调整为“00H ”,游标回原点,该功能不影响显示DDRAM 3、位址归位 CODE : 功能:把DDRAM 位址计数器调整为“00H ”,游标回原点,该功能不影响显示DDRAM 功能:执行该命令 12864液晶屏学习手册 一、液晶显示模块概述 12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵,16*8=128,16*4=64,一行只能写8个汉字,4行;)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。主要技术参数和显示特性: 电源:VDD 3.3V~+5V(内置升压电路,无需负压); 显示内容:128列× 64行(128表示点数) 显示颜色:黄绿 显示角度:6:00钟直视 LCD类型:STN 与MCU接口:8位或4位并行/3位串行 配置LED背光 多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等 二、外形尺寸 1.外形尺寸图 2.主要外形尺寸 二、模块引脚说明 逻辑工作电压(VDD):4.5~5.5V 电源地(GND):0V 工作温度(Ta):0~60℃(常温) / -20~75℃(宽温) 三、接口时序 模块有并行和串行两种连接方法(时序如下): 8位并行连接时序图 MPU写资料到模块 MPU从模块读出资料 2、串行连接时序图 串行数据传送共分三个字节完成: 第一字节:串口控制—格式11111ABC A为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令 C固定为0 第二字节:(并行)8位数据的高4位—格式DDDD0000 第三字节:(并行)8位数据的低4位—格式0000DDDD 串行接口时序参数:(测试条件:T=25℃VDD=4.5V) 备注: 1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,(一般在输入每天指令前加个delay)那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。 2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。 具体指令介绍: /****************************************************************************** * * 描述: * * 12864标准字库液晶演示数据p0,控制p2 * ******************************************************************************* */ #include 128*64LCD液晶显示屏中文资料 一、概述 二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 三、基本特性: (1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(11)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明: *注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 #include 目录 一、概述 (2) 二、系统总体方案及硬件设计 (2) 系统框图 (3) 单片机最小系统 (4) 显示电路 (6) 按键控制电路 (6) ] 三、系统软件设计 (9) 软件设计概述 (9) 汉字显示 (10) 上下移屏 (10) 左右移屏 (11) 四、课程设计体会 (13) 五、参考文献 (13) 六、附录 (14) … 总电路图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % 一、概述 / 随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD 的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。 本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机AT89S51,采用的液晶显示控制器的芯片是SED1520,主要实现由按键控制的中文显示、图片显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。本系统是以单片机的C语言来进行软件设计,指令的执行速度快,可读性强。为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。最后对我所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。 二、系统总体方案及硬件设计 系统框图12864液晶显示图片原理(完整版)
带字库12864液晶详解
玩转12864液晶(1)--显示字符
12864点阵型液晶显示屏的基本原理与使用方法(很详细)
LCD12864图形液晶并口显示
LCD12864中文资料
12864显示图形
12864LCD液晶显示原理及使用方法
在12864显示任意图片及参考程序
函数信号发生器的设计(12864实现动态波形显示)
LCD12864液晶显示模块(中文资料)
12864液晶资料
12864液晶使用手册
单片机12864动态波形显示
Lcd12864最全中文资料
12864液晶显示程序(图案+文字)
单片机LCD12864显示系统课程设计