??
字號:
/*寫漢字液晶子程 液晶屏分為4行*12列漢字,全部使用模擬接口方式。/* TGLCMLIMIT64A接口程序(模擬方式) 液晶模塊供應商:廣州市盛寶電子有限公司 Tel:020-87592491 Fax:87541571 Email: tinsharp@public.guangzhou.gd.cn;***************************************************************************;連線圖:;*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<REG52.H>#include<math.h>#include<INTRINS.H>#define Uchar unsigned char/***********液晶顯示器接口引腳定義***************/sbit Elcm= P2^3; //sbit CS1LCM= P2^4; //sbit CS2LCM= P2^5; //sbit CS3LCM= P3^2; /*這個連接只是做實驗的臨時接法。*/sbit Dilcm= P2^6; //sbit Rwlcm= P2^7; //sfr Datalcm= 0x80; //數(shù)據(jù)口unsigned char testi[]={"浸渠叁繩漱塔烴威犧曉玄瑤"};/***********常用操作命令和參數(shù)定義***************/#define DISPON 0x3f /*顯示on */#define DISPOFF 0x3e /*顯示off */#define DISPFIRST 0xc0 /*顯示起始行定義 */#define SETX 0x40 /*X定位設定指令(頁) */#define SETY 0xb8 /*Y定位設定指令(列) */#define Lcdbusy 0x80 /*LCM忙判斷位 *//**************顯示分區(qū)邊界位置*****************/#define MODL 0x00 /*左區(qū) */#define MODM 0x40 /*左區(qū)和中區(qū)分界 */#define MODR 0x80 /*中區(qū)和右區(qū)分界 */#define LCMLIMIT 0xC0 /*顯示區(qū)的右邊界 *//****************全局變量定義*******************/Uchar col,row,cbyte; /*列x,行(頁)y,輸出數(shù)據(jù) */bit xy; /*畫線方向標志: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); /*光標定位 */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,等待外設準備好 */ 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; /*方向標志。定為水平方向 */ 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); /*繼續(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;/* compute the 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<length;xs++){ col = ys + xs; point();} } else {xs = row; for (ys=0;ys<length;ys++){ row = xs + ys; point();} }}/****************************************//* 畫點 *//****************************************/void point(void) { Uchar x1,y1,x,y; x1=col; y1=row; row=y1>>3; /*取Y方向分頁地址 */ Rddata(); y=y1&0x07; /*字節(jié)內(nèi)位置計算 */ x=0x01; x=x<<y; /*移入所畫點 */ Wrdata(cbyte|x); /*畫上屏幕 */ col=x1; /*恢復xy坐標 */ row=y1; }/****************************************//* 屏幕滾動定位 *//****************************************/void Rollscreen(Uchar x) { cbyte = DISPFIRST|x; /*定義顯示起始行為x
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -