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

📄 12864.c

📁 LCD12864程序及Protues仿真
💻 C
📖 第 1 页 / 共 2 页
字号:
//LCD12864
//**********************************************************
//连线表: CPU=89C51    SysClock=12MHz                     *
//RS=P2.0   R/W=P2.1    E=P2.2    CS1=P2.4    CS2=P2.3     *
//DB0-DB7=P0.0-P0.7       /Reset=InBoard                   *
//********************************************************** 
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h> 
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
/********************引脚定义********************/ 
#define DataPort P3     //LCD128*64 I/O 信号管脚
sbit    RS =P2^0;      //数据指令
sbit    RW =P2^1;      //读写
sbit    E   =P2^2;      //使能
sbit    CSL =P2^3;      //左片选
sbit    CSR =P2^4;      //右片选 
sbit 	Key1=P1^3;
sbit	Key2=P1^4;
uchar Page;             //页 地址
uchar Col;              //列 地址 
uchar code BMP1[];      //一幅图
uchar code HZK_12[];    //12×12阵点字模
uchar code ASC_5x7[];   //5×7阵点字模
uchar str[4];
/********************函数定义*******************/
void BusyL(void);          //左屏检测忙
void BusyR(void);          //右屏检测忙
void CheckBusy(void);      //读取忙信号
void Delay(uint MS);       //延时
void Locatexy(void);       //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y
void WriteCommandL( uchar CommandByte );    //向左屏写入指令
void WriteCommandR( uchar CommandByte );    //向右屏写入指令
uchar ReadData( void );       //读数据
void WriteData( uchar DataByte );    //写数据
void LcmClear( void );       //清屏
void LcmInit( void );        //初始化
void LcmPutBMP( uchar *puts );      //显示一幅图
void LcmReverseBMP( void );         //将整屏反显
void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12×12汉字
uchar * uchartostr(unsigned char unm);            //将值转成字符串
void LcmPutAsc( uchar asc );     //显示一个5×7的ASC字符
void LcmPutstr( uchar row,uchar y,uchar * str );       //在设定位置显示字符串
void LcmPutpoint( uchar ro,uchar lie,uchar colour );   //在设定位置显示一个点

