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

📄 ca12864.txt

📁 12864的C语言版
💻 TXT
字号:



//***************************************************************************
//连线表:  CPU=89C52                                                        *
//RS=P2.0            R/W=P2.1               CS1=P2.7        CS2=P2.6        *
//SysClock=12MHz     DB0-DB7=P0.0-P0.7      E=/(WR*RD)      /Reset=InBoard  *
//***************************************************************************

#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>

/********************接口定义********************/
char xdata LcmWriteCmdPort1   _at_ 0x8000;      //CS1=1 RW=0 RS=0
char xdata LcmWriteCmdPort2   _at_ 0x4000;      //CS2=1 RW=0 RS=0
char xdata LcmWriteDataPort1  _at_ 0x8100;      //CS1=1 RW=0 RS=1
char xdata LcmWriteDataPort2  _at_ 0x4100;      //CS2=1 RW=0 RS=1
char xdata LcmReadStatusPort1 _at_ 0x8200;      //CS1=1 RW=1 RS=0
char xdata LcmReadStatusPort2 _at_ 0x4200;      //CS2=1 RW=1 RS=0
sbit Key   =P3^4;

unsigned char Page;      //页 地址
unsigned char Col;      //列 地址

unsigned char code BMP1[];
unsigned char code HZ1[];

void Delay(unsigned int MS);

/***************************/
/*检查Busy                 */
/***************************/
void Busy1(void)
{
     _nop_();
     while(LcmReadStatusPort1 & 0x80);      //Status Read Bit7 = BUSY
     _nop_();
}

void Busy2(void)
{
     _nop_();
     while(LcmReadStatusPort2 & 0x80);      //Status Read Bit7 = BUSY
     _nop_();
}

/***************************/
/*写指令                   */
/***************************/
void WriteCommand1( unsigned char CommandByte )
{
     Busy1();
     LcmWriteCmdPort1 = CommandByte;
     _nop_();
}

void WriteCommand2( unsigned char CommandByte )
{
     Busy2();
     LcmWriteCmdPort2 = CommandByte;
     _nop_();
}

/***************************/
/*写数据                   */
/***************************/
void WriteData( unsigned char DataByte )
{
     unsigned char x,y;
     switch (Col&0xc0)      /*  col.and.0xC0      */
     {                  /*条件分支执行            */
           case 0:
           {
                 x = Col&0x3F|0x40;      /* col.and.0x3f.or.Set Y Address*/
                 y = Page&0x07|0xB8;      /* row.and.0x07.or.set Page      */
                 WriteCommand1(y);            //设置页面地址
                 WriteCommand1(x);            //设置列地址
                 Busy1();
                 LcmWriteDataPort1 = DataByte;
                 _nop_();
                 break;                  //完成case分支
           }
           case 0x40:
           {
                 x = Col&0x3F|0x40;      /* col.and.0x3f.or.Set Y Address*/
                 y = Page&0x07|0xB8;      /* row.and.0x07.or.set Page      */
                 WriteCommand2(y);            //设置页面地址
                 WriteCommand2(x);            //设置列地址
                 Busy2();
                 LcmWriteDataPort2 = DataByte;
                 _nop_();
                 break;                  //完成case分支
           }
     }
}

void LcmClear( void )
{
     Page = 0;
     Col  = 0;
     for(Page=0;Page<8;Page++)
           for(Col=0;Col<128;Col++)
                 WriteData(0);
}

void LcmInit( void )
{
     WriteCommand1(0x3f);      //开显示
     WriteCommand2(0x3f);
     
     WriteCommand1(0xc0);      //设置起始地址=0
     WriteCommand2(0xc0);

     WriteCommand1(0x3f);      //开显示
     WriteCommand2(0x3f);

     LcmClear();
     Col = 0;
     Page= 0;
}

void LcmPutDots( unsigned char DotByte , unsigned char n)
{
     unsigned char i,j;
     Page = 0;
     Col  = 0;
     for(Page=0;Page<8;Page++)
     {
           Col = 0;
           for(i=0;i<128/n;i++)
           {
                 for(j=0;j<n;j++)
                 {
                       WriteData( DotByte );
                       Col++;
                 }
                 DotByte = ~DotByte;
           }
           if(DotByte ==0||DotByte==0xff) DotByte=~DotByte;      //12864在显示8x8点阵时候需要换页时候取反
     }
}

void LcmPutBMP( unsigned char *puts )
{
     unsigned int X=0;
     Page = 0;
     Col  = 0;
     for(Page=0;Page<8;Page++)
     {
           for(Col=0;Col<128;Col++)
           {
                 WriteData( puts[X] );
                 X++;
           }
     }
}

void LcmPutHZ( unsigned char HZcode )
{
     unsigned char i,j;
     unsigned int  x;
     x = 0x20*HZcode;
     for(i=0;i<2;i++)
     {
           for(j=0;j<16;j++)
           {
                 WriteData(HZ1[x]);
                 x++;
                 Col++;
           }
           Page++;
           Col = Col-16;      //恢复位置
     }
     Page = Page-2;      //修正下一个汉字的起始位置
     Col  = Col+16;      //下一个汉字接在这个汉字后面
}

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

void DelayKey(unsigned int Second , unsigned int MS100)
{                                    //输入精确到0.1S,是用,
     unsigned int i;
     for(i=0;i<Second*100+MS100*10;i++)
     {
           if(Key==0)
           {
                 Delay(20);
                 while(Key==0) {Delay(20);}
                 break;
           }
           else Delay(10);
     }                        
}

void Main( void )
{
     unsigned char HZ;
     Delay(20);      //等待复位
     LcmInit();
     LcmClear();
     while(1)
     {
           LcmPutBMP(BMP1);
           DelayKey(1,5);
           
           for(Page=0;Page<8;Page+=2)
           {
                 Col = 0;
                 for(HZ=0;HZ<8;HZ++) LcmPutHZ(HZ);
           }
           DelayKey(1,5);
           
           LcmPutDots(0x55,1);
           DelayKey(1,5);
           LcmPutDots(0xAA,1);
           DelayKey(1,5);
           LcmPutDots(0x33,2);
           DelayKey(1,5);
           LcmPutDots(0xCC,2);
           DelayKey(1,5);
           LcmPutDots(0x0F,4);
           DelayKey(1,5);
           LcmPutDots(0xF0,4);
           DelayKey(1,5);
           LcmPutDots(0x00,8);
           DelayKey(1,5);
           LcmPutDots(0xFF,8);
           DelayKey(1,5);
     }
}
 

⌨️ 快捷键说明

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