下载:
12864b-资料.zip
(2.75 MB, 下载次数: 74)
主程序:
- #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有些问题,个别汉字显示错误,比如我写的“过”,它显示的就是“梗”。
|