新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機采用模擬時序控制點陣圖形液晶程序

51單片機采用模擬時序控制點陣圖形液晶程序

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;連線圖:
;//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文件開關(guān),必要時打開///
#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;//數(shù)據(jù)口
unsigned char testi[]={"浸渠叁繩漱塔烴威犧曉玄瑤"};

///////////////////////常用操作命令和參數(shù)定義///////////////////////////////
#defineDISPON0x3f///顯示on///
#defineDISPOFF0x3e///顯示off///
#defineDISPFIRST0xc0///顯示起始行定義///
#defineSETX0x40///X定位設(shè)定指令(頁)///
#defineSETY0xb8///Y定位設(shè)定指令(列)///
#defineLcdbusy0x80///LCM忙判斷位///

/////////////////////////////顯示分區(qū)邊界位置///////////////////////////////////
#defineMODL0x00///左區(qū)///
#defineMODM0x40///左區(qū)和中區(qū)分界///
#defineMODR0x80///中區(qū)和右區(qū)分界///
#define LCMLIMIT0xC0///顯示區(qū)的右邊界///

/////////////////////////////////全局變量定義///////////////////////////////////////
Uchar col,row,cbyte;///列x,行(頁)y,輸出數(shù)據(jù) ///
bit xy;///畫線方向標(biāo)志:1水平///

///////////////////////////////////函數(shù)列表/////////////////////////////////////////////
void Lcminit(void);///液晶模塊初始化///
void Delay(Uchar);///延時,入口數(shù)為Ms ///
void lcdbusyL(void);///busy判斷、等待(左區(qū)) ///
void lcdbusyM(void);///busy判斷、等待(中區(qū)) ///
void lcdbusyR(void);///busy判斷、等待(右區(qū)) ///
void Putedot(Uchar);///半角字符輸出///
void Putcdot(Uchar);///全角(漢字)輸出///
void Wrdata(Uchar);///數(shù)據(jù)輸出給LCM///
void Lcmcls( void );///LCM全屏幕清零(填充0) ///
void wtcom(void);///公用busy等待///
void Locatexy(void);///光標(biāo)定位///
void WrcmdL(Uchar);///左區(qū)命令輸出///
void WrcmdM(Uchar);///中區(qū)命令輸出///
void WrcmdR(Uchar);///右區(qū)命令輸出///
void Putstr(Uchar //puts,Uchar i);///中英文字符串輸出///
void Rollscreen(Uchar x);///屏幕向上滾動演示///
void Rddata(void);///從液晶片上讀數(shù)據(jù)///
void Linehv(Uchar length);///橫(豎)方向畫線///
void point(void);///打點///
void Linexy(Uchar endx,Uchar endy);

/////////////////////////////////////數(shù)組列表///////////////////////////////////////////
Uchar code Ezk[];///ASCII常規(guī)字符點陣碼表 ///
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,等待外設(shè)準備好///
Lcminit();///液晶模塊初始化,包括全屏幕清屏///
Putstr(STR2,24);///第一行字符輸出,24字節(jié)///
col=0;
row=2;
Putstr(STR1,12);///第二行字符輸出,12字節(jié)///
col=0;
row=4;
Putstr(STR3,24);///第三行字符輸出,24字節(jié)///
col=0;
row=6;
Putstr(STR4,24);///第四行字符輸出,12字節(jié)///
x=0;
col=0;
row=0;
xy = 1;///方向標(biāo)志。定為水平方向///
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;///方向標(biāo)志。定為垂直方向///
Linehv(31);///畫一條豎線(0,1)-(0,31) ///
col=191;
row=1;
xy = 0;
Linehv(31);///畫一條豎線(191,1)-(191,31) ///
col=0;///設(shè)定斜線的起點坐標(biāo)///
row=63;
Linexy(44,31);///畫一段斜線(0,63)-(44,31)///
col=44;
row=31;
Linexy(190,62);///繼續(xù)畫斜線(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;///字節(jié)內(nèi)位置計算///
x=0x01;
x=x<///移入所畫點///
Wrdata(cbyte|x);///畫上屏幕///
col=x1;///恢復(fù)xy坐標(biāo)///
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開始///
}
}

//////////////////////////////////////////////////////////////////////////////////
///半角字符點陣碼數(shù)據(jù)輸出///
//////////////////////////////////////////////////////////////////////////////////
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery;///共定義4個局部變量///
int x;///偏移量,字符量少的可以定義為UCHAR///
bakerx = col;///暫存x,y坐標(biāo),已備下半個字符使用 ///
bakery = row;
x=Order // 0x10;///半角字符,每個字符16字節(jié) ///
///上半個字符輸出,8列///
for(i=0;i<8;i++)
{
cbyte = Ezk[x];///取點陣碼,rom數(shù)組///
Wrdata(cbyte);///寫輸出一字節(jié)///
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; ///下一列,如果列越界換行///
if (row>7) row=0;///如果行越界,返回首行///
}///上半個字符輸出結(jié)束 ///

col = bakerx;///列對齊///
row = bakery+1;///指向下半個字符行///
///下半個字符輸出,8列///
for(i=0;i<8;i++)
{
cbyte = Ezk[x];///取點陣碼///
Wrdata(cbyte);///寫輸出一字節(jié)///
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;};///下一列,如果列越界換行///
if (row>7) row=1;///如果行越界,返回首行///
}///下半個字符輸出結(jié)束 ///
row=bakery;
}///整個字符輸出結(jié)束///

上一頁 1 2 3 下一頁

評論


技術(shù)專區(qū)

關(guān)閉