标题:
lcd12864液晶驱动 画点 画线 写入7*5像素数字 汉字
[打印本页]
作者:
51hei学习技术中
时间:
2017-3-6 03:29
标题:
lcd12864液晶驱动 画点 画线 写入7*5像素数字 汉字
0.png
(62.37 KB, 下载次数: 66)
下载附件
2017-3-6 03:24 上传
下载:
12864b-资料.zip
(2.75 MB, 下载次数: 76)
2017-3-6 03:29 上传
点击文件名下载附件
下载积分: 黑币 -5
主程序:
#include <reg52.h>
#include <math.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0
#define DELAYMS 80
sbit RS_Port = P1^0;
sbit RW_Port = P1^1;
sbit E_Port = P2^5;
sbit PSB_Port = P1^2;
sbit RST_Port = P1^4;
xchar CorpInf[]=
{
"自定义的汉字数组"
"自定义的汉字数组"
"自定义的汉字数组"
"自定义的汉字数组"
};
//用来显示数字0-9,每个数字7行*5列,将一竖排储存为一个字节,最高位为0
unsigned char xdata ucxFigure[10][5]=
{
{0x3E,0x51,0x49,0x45,0x3E},//0
{0x00,0x42,0x7F,0x40,0x00},//1
{0x42,0x61,0x51,0x49,0x46},//2
{0x21,0x41,0x45,0x2B,0x31},//3
{0x18,0x14,0x12,0x7F,0x10},//4
{0x27,0x45,0x45,0x45,0x39},//5
{0x3C,0x4A,0x49,0x49,0x30},//6
{0x01,0x71,0x09,0x05,0x03},//7
{0x36,0x49,0x49,0x49,0x36},//8
{0x06,0x49,0x49,0x29,0x1E},//9
};
/*******************************************************
* 函 数 名:void delay(uchar uc_dly)
* 功能描述:短延时函数
* 函数说明:用于弥补MPU和单片机在执行时序上的差异
* 输入参数:(1)uchar ui_dly
* 返 回 值:无
*******************************************************/
#pragma disable //在函数前声明,只对一个函数有效,该函数在调用过程中将不可被中断。
void delay(uint ui_dly)
{
while (ui_dly--);
}
/*******************************************************
* 函 数 名:void delays()
* 功能描述:长延时函数
* 函数说明:测试时两画面之间的延时
* 输入参数:无
* 返 回 值:无
*******************************************************/
#pragma disable
void delays()
{
uchar uc_dly,uc_dly1,uc_dly2;
uc_dly =DELAYMS;
while (uc_dly --)
{
for (uc_dly1=0;uc_dly1<50;uc_dly1++)
for (uc_dly2=0;uc_dly2<50;uc_dly2++);
};
}
/*******************************************************
* 函 数 名:void rdbf(void)
* 功能描述:读忙状态
* 函数说明:读忙状态
* 输入参数:无
* 返 回 值:无
*******************************************************/
void rdbf(void)
{
unsigned int nTimeOut = 0 ;
RS_Port=0;
RW_Port=1;
E_Port=0;
E_Port=1;
while( ( DataPort & 0x80 ) && ( ++nTimeOut != 0 ) ) ;
E_Port=0;
RS_Port=0;
RW_Port=1;
}
/*******************************************************
* 函 数 名:void wr_cmd(uchar cmd)
* 功能描述:写指令
* 函数说明:往12864b写指令
* 输入参数:uchar cmd
* 返 回 值:无
*******************************************************/
#pragma disable
void wr_cmd(uchar cmd)
{
rdbf();
RS_Port=0;
RW_Port=0;
E_Port=1;
DataPort=cmd;
E_Port=0;
}
/*******************************************************
* 函 数 名:void wr_dat(uchar dat)
* 功能描述:写数据
* 函数说明:往12864b写数据
* 输入参数:uchar dat
* 返 回 值:无
*******************************************************/
#pragma disable
void wr_dat(uchar dat)
{
rdbf();
RS_Port=1;
RW_Port=0;
E_Port=1;
DataPort=dat;
E_Port=0;
}
/*******************************************************
* 函 数 名:unsigned char rd_dat( void )
* 功能描述:读数据
* 函数说明:从12864b读数据
* 输入参数:无
* 返 回 值:unsigned char byReturnValue
*******************************************************/
#pragma disable
unsigned char rd_dat( void )
{
unsigned char byReturnValue ;
DataPort = 0xff ;
rdbf();
RS_Port=1;
RW_Port=1;
E_Port=0;
E_Port=1;
byReturnValue = DataPort ;
E_Port=0;
return byReturnValue ;
}
/*******************************************************
* 函 数 名:void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
* 功能描述:画点
* 函数说明:在制定位置画一个像素的点
* 输入参数:unsigned char X, unsigned char Y, unsigned char Color
* X为列,Y为行,COLOR为不显示、显示或者翻转(0、1、2)
* 返 回 值:无
*******************************************************/
void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
{
unsigned char Row , Tier , Tier_bit ;
unsigned char ReadOldH, ReadOldL ;
Tier = X >> 4 ;
Tier_bit = X & 0x0f ;
if( Y < 32 )
{
Row = Y ;
}
else
{
Row = Y - 32 ;
Tier += 8 ;
}
wr_cmd(Row + 0x80); //写入行坐标
wr_cmd(Tier + 0x80); //写入列坐标
rd_dat();
ReadOldH = rd_dat() ; //读出原始数据
ReadOldL = rd_dat() ;
wr_cmd(Row + 0x80);
wr_cmd(Tier + 0x80);
if( Tier_bit < 8 )
{
switch( Color)
{
case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ; //不显示
case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ; //显示
case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit )) ; break ; //翻转
default : break ;
}
wr_dat(ReadOldH); //写入新数据
wr_dat(ReadOldL);
}
else
{
switch(Color)
{
case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;
case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit )) ; break ;
case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
default : break ;
}
wr_dat(ReadOldH);
wr_dat(ReadOldL);
}
}
/*******************************************************
* 函 数 名:void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
* 功能描述:在制定位置画数字,7*5个像素点
* 函数说明:在制定位置画数字
* 输入参数:unsigned char X, unsigned char Y, unsigned char Color
* X为列,Y为行,Figure为待显示的数字
* 返 回 值:无
*******************************************************/
void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
{
unsigned char i=0,j=0;
for(j=0;j<5;j++)
{
for(i=0;i<7;i++)
{
DrawPoint(X+i,Y-j,(ucxFigure[Figure][j]>>i)&0x01);
}
}
}
/*******************************************************
* 函 数 名:void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
* 功能描述:画一条水平线
* 函数说明:在制定位置画一条水平线
* 输入参数:unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color
* X0列的起始位置,X1列的终止位置,Y行位置,COLOR
* 返 回 值:无
*******************************************************/
void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
{ unsigned char Temp ;
if( X0 > X1 )
{
Temp = X1 ;
X1 = X0 ;
X0 = Temp ;
}
for( ; X0 <= X1 ; X0++ )
DrawPoint( X0, Y, Color ) ;
}
/*******************************************************
* 函 数 名:void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
* 功能描述:画一条垂直线
* 函数说明:在制定位置画一条垂直线
* 输入参数:unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color
* X列位置,Y0行的起始位置,Y1行的终止位置,COLOR
* 返 回 值:无
*******************************************************/
void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
{
unsigned char Temp ;
if( Y0 > Y1 )
{
Temp = Y1 ;
Y1 = Y0 ;
Y0 = Temp ;
}
for(; Y0 <= Y1 ; Y0++)
DrawPoint( X, Y0, Color);
}
/*******************************************************
* 函 数 名:void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
* 功能描述:画一条任意的线
* 函数说明:在起点,终点之间画一条直线
* 输入参数:unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color
* 返 回 值:无
*******************************************************/
void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
{
int t, distance; /*根据屏幕大小改变变量类型(如改为int型)*/
int x = 0 , y = 0 , delta_x, delta_y ;
char incx, incy ;
delta_x = EndX - StartX ;
delta_y = EndY - StartY ;
if( delta_x > 0 )
{
incx = 1;
}
else if( delta_x == 0 )
{
DrawLineY( StartX, StartY, EndY, Color ) ;
return ;
}
else
{
incx = -1 ;
}
if( delta_y > 0 )
{
incy = 1 ;
}
else if(delta_y == 0 )
{
DrawLineX( StartX, EndX, StartY, Color ) ;
return ;
}
else
{
incy = -1 ;
}
delta_x = abs( delta_x );
delta_y = abs( delta_y );
if( delta_x > delta_y )
{
distance = delta_x ;
}
else
{
distance = delta_y ;
}
DrawPoint( StartX, StartY, Color ) ;
/* Draw Line*/
for( t = 0 ; t <= distance+1 ; t++ )
{
DrawPoint( StartX, StartY, Color ) ;
x += delta_x ;
y += delta_y ;
if( x > distance )
{
x -= distance ;
StartX += incx ;
}
if( y > distance )
{
y -= distance ;
StartY += incy ;
}
}
}
/*******************************************************
* 函 数 名:void DisGBStr(xchar *CorpInf)
* 功能描述:文本显示
* 函数说明:写入汉字
* 输入参数:xchar *CorpInf
* 返 回 值:无
*******************************************************/
void DisGBStr(unsigned char code *CorpInf)
{
uchar uc_GBCnt;
wr_cmd(0x30); //DL=1:8-BIT interface
wr_cmd(0x30); //RE=0:basic instruction
wr_cmd(0x0C); //Display ON,Cursor OFF,Cursor position blink OFF 。整体显示开,光标及其设置关。
wr_cmd(0x80);
for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
{
wr_dat(CorpInf[2 * uc_GBCnt]);
wr_dat(CorpInf[2 * uc_GBCnt + 1]);
};
wr_cmd(0x90);
for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
{
wr_dat(CorpInf[2 * uc_GBCnt + 32]);
wr_dat(CorpInf[2 * uc_GBCnt + 33]);
};
delays();
}
/*******************************************************
* 函 数 名:void Cram_Off()
* 功能描述:清除文本显示
* 函数说明:清除文本显示
* 输入参数:无
* 返 回 值:无
*******************************************************/
void Cram_Off(void)
{
wr_cmd(0x30); //DL=1:8-BIT interface
wr_cmd(0x30); //RE=0:basic instruction
wr_cmd(0x08); //Display OFF,Cursor OFF,Cursor position blink OFF
wr_cmd(0x01); //CLEAR
delay(250);
}
/*******************************************************
* 函 数 名:void Clr_GDRAM(void)
* 功能描述:清除绘图显示
* 函数说明:清除绘图显示
* 输入参数:无
* 返 回 值:无
*******************************************************/
void Clr_GDRAM(void)
{
uchar x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
wr_cmd(0x34);
wr_cmd(0x36);//开显示
wr_cmd(y+0x80);
wr_cmd(x+0x80);
wr_dat(0x00);
wr_dat(0x00);
}
}
/*******************************************************
* 函 数 名:void Lcd_Init(void)
* 功能描述:12864初始化
* 函数说明:初始化
* 输入参数:无
* 返 回 值:无
*******************************************************/
void Lcd_Init(void)
{
PSB_Port =1;//并行接口
_nop_();
_nop_();
RST_Port =0;
delay(250);
delay(250);
delay(250);
delay(250);
RST_Port =1;
delay(250);
delay(250);
delay(250);
delay(250);
wr_cmd(0x30); //DL=1:8-BIT interface。功能设定,RE=0,基本指令集
wr_cmd(0x30); //RE=0:basic instruction
wr_cmd(0x06); //Entire display shift right by 1。光标右移
Cram_Off(); //清空文本显示
Clr_GDRAM(); //清空绘图显示
}
复制代码
为大家提供一份12864的程序,是我花了很长时间根据网上程序精简而成,比网上的版本运行速度快了很多,并增加部分功能及注释,很稳定好用,希望能帮到大家。 包含了如下功能:
①在任意位置画一个像素点
②画一条任意长度的水平/垂直线
③画一条任意线
④写入汉字
⑤在任意位置写入7*5个像素点的数字(0-9)
用12864时,需要了解一点,写汉字和绘图是两个分开的功能!在说明文档里一个叫文本显示,一个叫绘图,它俩使用的RAM也不一样,一个是DDRAM,一个是GDRAM,使用时的相关命令及地址也都是不同的,包括清屏,也得分开清除。再有一点是,不知道是不是我的12864有些问题,个别汉字显示错误,比如我写的“过”,它显示的就是“梗”。
作者:
bbxyzzj
时间:
2017-3-6 08:04
感谢分享!
作者:
yangwen
时间:
2017-3-6 13:15
谢谢分享
作者:
xiuyueyuan2013
时间:
2017-3-6 13:52
感谢楼主分享
作者:
gaozhaohong
时间:
2017-3-6 14:49
非常感谢!!!!
作者:
imxuheng
时间:
2017-3-6 15:38
谢谢分享,有值得借鉴的地方,不过DrawLine函数似乎不太好,推荐用Bresenham法来生成直线
作者:
lyl_420819
时间:
2017-5-17 10:11
好资料,下载学习了,谢谢分享。
作者:
实习生呢
时间:
2017-7-17 19:59
请问楼主,为什么,在高八位写哪一点,第八位就会写哪一点,高低是连体的吗
作者:
似水流年jie
时间:
2018-5-7 16:09
很好,谢谢楼主,最近正在找这个资料呢,希望有帮助
作者:
545455
时间:
2018-5-8 14:29
感谢楼主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1