⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 128X64 LCD 驱动程序 C51
💻 C
字号:
#include "lcd.h"
#include "ehardware.h"
#include "var.h"
#include "lib2.h"
#include "io.h"
#include "eelib.h"
//#pragma memory = default

/**************7******6*****5*****4*****3*****2*****1*****0************/
/****LcdCtl_  NU8   LCDST  Nu6   E2    E1    RST   RW    DI           */
/**********************************************************************/

void LcdReset()
{
    unsigned char initi;
ttt:

    LcdDir=1;
    LCDCONTROL=LcdCtrl;
    LCDCS=0;
    LCDCONTROL=0;
    LcdPowerOff();
    RtcDlyCnt=20;
    while(RtcDlyCnt);
    LcdPowerOn();
    LcdDir=1;
    LCDCONTROL=LcdCtrl;
    LcdRst=0;
    LCDCONTROL=LcdCtrl;
    T0Delay=100;
    while(T0Delay);
    LcdRst=1;
    LCDCONTROL=LcdCtrl;
    T0Delay=100;
    while(T0Delay);
    LcdDir=0;
    LCDCONTROL=LcdCtrl;
    RtcDlyCnt=50;
    do{

        LcdRegPin=0;
        LCDCONTROL=LcdCtrl;
        LcdRWPin=1;
        LCDCONTROL=LcdCtrl;
        LcdCS1Pin=1;
        LcdCS2Pin=1;
        LCDCONTROL=LcdCtrl;
        LcdEnablePin=1;
        LCDCONTROL=LcdCtrl;
        initi=LCDCS;
        LcdEnablePin=0;
        LCDCONTROL=LcdCtrl;
    }while(((initi&0x80!=0)||(initi&0x10!=0))&&RtcDlyCnt);
    if(!RtcDlyCnt) goto ttt;

}
unsigned char StringLength(unsigned char *Str)
{
    unsigned char icnt;
    icnt=0;
    while(Str[icnt]!='\0')
    {
        icnt++;
        if(icnt>250)break;
    }
    return icnt;
}
void LcdCmd(unsigned char cmd,unsigned char LcdMode)
{
    LcdDir=1;
    LCDCONTROL=LcdCtrl;
    LcdEnablePin=1;
    LCDCONTROL=LcdCtrl;
    switch (LcdMode)
    {
        case 0:
            LcdCS1Pin=1;
            LcdCS2Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        case 1:
            LcdCS1Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        case 2:
            LcdCS2Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        default:
            break;
    }
    LcdRegPin=0;
    LcdRWPin=0;
    LCDCONTROL=LcdCtrl;
    LCDCS = cmd;
    LcdEnablePin=0;
    LCDCONTROL=LcdCtrl;
    switch (LcdMode)
    {
        case 0:
            LcdCS1Pin=0;
            LcdCS2Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        case 1:
            LcdCS1Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        case 2:
            LcdCS2Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        default:
            break;
    }
}
/*=========================*/
void LcdData(unsigned char cc,unsigned char LcdMode)
{
    LcdDir=1;
    LCDCONTROL=LcdCtrl;
    LcdEnablePin=1;
    LCDCONTROL=LcdCtrl;
    switch (LcdMode)
    {
        case 0:
            LcdCS1Pin=1;
            LcdCS2Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        case 1:
            LcdCS1Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        case 2:
            LcdCS2Pin=1;
            LCDCONTROL=LcdCtrl;
            break;
        default:
            break;
    }
    LcdRegPin=1;
    LcdRWPin=0;
    LCDCONTROL=LcdCtrl;
    LCDCS = cc;
    LcdEnablePin=0;
    LCDCONTROL=LcdCtrl;
    switch (LcdMode)
    {
        case 0:
            LcdCS1Pin=0;
            LcdCS2Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        case 1:
            LcdCS1Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        case 2:
            LcdCS2Pin=0;
            LCDCONTROL=LcdCtrl;
            break;
        default:
            break;
    }
}
/*=========================*/
void LcdClear(void)
{
    unsigned char initi,initj;
    LcdCmd(0xc0,0);                               /* Scan Start (0-63), 0xc0 to 0xff       c0 */
    LcdCmd(0x03f,0);                              /* Display on/off, 0x3f = on , 0x3e = off */
    for (initi=0;initi<8;initi++)               /* Fill the screen to blank */
    {
        LcdCmd(0xb8|initi,0);                     /* X Page (0-7), 0xb8 to 0xbf */
        for (initj=0;initj<64;initj++)
        {
            LcdCmd(0x40|initj,0);                 /* Y Line (0-63), 0x40 to 0x7f */
            LcdData(0x00,0);                      /* Access to two LCD area */
        }
    }
    LcdCmd(0x03f,0);                              /* Display on/off, 0x3f = on , 0x3e = off */
    Index0=0;
    Index1=0;
    Index2=0;
    Index3=0;
}
/*=========================*/
void LcdClearU(unsigned char lin)
{/*Line=0-7*/
    unsigned char initj;
    LcdCmd(0xc0,0);                               /* Scan Start (0-63), 0xc0 to 0xff       c0 */
    LcdCmd(0x03f,0);                              /* Display on/off, 0x3f = on , 0x3e = off */
    LcdCmd(0xb8|lin,0);                     /* X Page (0-7), 0xb8 to 0xbf */
    for (initj=0;initj<64;initj++)
    {
        LcdCmd(0x40|initj,0);                 /* Y Line (0-63), 0x40 to 0x7f */
        LcdData(0x00,0);                      /* Access to two LCD area */
    }
    initj=lin/2;
    switch (initj)
    {
        case 0:
             if (Index0==0)
                Index0=0;
             break;
        case 1:
             if (Index1==0)
             Index1=0;
             break;
        case 2:
             if (Index2==0)
             Index2=0;
             break;
        case 3:
             if (Index3==0)
             Index3=0;
             break;
        default:
             break;
    }
}
/*=========================*/
void LcdTestU(void)
{
    unsigned char initj;
    for (initj=0;initj<64;initj++)
    {
        LcdCmd(0x40|initj,0);                 /* Y Line (0-63), 0x40 to 0x7f */
        LcdData(0xff,0);                      /* Access to two LCD area */
    }
}
/*=========================*/
void LcdChar(unsigned char cc,unsigned char lx,unsigned char ly)
{/*lx=0-7,ly=0-15*/
    unsigned char loop;
    Lcdk=ly*8;

    LcdCmd(0xc0,0);                           /* Scan Start (0-63), 0xc0 to 0xff     c0 */
    LcdCmd(0x03f,0);                          /* Display on/off, 0x3f = on , 0x3e = off */

    for (loop=0;loop<8;loop++)
    {
        if ((Lcdk+loop)>63)
        {
        	LcdCmd(0xb8|(lx&0x07),2);		  /* X Page (0-7), 0xb8 to 0xbf */
            LcdCmd(0x40|((Lcdk+loop)&0x3f),2);/* Y Line (0-63),0x40 to 0x7f */
            LcdData(ASCII[(cc-0x20)*8+loop],2);
        }
        else
        {
            LcdCmd(0xb8|(lx&0x07),1);		  /* X Page (0-7), 0xb8 to 0xbf */
            LcdCmd(0x40|((Lcdk+loop)&0x3f),1);/* Y Line (0-63),0x40 to 0x7f */
            LcdData(ASCII[(cc-0x20)*8+loop],1);
        }
    }
}
/*=========================*/
void LcdHChar(unsigned char cc,unsigned char lx,unsigned char ly)
{/*lx=0-3,ly=0-7*/
    unsigned char loop1,loop2;
    unsigned char *zPtr;
    unsigned char HzTempBuff[128];
    LcdCmd(0xc0,0);                           /* Scan Start (0-63), 0xc0 to 0xff   c0 */
    LcdCmd(0x03f,0);                          /* Display on/off, 0x3f = on , 0x3e = off */
    A16=1;
    EEReadB(E2PROMCS+(HzCodeAddress+cc/4)*PkgLen,HzTempBuff);
    zPtr=HzTempBuff+(cc&0x03)*32;
    loop2=0;
    Lcdk=ly*16;
    for (loop1=0;loop1<16;loop1++)
    {
         if ((Lcdk+loop1)>63)
         {
             LcdCmd(0xb8|((lx*2)&0x07),2);
             LcdCmd(0x40|((Lcdk+loop1)&0x3f),2);
             LcdData(*(zPtr+loop1),2);
         }
         else
         {
             LcdCmd(0xb8|((lx*2)&0x07),1);
             LcdCmd(0x40|((Lcdk+loop1)&0x3f),1);
             LcdData(*(zPtr+loop1),1);
         }
    }
    for (loop1=16;loop1<32;loop1++)
    {
         if ((Lcdk+loop2)>63)
         {
             LcdCmd(0xb8|((lx*2+1)&0x07),2);     /* X Page (0-7), 0xb8 to 0xbf */
             LcdCmd(0x40|((Lcdk+loop2)&0x3f),2); /* Y Line (0-63), 0x40 to 0x7f */
             LcdData(*(zPtr+loop1),2);
         }
         else
         {
             LcdCmd(0xb8|((lx*2+1)&0x07),1);     /* X Page (0-7), 0xb8 to 0xbf */
             LcdCmd(0x40|((Lcdk+loop2)&0x3f),1); /* Y Line (0-63), 0x40 to 0x7f */
             LcdData(*(zPtr+loop1),1);
         }
	     loop2++;
    }
}

