您的位置 首页 嵌入式

51单片机选用模仿时序控制点阵图形液晶程序

51单片机采用模拟时序控制点阵图形液晶程序

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;连线图:
;//LCM—89C52////LCM—89C52////LCM——-89C52////LCM———-89C52// //
;//DB0—P0.0////DB4—P0.4////D/I——-P2.6////CS1———-P2.4////
;//DB1—P0.1////DB5—P0.5////R/W——-P2.7////CS2———-P2.5////
;//DB2—P0.2////DB6—P0.6////RST——–VCC////CS3———-P3.2////
;//DB3—P0.3////DB7—P0.7////E———P2.3////
;注:89C52的晶振频率为12MHz//
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//画线部分请参照avr的c程序。
///#pragma src///生成ASM文件开关,必要时翻开///
#include
#include
#include

#define Uchar unsigned char

///////////////////////液晶显现器接口引脚界说///////////////////////////////

sbitElcm=P2^3;//
sbitCS1LCM= P2^4;//
sbitCS2LCM= P2^5;//
sbitCS3LCM= P3^2;///这个衔接仅仅做试验的暂时接法。///
sbitDilcm=P2^6;//
sbitRwlcm=P2^7;//
sfr Datalcm=0x80;//数据口
unsigned char testi[]={“浸渠叁绳漱塔烃威牺晓玄瑶”};

///////////////////////常用操作指令和参数界说///////////////////////////////
#defineDISPON0x3f///显现on///
#defineDISPOFF0x3e///显现off///
#defineDISPFIRST0xc0///显现开端行界说///
#defineSETX0x40///X定位设定指令(页)///
#defineSETY0xb8///Y定位设定指令(列)///
#defineLcdbusy0x80///LCM忙判别位///

/////////////////////////////显现分区鸿沟方位///////////////////////////////////
#defineMODL0x00///左区///
#defineMODM0x40///左区和中区分界///
#defineMODR0x80///中区和右区分界///
#define LCMLIMIT0xC0///显现区的右鸿沟///

/////////////////////////////////全局变量界说///////////////////////////////////////
Uchar col,row,cbyte;///列x,行(页)y,输出数据 ///
bit xy;///画线方向标志:1水平///

///////////////////////////////////函数列表/////////////////////////////////////////////
void Lcminit(void);///液晶模块初始化///
void Delay(Uchar);///延时,进口数为Ms ///
void lcdbusyL(void);///busy判别、等候(左区) ///
void lcdbusyM(void);///busy判别、等候(中区) ///
void lcdbusyR(void);///busy判别、等候(右区) ///
void Putedot(Uchar);///半角字符输出///
void Putcdot(Uchar);///全角(汉字)输出///
void Wrdata(Uchar);///数据输出给LCM///
void Lcmcls( void );///LCM全屏幕清零(填充0) ///
void wtcom(void);///共用busy等候///
void Locatexy(void);///光标定位///
void WrcmdL(Uchar);///左区指令输出///
void WrcmdM(Uchar);///中区指令输出///
void WrcmdR(Uchar);///右区指令输出///
void Putstr(Uchar //puts,Uchar i);///中英文字符串输出///
void Rollscreen(Uchar x);///屏幕向上翻滚演示///
void Rddata(void);///从液晶片上读数据///
void Linehv(Uchar length);///横(竖)方向画线///
void point(void);///打点///
void Linexy(Uchar endx,Uchar endy);

/////////////////////////////////////数组列表///////////////////////////////////////////
Uchar code Ezk[];///ASCII惯例字符点阵码表 ///
Uchar code Hzk[];///自用汉字点阵码表///
Uchar code STR1[];///自界说字符串///
Uchar code STR2[];//
Uchar code STR3[];//
Uchar code STR4[];//


//////////////////////////////////////////////////////////////////
/// 演示主程序///
//////////////////////////////////////////////////////////////////
void main(void)

{
Uchar x,y;
col=0;
row=0;
Delay(40);///延时大约40Ms,等候外设准备好///
Lcminit();///液晶模块初始化,包含全屏幕清屏///
Putstr(STR2,24);///榜首行字符输出,24字节///
col=0;
row=2;
Putstr(STR1,12);///第二行字符输出,12字节///
col=0;
row=4;
Putstr(STR3,24);///第三行字符输出,24字节///
col=0;
row=6;
Putstr(STR4,24);///第四行字符输出,12字节///
x=0;
col=0;
row=0;
xy = 1;///方向标志。定为水平方向///
Linehv(192);///画一条横线(0,0)-(191,0)///
col=0;
row=15;
xy = 1;
Linehv(192);///画一条横线(0,15)-(191,15)///
col=0;
row=32;
xy = 1;
Linehv(192);///画一条横线(0,32)-(191,32)///
col=0;
row=1;
xy = 0;///方向标志。定为笔直方向///
Linehv(31);///画一条竖线(0,1)-(0,31) ///
col=191;
row=1;
xy = 0;
Linehv(31);///画一条竖线(191,1)-(191,31) ///
col=0;///设定斜线的起点坐标///
row=63;
Linexy(44,31);///画一段斜线(0,63)-(44,31)///
col=44;
row=31;
Linexy(190,62);///持续画斜线(44,31)-(191,63) ///
while(1){
Rollscreen(y);///定位新的显现起///
y++;
y %=8;
x=testi[y];
Delay(100); ///延时,操控翻滚速度 ///
};
}


//////////////////////////////////////////////////////////////////////////////////////////////////
///画线。恣意方向的斜线,不支持笔直的或水平线 ///
//////////////////////////////////////////////////////////////////////////////////////////////////

void Linexy(Uchar endx,Uchar endy)
{
register Uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
Uchar incx,incy;

///compute the distance in both directions ///
delta_x=endx-col;
delta_y=endy-row;

/// computethe direction of the increment ,
an increment of “0” means either a vertical or horizontal lines ///

if(delta_x>0) incx=1;
else if( delta_x==0 ) incx=0;
else incx=-1;


if(delta_y>0) incy=1;
else if( delta_y==0 ) incy=0;
else incy=-1;

///determine which distance is greater ///
delta_x = cabs( delta_x );
delta_y = cabs( delta_y );

if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;

/// draw the line ///
for( t=0;t = distance+1; t++ ) {
point();
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance ) {
xerr-=distance;
col+=incx;
}
if( yerr > distance ) {
yerr-=distance;
row+=incy;
}

}
}