/***************************/
/*检查Busy                 */
/***************************/
void BusyL(void)
{
        CSL= 1;
        CSR= 0;
        CheckBusy();
} 
void BusyR(void)
{
        CSL= 0;
        CSR= 1;
        CheckBusy();
} 
void CheckBusy(void)
{
        RS = 0;         //指令
        RW = 1;
		DataPort= 0xFF;      //输出0xff以便读取正确
        E = 1;
        _nop_();
		while(!(DataPort & 0x80));
		/*DataPort & 0x80);*/    
		//Status Read Bit7 = BUSY 这地方有点问题,用了while(//DataPort & 0x80)后就一直
		//读不到0了,陷入死循环。当用while(0) 时反而能正常工作,不知道有没有人能解释       
        E = 0;
        _nop_();
} 
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置     */
/********************************************************/
void Locatexy(void)
{
        uchar x,y;
        switch (Col&0xc0)       /* col.and.0xC0        */
        {                       /*条件分支执行          */
                case 0:         {BusyL();break;}/*左区 */
                case 0x40:      {BusyR();break;}/*右区 */
        }
        x = Col&0x3F|0x40;      /* col.and.0x3f.or.Set Y Address*/
        y = Page&0x07|0xB8;     /* row.and.0x07.or.set Page     */
        CheckBusy();                /* waitting for enable */
        RS = 0;                 //指令
        RW = 0;                 //写
        DataPort = y;                 //设置页面地址
        E = 1;
        _nop_();
        E = 0;
        _nop_();
        CheckBusy();                /* waitting for enable */
        RS = 0;
        RW = 0;
        DataPort = x;                 //设置列地址
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
/***************************/
/*写指令                   */
/***************************/
void WriteCommandL( uchar CommandByte )
{
        BusyL();
        DataPort = CommandByte;
        RS = 0;         //指令
        RW = 0;
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
void WriteCommandR( uchar CommandByte )
{
        BusyR();
        DataPort = CommandByte;
        RS = 0;         //指令
        RW = 0;
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
/***************************/
/*读数据                   */
/***************************/
uchar ReadData( void )
{
        uchar DataByte;
        Locatexy();     /*坐标定位,返回时保留分区状态不变      */
        RS = 1;         /*数据输出*/
        RW = 1;         /*读入 */
        DataPort = 0xFF;              //输出0xff以便读取正确
        E = 1;         /*读入到LCM*/
        _nop_();
        DataByte = DataPort; /*数据读出到数据口P1 */
        E = 0;
        _nop_();
        return DataByte;
} 
/***************************/
/*写数据                   */
/***************************/
void WriteData( uchar DataByte )
{
        Locatexy();     /*坐标定位,返回时保留分区状态不变      */
        RS = 1;         /*数据输出*/
        RW = 0;         /*写输出 */
        DataPort = DataByte; /*数据输出到数据口 */
        E = 1;         /*写入到LCM*/
        _nop_();
        E = 0;
        _nop_();
} 
void LcmClear( void )
{
        Page = 0;
        Col = 0;
        for(Page=0;Page<8;Page++)
                for(Col=0;Col<128;Col++)
                        WriteData(0);
} 
void LcmInit( void )
{
    Delay(200);     //等待复位
        WriteCommandL(0x3f);    //开显示
        WriteCommandR(0x3f);
        
        WriteCommandL(0xc0);    //设置起始地址=0
        WriteCommandR(0xc0); 
        WriteCommandL(0x3f);    //开显示
        WriteCommandR(0x3f); 
        LcmClear();
        Col = 0;
        Page= 0;
        Locatexy();
}
void LcmPutBMP( uchar *puts )
{
        uint X=0;
        Page = 0;
        Col = 0;
        for(Page=0;Page<8;Page++)
        {
                for(Col=0;Col<128;Col++)
                {
                        WriteData( puts[X] );
                        X++;
                }
        }
} 
void LcmReverseBMP( void )
{
        uchar temp;
        Page = 0;
        Col = 0;
        for(Page=0;Page<8;Page++)
        {
                for(Col=0;Col<128;Col++)
                {
                        temp = ReadData();      //空读一次
                        temp = ReadData();
                        temp = ~temp;
                        WriteData(temp);
                }
        }
}
//写汉字 
void LcmPutHZ_12( uchar x,uchar y,uchar HZcode )
{      
   uchar offset,Rd,Wt,m,tmp,i;
   uint n;
   if(x<117&y<53)
    {
    Page=(y & 0x38)>>3;
   Col=x;
      n = 0x18*HZcode;
   offset=y&0x07;
   if(offset<5)
   {
             for(i=12;i>0;i--)
              { 
                 Rd=ReadData();
       Rd=ReadData();
       m=HZK_12[n];
             Wt=Rd&(0xff>>(8-offset))|(m<<offset);
                 WriteData(Wt);
         Page++;
         n++;
         tmp=m;
         m=HZK_12[n];
         Rd=ReadData();
       Rd=ReadData();
         Wt=tmp>>(8-offset)|(m<<offset)|(Rd&(0xff<<(offset+4)));
                 WriteData(Wt);
                 Col++;
                 Page--;
       n++;
      }
   }
   else
   {
       for(i=12;i>0;i--)
                 {
                   Rd=ReadData();
       Rd=ReadData();
           m=HZK_12[n];
               Wt=Rd&(0xff>>(8-offset))|(m<<offset);
                   WriteData(Wt);
           Page++;
           n++;
           tmp=m;
           m=HZK_12[n];
       Wt=tmp>>(8-offset)|(m<<offset);
       WriteData(Wt);
       Page++;
       n++;
       Rd=ReadData();
       Rd=ReadData();
       Wt=m>>(8-offset)|(Rd&(0xff<<(offset-4)));
        WriteData(Wt);
       Page=Page-2;//恢复位置
       Col++; //修正下一个汉字的起始位置
       }
        }
   }
}
uchar * uchartostr(uchar unm)
{
uchar x00,xx,x0,x,n;
x00=unm/100;
xx=unm%100;
x0=xx/10;
x=xx%10;
n=0;
if(x00!=0)
{ str[n]=x00+48; //值加48即为字符
    n++;
}
if(!(x00==0&x0==0))
{ str[n]=x0+48;
    n++;
}
str[n]=x+48;
n++;
str[n]='\0';
   return str;
}
void LcmPutAsc( uchar asc )
{
        uchar j;
        uint x;
        x = 5*(asc-32);
            for(j=0;j<5;j++)
                {
                        WriteData(ASC_5x7[x]);
                        x++;
                        Col++;
                }
            WriteData(0x00); 
            Col++;
}
void LcmPutstr( uchar row,uchar y,uchar * str )
{ unsigned char * x;
   x=str;
Page=row;
Col=y;
while(*x!='\0')
{ LcmPutAsc( *x );
    x++;
}
}

void LcmPutpoint( uchar ro,uchar lie,uchar colour )   //画点函数
{
    if((ro<64)&(lie<128))
   {
        uchar modbyte,outByte;
        uchar offsetbit;
    Col=lie;                  //列等于lie
        Page=(ro & 0x38)>>3;     //页等于行数row与00111000B再右移3位
        offsetbit=ro&0x07;       //偏移量为行数与00000111
        modbyte=1;
    modbyte<<= offsetbit;     //输出位的模00000001左移offsetbit位
    outByte=ReadData();
    outByte=ReadData();
    if(colour==0)
    {
          modbyte=~modbyte;
      outByte=modbyte&outByte;     //输出位不影响其它位
    }
    else outByte=modbyte|ReadData();     //输出位不影响其它位
        WriteData(outByte);
   }
}

void Delay(uint MS)
{
        uchar us,usn;
        while(MS!=0)
        {
                usn = 2;        //for 12M
                while(usn!=0)
                {
                        us=0xf6;
                        while (us!=0){us--;};
                        usn--;
                }
                MS--;
        }
} 

/*************************************8888
数字转化成字符
*******************************************/
uchar *conv(uint shuzi)
{
	uchar *zifu;
	switch (shuzi)
	{
		case 0 :
		{
		zifu="0";
		break;
		}
		case 1 :
		{
		zifu="1";
		break;
		}
		case 2 :
		{
		zifu="2";
		break;
		}
		case 3 :
		{
		zifu="3";
		break;
		}

⌨️ 快捷键说明

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