/*=========================*/
void LcdEng(unsigned char *c,unsigned char len,unsigned char lx,unsigned char ly)
{/*lx=1-8,ly=1-16*/
    unsigned char d=0;
    for (d=0;(d<len)&&(c[d]!='\0');d++)
         LcdChar(c[d],lx,ly+d);
}
/*=========================*/
void NewHzDisp(unsigned char *HzString,unsigned char Place)
{
    unsigned char d=0;
    for (d=0; d<8;d++)
    {
    	 if(HzString[d]==0xff) return;
         LcdHChar(HzString[d],Place,d);
    }
}

/*=========================*/
void MessageShow(unsigned char Place,unsigned char Noi)
{
    if(!LanguageFlag)
        NewHzDisp(LcdMessageC[Noi],Place);
    else
    {
        LcdClearU(Place*2+1);
        LcdEng(&LcdMessageE[Noi][0],16,Place*2,0);
    }
}
/*=========================*/
void TimeDisp(unsigned char order)
{
    if(order==1)
    {
        LcdEng(TimeStr,10,3,1);         /*===date&week___yyyy/mm/dd--weekday===*/
        LcdEng("--",2,3,11);
        LcdChar(TimeStr[20],3,13);
    }
    else if(order==2)
         LcdEng(TimeStr+11,8,5,1);      /*==time___hh:mm:ss===*/
    else
    {
    	if(!Flag_New)
    	{
        	if(PMode!=PhoneStatusCheck) LcdEng(TimeStr,16,3,0); /*===date&week___yyyy/mm/dd--weekday===*/
        	else LcdEng(TimeStr,16,7,0);
     	}
     	else
        	LcdEng(TimeStr,16,3,0);         					/*===date&week___yyyy/mm/dd--weekday===*/
    }
}
/*=========================*/
void MoneyShow(void)
{
    unsigned char MoneyShowBuf[6];
    IntToStr(MoneyShowBuf,MoneyLeft);
    if(MoneyShowBuf[1]==0)
        MoneyShowBuf[0]=0x20;
    else
        MoneyShowBuf[0]=MoneyShowBuf[1];
    if(MoneyShowBuf[2]==0)
        MoneyShowBuf[1]=0x20;
    else
        MoneyShowBuf[1]=MoneyShowBuf[2];
    if(MoneyShowBuf[3]==0)
        MoneyShowBuf[2]=0x30;
    else
        MoneyShowBuf[2]=MoneyShowBuf[3];
    MoneyShowBuf[3]=0x2e;
    MoneyShowBuf[4]=MoneyShowBuf[4];
    MoneyShowBuf[5]=0x30;
    LcdEng(MoneyShowBuf,6,5,8);
}

