C51单片机对液晶片的驱动_第1页
C51单片机对液晶片的驱动_第2页
C51单片机对液晶片的驱动_第3页
C51单片机对液晶片的驱动_第4页
C51单片机对液晶片的驱动_第5页
已阅读5页,还剩4页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页C51单片机对液晶片的驱动KeilC51编写的192*64液晶片驱动程序,感谢很多网友提供了参考源程序

本程序是在网友们提供的程序基础上改写而成,有很多地方得到高手们的耐

心指导,在此深表谢意。这是一个完整的C51源程序,我觉得对一位初学C51的人来说,提供一个完整的简单程序比较容易上手。

*//*写汉字液晶子程液晶屏分为4行*12列汉字,全部使用模拟接口方式。/*TGLCMLIMIT64A接口程序(模拟方式)液晶模块供应商:Email:;***************************************************************************;连线图:;*LCM89C52**LCM89C52**LCM89C52**LCM89C52**;*DB0P0.0**DB4P0.4**D/IP2.6**CS1P2.4**;*DB1P0.1**DB5P0.5**R/WP2.7**CS2P2.5**;*DB2P0.2**DB6P0.6**RSTVCC**CS3P3.2**;*DB3P0.3**DB7P0.7**EP2.3**;注:89C52的晶振频率为12MHz*;***************************************************************************///画线部分请参照avr的c程序。/*#pragmasrc/*生成ASM文件开关,必要时打开*/#include#include#include#defineUcharunsignedchar/***********液晶显示器接口引脚定义***************/sbitElcm=P2^3;//sbitCS1LCM=P2^4;//sbitCS2LCM=P2^5;//sbitCS3LCM=P3^2;/*这个连接只是做实验的临时接法。*/sbitDilcm=P2^6;//sbitRwlcm=P2^7;//sfrDatalcm=0x80;//数据口/***********常用操作命令和参数定义***************/#defineDISPON0x3f/*显示on*/#defineDISPOFF0x3e/*显示off*/#defineDISPFIRST0xc0/*显示起始行定义*/#defineSETX0x40/*X定位设定指令(页)*/#defineSETY0xb8/*Y定位设定指令(列)*/#defineLcdbusy0x80/*LCM忙判断位*//**************显示分区边界位置*****************/#defineMODL0x00/*左区*/#defineMODM0x40/*左区和中区分界*/#defineMODR0x80/*中区和右区分界*/#defineLCMLIMIT0xC0/*显示区的右边界*//****************全局变量定义*******************/Ucharcol,row,cbyte;/*列x,行(页)y,输出数据*/bitxy;/*画线方向标志:1水平*//*****************函数列表**********************/voidLcminit(void);/*液晶模块初始化*/voidDelay(Uchar);/*延时,入口数为Ms*/voidlcdbusyL(void);/*busy判断、等待(左区)*/voidlcdbusyM(void);/*busy判断、等待(中区)*/voidlcdbusyR(void);/*busy判断、等待(右区)*/voidPutedot(Uchar);/*半角字符输出*/voidPutcdot(Uchar);/*全角(汉字)输出*/voidWrdata(Uchar);/*数据输出给LCM*/voidLcmcls(void);/*LCM全屏幕清零(填充0)*/voidwtcom(void);/*公用busy等待*/voidLocatexy(void);/*光标定位*/voidWrcmdL(Uchar);/*左区命令输出*/voidWrcmdM(Uchar);/*中区命令输出*/voidWrcmdR(Uchar);/*右区命令输出*/voidPutstr(Uchar*puts,Uchari);/*中英文字符串输出*/voidRollscreen(Ucharx);/*屏幕向上滚动演示*/voidRddata(void);/*从液晶片上读数据*/voidLinehv(Ucharlength);/*横(竖)方向画线*/voidpoint(void);/*打点*/voidLinexy(Ucharendx,Ucharendy);/******************数组列表*********************/UcharcodeEzk[];/*ASCII常规字符点阵码表*/UcharcodeHzk[];/*自用汉字点阵码表*/UcharcodeSTR1[];/*自定义字符串*/UcharcodeSTR2[];//UcharcodeSTR3[];//UcharcodeSTR4[];///********************************//*演示主程序*//********************************/voidmain(void){Ucharx;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);/*延时,控制滚动速度*/};}/************************************************//*画线。任意方向的斜线,不支持垂直的或水平线*//************************************************/voidLinexy(Ucharendx,Ucharendy){registerUchart;intxerr=0,yerr=0,delta_x,delta_y,distance;Ucharincx,incy;/*computethedistanceinbothdirections*/delta_x=endx-col;delta_y=endy-row;/*computethedirectionoftheincrement,anincrementof“0”meanseitheraverticalorhorizontallines*/if(delta_x》0)incx=1;elseif(delta_x==0)incx=0;elseincx=-1;if(delta_y》0)incy=1;elseif(delta_y==0)incy=0;elseincy=-1;/*determinewhichdistanceisgreater*/delta_x=cabs(delta_x);delta_y=cabs(delta_y);if(delta_x》delta_y)distance=delta_x;elsedistance=delta_y;/*drawtheline*/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方向的,不支持斜线*//****************************************/voidLinehv(Ucharlength){Ucharxs,ys;if(xy){ys=col;for(xs=0;xscol=ys+xs;point();}}else{xs=row;for(ys=0;ysrow=xs+ys;point();}}}/****************************************//*画点*//****************************************/voidpoint(void){Ucharx1,y1,x,y;x1=col;y1=row;row=y1》》3;/*取Y方向分页地址*/Rddata();y=y1/*字节内位置计算*/x=0x01;x=x《Wrdata(cbyte|x);/*画上屏幕*/col=x1;/*恢复xy坐标*/row=y1;}/****************************************//*屏幕滚动定位*//****************************************/voidRollscreen(Ucharx){cbyte=DISPFIRST|x;/*定义显示起始行为x?*/WrcmdL(cbyte);WrcmdM(cbyte);WrcmdR(cbyte);}/****************************************//*一个字串的输出*//****************************************/voidPutstr(Uchar*puts,Uchari){Ucharj,X;for(j=0;j{X=puts[j];if(X/*只保留低7位*/}elsePutedot(X-0x20);/*ascii码表从0x20开始*/}}/****************************************//*半角字符点阵码数据输出*//****************************************/voidPutedot(UcharOrder){Uchari,bakerx,bakery;/*共定义4个局部变量*/intx;/*偏移量,字符量少的可以定义为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;}/*整个字符输出结束*//****************************************//*全角字符点阵码数据输出*//****************************************/voidPutcdot(UcharOrder){Uchari,bakerx,bakery;/*共定义3个局部变量*/intx;/*偏移量,字符量少的可以定义为UCHAR*/bakerx=col;/*暂存x,y坐标,已备下半个字符使用*/bakery=row;x=Order*0x20;/*每个字符32字节*//*上半个字符输出,16列*/for(i=0;i《16;i++){Wrdata(Hzk[x]);/*写输出一字节*/x++;col++;if(col==LCMLIMIT){col=0;row++;row++;}/*下一列,如果列越界换行*/if(row》6)row=0;/*如果行越界,返回首行*/}/*上半个字符输出结束*//*下半个字符输出,16列*/col=bakerx;row=bakery+1;for(i=0;i《16;i++)/*下半部分*/{Wrdata(Hzk[x]);x++;col++;if(col==LCMLIMIT){col=0;row++;row++;}/*下一列,如果列越界换行*/if(row》7)row=1;/*如果行越界,返回首行*/}/*下半个字符输出结束*/row=bakery;}/*整个字符输出结束*//****************************************//*清屏,全屏幕清零*//****************************************/voidLcmcls(void){for(row=0;row《8;row++)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论