//////////////////////////////////////////////////////////////////////////////////
///画线。只提供X或Y方向的,不支持斜线///
//////////////////////////////////////////////////////////////////////////////////
void Linehv(Uchar length)
{
Uchar xs,ys;
if (xy){ys = col;
for (xs=0;xs
col = ys + xs;
point();}
}
else{xs = row;
for (ys=0;ys
row = xs + ys;
point();}
}
}

//////////////////////////////////////////////////////////////////////////////////
///画点///
//////////////////////////////////////////////////////////////////////////////////

void point(void)
{
Ucharx1,y1,x,y;
x1=col;
y1=row;
row=y1>>3;///取Y方向分页地址///
Rddata();
y=y1&0x07;///字节内方位核算///
x=0x01;
x=x<///移入所画点///
Wrdata(cbyte|x);///画上屏幕///
col=x1;///康复xy坐标///
row=y1;
}

//////////////////////////////////////////////////////////////////////////////////
///屏幕翻滚定位///
//////////////////////////////////////////////////////////////////////////////////
void Rollscreen(Uchar x)
{
cbyte = DISPFIRST|x;///界说显现开端行为x?///
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}

//////////////////////////////////////////////////////////////////////////////////
///一个字串的输出///
//////////////////////////////////////////////////////////////////////////////////
void Putstr(Uchar //puts,Uchar i)
{
Uchar j,X;
for (j=0;j
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f);///只保存低7位///
}
else Putedot(X-0x20);///ascii码表从0x20开端///
}
}

//////////////////////////////////////////////////////////////////////////////////
///半角字符点阵码数据输出///
//////////////////////////////////////////////////////////////////////////////////
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery;///共界说4个局部变量///
int x;///偏移量,字符量少的能够界说为UCHAR///
bakerx = col;///暂存x,y坐标,已备下半个字符运用 ///
bakery = row;
x=Order // 0x10;///半角字符,每个字符16字节 ///
///上半个字符输出,8列///
for(i=0;i<8;i++)
{
cbyte = Ezk[x];///取点阵码,rom数组///
Wrdata(cbyte);///写输出一字节///
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; ///下一列,假如列越界换行///
if (row>7) row=0;///假如行越界,返回忆行///
}///上半个字符输出完毕 ///

col = bakerx;///列对齐///
row = bakery+1;///指向下半个字符行///
///下半个字符输出,8列///
for(i=0;i<8;i++)
{
cbyte = Ezk[x];///取点阵码///
Wrdata(cbyte);///写输出一字节///
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;};///下一列,假如列越界换行///
if (row>7) row=1;///假如行越界,返回忆行///
}///下半个字符输出完毕 ///
row=bakery;
}///整个字符输出完毕///

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/255879.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部