/*=========================*/
void LcdRoll(unsigned char * buff,unsigned char len,unsigned char page)
{
    unsigned char lri;
    if(len>=15)
    {
        for(lri=0;lri<15;lri++)
            LcdChar(*(buff+len-15+lri),page,lri);
    }
    else
    {
        for(lri=15-len;lri<15;lri++)
            LcdChar(*(buff+len-15+lri),page,lri);
    }
}

void CallTimeShow(unsigned int Sec)
{
    unsigned char temp[9];
    unsigned char icnt;
    TimeIntToString(temp,Sec);
    for(icnt=6;icnt>=5;icnt--)
        temp[icnt+1]=temp[icnt-1];
    for(icnt=4;icnt>=3;icnt--)
        temp[icnt]=temp[icnt-1];
    temp[2]=':';
    temp[5]=':';
    if(IPCard_Flag)
    {
      	if(temp[1]==0x30)
      	{
        	for(icnt=0;icnt<5;icnt++)        		//5
            	LcdChar(temp[icnt+3],5,icnt+11);    //icnt+11
      	}
      	else
      	{
        	for(icnt=0;icnt<7;icnt++)
            	LcdChar(temp[icnt+1],5,icnt+9);
      	}
    }
    else
    {
       	if(temp[1]==0x30)
       	{
         	for(icnt=0;icnt<5;icnt++)
	        if(IP_Flag)	LcdChar(temp[icnt+3],7,icnt+4);
            else LcdChar(temp[icnt+3],7,icnt+2);      //icnt+11
       	}
       	else
       	{
        	for(icnt=0;icnt<6;icnt++)
            if(Flag_Ring)LcdChar(temp[icnt+1],7,icnt+2);
            else LcdChar(temp[icnt+1],7,icnt+4);
       	}
    }
}

void LcdUnion(void)
{/*lx=0-3,ly=0-7*/
    unsigned char initi,initj;
    unsigned char *zPtr;
    LcdCmd(0xc0,0);                               	/* Scan Start (0-63), 0xc0 to 0xff     c0 */
    LcdCmd(0x03f,0);                              	/* Display on/off, 0x3f = on , 0x3e = off */
    zPtr=Unicom;
    for (initi=0;initi<8;initi++)               	/* Fill the screen to blank   */
    {
        LcdCmd(0xb8|initi,1);                     	/* X Page (0-7), 0xb8 to 0xbf */
        for (initj=0;initj<64;initj++)
        {
            LcdCmd(0x40|initj,1);                 	/* Y Line (0-63),0x40 to 0x7f */
            LcdData(*(zPtr+initi*64+initj),1);      /* Access to two LCD area     */
        }
    }
    LcdCmd(0x03f,0);                              	/* Display on/off, 0x3f = on, 0x3e = off */
 }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -