?? keilc51編寫的19264液晶片驅動程序.c
字號:
/*寫漢字液晶子程 液晶屏分為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; //數據口
/***********常用操作命令和參數定義***************/
#define DISPON 0x3f /*顯示on */
#define DISPOFF 0x3e /*顯示off */
#define DISPFIRST 0xc0 /*顯示起始行定義 */
#define SETX 0x40 /*X定位設定指令(頁) */
#define SETY 0xb8 /*Y定位設定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判斷位 */
/**************顯示分區邊界位置*****************/
#define MODL 0x00 /*左區 */
#define MODM 0x40 /*左區和中區分界 */
#define MODR 0x80 /*中區和右區分界 */
#define LCMLIMIT 0xC0 /*顯示區的右邊界 */
/****************全局變量定義*******************/
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;
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(x); /*定位新的顯示起始行 */
x++;
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; /*字節內位置計算 */
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 + -