HGS256643参考程序

发布时间:2018/8/3 13:09:19

HGS256643为5.5寸256*64分辨率的OLED显示模块,内置SSD1322控制器,接口并口串口可选,显示效果为黑底绿字,电压5/3v可选,该屏为长条形OLED模块非常适合2U机箱使用

HGS256643参考程序如下:

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define Shift 0x1C

void delayus(uchar m);

void delayms(uchar m);

void change (uchar dat);

sbit REST=P3^5;    // Reset

sbit CS=P3^4;    // Chip Select

sbit RS=P3^0;    // Data/Command Control

sbit RW=P3^1;    // Write Signal

sbit E=P3^3;    // Write Signal

void Fill_RAM(unsigned char Data) ;

uchar code tab816[160]={

/*--  文字:  H  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,

/*--  文字:  G  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x3C,0x44,0x44,0x80,0x80,0x80,0x8E,0x84,0x44,0x44,0x38,0x00,0x00,

/*--  文字:  S  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x20,0x18,0x04,0x02,0x42,0x42,0x7C,0x00,0x00,

/*--  文字:  2  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,

/*--  文字:  5  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

/*--  文字:  6  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

/*--  文字:  X  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00,

/*--  文字:  6  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

/*--  文字:  4  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,

/*--  文字:  1  --*/

/*--  Times New Roman12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,

};

uchar code tab1616[]={

/* 点阵:16x16

  提取点阵方向:横向(先左->右, 再上->下)

  字节掉转:否

  字节方式:C语言 */

0x00,0x40,0x40,0x48,0x37,0xFC,0x10,0x40,    // 清

0x83,0xF8,0x60,0x40,0x2F,0xFE,0x08,0x08,

0x13,0xFC,0x22,0x08,0xE3,0xF8,0x22,0x08,

0x23,0xF8,0x22,0x08,0x22,0x28,0x22,0x10,

0x00,0x80,0x40,0x80,0x20,0x80,0x20,0x80,    // 达

0x00,0x88,0x0F,0xFC,0xE0,0x80,0x21,0x00,

0x21,0x40,0x22,0x20,0x22,0x10,0x24,0x18,

0x28,0x08,0x50,0x06,0x8F,0xFC,0x00,0x00,

0x01,0x00,0x21,0x08,0x11,0x0C,0x09,0x10,    // 光

0x09,0x20,0x01,0x04,0xFF,0xFE,0x04,0x40,

0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x40,

0x08,0x42,0x10,0x42,0x20,0x3E,0x40,0x00,

0x02,0x00,0x02,0x00,0x02,0x10,0x7F,0xF8,    // 电

0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x10,

0x42,0x10,0x7F,0xF0,0x42,0x10,0x02,0x00,

0x02,0x04,0x02,0x04,0x01,0xFC,0x00,0x00,

0x04,0x10,0x0E,0x10,0xF8,0x90,0x08,0x50,    // 科

0x08,0x10,0xFE,0x90,0x08,0x50,0x1C,0x14,

0x1A,0x1E,0x29,0xF0,0x28,0x10,0x48,0x10,

0x88,0x10,0x08,0x10,0x08,0x10,0x08,0x10,

0x10,0x40,0x10,0x40,0x10,0x48,0x13,0xFC,    // 技

0xFC,0x40,0x10,0x40,0x10,0x40,0x13,0xF8,

0x1A,0x08,0x31,0x10,0xD1,0x10,0x10,0xA0,

0x10,0x40,0x10,0xB0,0x51,0x0E,0x26,0x04,

0x02,0x00,0x02,0x04,0xFF,0xFE,0x04,0x00,    // 有

0x04,0x10,0x0F,0xF8,0x08,0x10,0x18,0x10,

0x2F,0xF0,0x48,0x10,0x88,0x10,0x0F,0xF0,

0x08,0x10,0x08,0x10,0x08,0x50,0x08,0x20,

0x00,0x08,0x7D,0xFC,0x45,0x08,0x49,0x08,    // 限

0x49,0xF8,0x51,0x08,0x49,0x08,0x49,0xF8,

0x45,0x04,0x45,0x88,0x45,0x50,0x69,0x20,

0x51,0x10,0x41,0x4E,0x41,0x84,0x41,0x00,

0x00,0x00,0x00,0x80,0x04,0x80,0x04,0x40,    // 公

0x08,0x40,0x08,0x20,0x11,0x10,0x21,0x0E,

0xC2,0x04,0x02,0x00,0x04,0x00,0x08,0x40,

0x10,0x20,0x1F,0xF0,0x00,0x10,0x00,0x00,

0x00,0x08,0x3F,0xFC,0x00,0x08,0x00,0x48,    // 司

0xFF,0xE8,0x00,0x08,0x00,0x88,0x3F,0xC8,

0x20,0x88,0x20,0x88,0x20,0x88,0x20,0x88,

0x3F,0x88,0x20,0x88,0x00,0x28,0x00,0x10,

};

/*********************

延时子程序

********************/

void delayus(uchar m)

{

while(--m);

}

void delayms(uchar m)

{

uchar i,j;

for(i=0;i<102;i++)

for(j=0;j<m;j++)

delayus(1);

}

void delay(uchar m)

{

uchar i,j;

for(i=0;i<100;i++)

for(j=0;j<m;j++)

delayms(1);

}

//80XX方式写指令和数据子程序

void Write_cmd(unsigned char Data)

{       RS=0;

CS=0;

E=1;

P1=Data;

       RW=0;

       _nop_();

       _nop_();

       RW=1;

// RW=1;

CS=1;

RS=1;

}

void Write_dat(unsigned char Data)

{         RS=1;

CS=0;

E=1;

P1=Data;

        RW=0;

       _nop_();

       _nop_();

       RW=1;

// RW=1;

CS=1;

RS=1;

}

/********************************************

行,列,起始地址设定,写入命令定义 一个像素对应4位

********************************************/

void Set_Column_Address(unsigned char a, unsigned char b)

{

Write_cmd(0x15); // Set Column Address

Write_dat(a); //   Default => 0x00

Write_dat(b); //   Default => 0x77

}

void Set_Row_Address(unsigned char a, unsigned char b)

{

Write_cmd(0x75); // Set Row Address

Write_dat(a); //   Default => 0x00

Write_dat(b); //   Default => 0x7F

}

void Set_Write_RAM()

{

Write_cmd(0x5C); // Enable MCU to Write into RAM

}

void Set_Remap_Format(unsigned char d)

{

Write_cmd(0xA0); // Set Re-Map / Dual COM Line Mode

Write_dat(d); //   Default => 0x40

Write_dat(0x11); //   Default => 0x01 (Disable Dual COM Mode)

}

/* ***********************************

//初始化程序

***************************************/

void Initial (void)

{

   REST=0;

delayms(100);

REST=1;

   delayms(100);

Write_cmd(0xFD);

Write_dat(0x12);  //打开MCU通信

Set_Column_Address(0x1c,0x5b);   //256列

Set_Row_Address(0x00,0x3f); //64行

Write_cmd(0xAE);  //开休眠

Write_cmd(0xB3);  ///驱动和振荡时钟

Write_dat(0x91);

Write_cmd(0xCA); ///设定MUX占空比

Write_dat(0x3F);

Write_cmd(0xA2);

Write_dat(0x00); //卷动地址

Write_cmd(0xA1);

Write_dat(0x00); //起始行

   Write_cmd(0xA6);  //正常显示

Write_cmd(0xA0);

Write_dat(0x14);

Write_dat(0x11);  //扫描方向

Write_cmd(0xB5); ///set gpio

Write_dat(0x00);

Write_cmd(0xAB);

Write_dat(0x01); //内部调节电压

Write_cmd(0xB4); ///加深显示Display Enhancement a

Write_dat(0xA0);

Write_dat(0xfd); //0xb5

Write_cmd(0xC1); ///Set Contrast Current

Write_dat(0xaf); //9f

Write_cmd(0xC7);  //Master Contrast Current Control

Write_dat(0x0F);

Write_cmd(0xb8);  //灰模

Write_dat(0x0c);

Write_dat(0x18);

Write_dat(0x24);

Write_dat(0x30);

Write_dat(0x3c);

Write_dat(0x48);

Write_dat(0x54);

Write_dat(0x60);

Write_dat(0x6c);

Write_dat(0x78);

Write_dat(0x84);

Write_dat(0x90);

Write_dat(0x9c);

Write_dat(0xa8);

Write_dat(0xb4);

Write_cmd(0x00);

Write_cmd(0xB1); //Set Phase Length

Write_dat(0xE2);

Write_cmd(0xD1); //Display Enhancement B

Write_dat(0xa2);

Write_dat(0x20);//反显

Write_cmd(0xBB);

Write_dat(0x1F);

Write_cmd(0xB6);

Write_dat(0x08);

Write_cmd(0xBE);

Write_dat(0x07);//0.86VCC

Write_cmd(0xA6);//正常显示

Write_cmd(0xA9);//退部分显示

Write_cmd(0x5c);

Fill_RAM(0x00);

       Write_cmd(0xAF);  //关休眠

}

/***************************************

全和间隔列显示

**************************************/

void Fill_RAM(unsigned char Data)

{

unsigned char i,j;

Set_Column_Address(0x1c,0x5b);

Set_Row_Address(0x00,0x3f);

Set_Write_RAM();

for(i=0;i<64;i++)

{

for(j=0;j<64;j++)

{

Write_dat(Data);

Write_dat(Data);

}

}

}

/***************************************

间隔行显示

**************************************/

void hang(unsigned char Data)

{

unsigned char i,j;

Set_Column_Address(0x1c,0x5b);

Set_Row_Address(0x00,0x3f);

Set_Write_RAM();

for(i=0;i<32;i++)

{

for(j=0;j<64;j++)

{

Write_dat(Data);

Write_dat(Data);

}

for(j=0;j<64;j++)

{

Write_dat(~Data);

Write_dat(~Data);

}

}

}

/***************************************

间隔点显示

**************************************/

void gedot(uchar m)

{

   unsigned char i,j;

Set_Column_Address(0x1c,0x5b);   //256列

Set_Row_Address(0x00,0x3f); //128行

Set_Write_RAM();

for(i=0;i<32;i++)

{

for(j=0;j<64;j++)

{

  if(m==0xf0)

  {

Write_dat(0xf0);

    Write_dat(0xf0);

}

else

{

Write_dat(0x0f);

    Write_dat(0x0f);

}

}

for(j=0;j<64;j++)

{

                       if(m==0xf0)

  {

Write_dat(0x0f);

    Write_dat(0x0f);

}

else

{

Write_dat(0xf0);

    Write_dat(0xf0);

}

}

}

}

/*****************************************************

矩形边框

*********************************************************/

 void biank()

 {

    unsigned char i,j;

            Set_Remap_Format(0x14);

 Write_cmd(0x15);

             Write_dat(0x1c);

 Write_dat(0x5b);

             Write_cmd(0x75);

 Write_dat(0x00);

 Write_dat(0x00);

             Write_cmd(0x5c);

for(i=0;i<64;i++)

{

           Write_dat(0xff);

Write_dat(0xff);

}

             Write_cmd(0x75);

 Write_dat(0x3f);

 Write_dat(0x3f);

             Write_cmd(0x5c);

for(i=0;i<64;i++)

{

           Write_dat(0xff);

Write_dat(0xff);

}

           Set_Remap_Format(0x15);

 Write_cmd(0x15);

             Write_dat(0x1c);

 Write_dat(0x1c);

             Write_cmd(0x75);

 Write_dat(0x01);

 Write_dat(0x3e);

             Write_cmd(0x5c);

           for(i=0;i<64;i++)

{

           Write_dat(0xf0);

Write_dat(0x00);

}

           Write_cmd(0x15);

           Write_dat(0x5b);

Write_dat(0x5b);

           Write_cmd(0x5c);

           for(i=0;i<64;i++)

{

           Write_dat(0x00);

Write_dat(0x0f);

}

           Set_Remap_Format(0x14);

}

/************************************************

转换函数,D7=1,一位转换成四位

************************************************/

void change (uchar m)

{ uchar dat;

           dat=m;

// delayus(200);

if((dat&0x80)&&(dat&0x40)&&(dat&0x20)&&(dat&0x10))   //1111

    {

 Write_dat(0xff);

     Write_dat(0xff);

}

if((dat&0x80)&&(dat&0x40)&&(dat&0x20)&&(!(dat&0x10)) ) //1110

    {

 Write_dat(0xff);

     Write_dat(0xf0);

}

if((dat&0x80)&&(dat&0x40)&&(!(dat&0x20))&&(dat&0x10) ) //1101

    {

 Write_dat(0xff);

     Write_dat(0x0f);

}

 if((dat&0x80)&&(dat&0x40)&&(!(dat&0x20))&&(!(dat&0x10))) //1100

    {

 Write_dat(0xff);

     Write_dat(0x00);

}

  if((dat&0x80)&&(!(dat&0x40))&&(dat&0x20)&&(dat&0x10)) //1011

    {

 Write_dat(0xf0);

     Write_dat(0xff);

}

 if((dat&0x80)&&(!(dat&0x40))&&(dat&0x20)&&(!(dat&0x10))) //1010

    {

 Write_dat(0xf0);

     Write_dat(0xf0);

}

  if((dat&0x80)&&(!(dat&0x40))&&(!(dat&0x20))&&(dat&0x10)) //1001

    {

 Write_dat(0xf0);

     Write_dat(0x0f);

}

   if((dat&0x80)&&(!(dat&0x40))&&(!(dat&0x20))&&(!(dat&0x10))) //1000

    {

 Write_dat(0xf0);

     Write_dat(0x00);

}

/************************************************

D7=0,一位转换成四位

************************************************/

if((!(dat&0x80))&&(dat&0x40)&&(dat&0x20)&&(dat&0x10) ) //0111

    {

 Write_dat(0x0f);

     Write_dat(0xff);

}

if((!(dat&0x80))&&(dat&0x40)&&(dat&0x20)&&(!(dat&0x10)) ) //0110

    {

 Write_dat(0x0f);

     Write_dat(0xf0);

}

if((!(dat&0x80))&&(dat&0x40)&&(!(dat&0x20))&&(dat&0x10) ) //0101

    {

 Write_dat(0x0f);

     Write_dat(0x0f);

}

 if((!(dat&0x80))&&(dat&0x40)&&(!(dat&0x20))&&(!(dat&0x10))) //0100

    {

 Write_dat(0x0f);

     Write_dat(0x00);

}

  if((!(dat&0x80))&&(!(dat&0x40))&&(dat&0x20)&&(dat&0x10)) //0011

    {

 Write_dat(0x00);

     Write_dat(0xff);

 delayus(2);

}

 if((!(dat&0x80))&&(!(dat&0x40))&&(dat&0x20)&&(!(dat&0x10))) //0010

    {

 Write_dat(0x00);

     Write_dat(0xf0);

}

  if((!(dat&0x80))&&(!(dat&0x40))&&(!(dat&0x20))&&(dat&0x10)) //0001

    {

 Write_dat(0x00);

     Write_dat(0x0f);

}

   if((!(dat&0x80))&&(!(dat&0x40))&&(!(dat&0x20))&&(!(dat&0x10))) //0000

    {

 Write_dat(0x00);

     Write_dat(0x00);

}

}

/**********************************************************

在显示屏上写一个8*16的数字

// 用字模表tab816(1维数组),

//在坐标(x坐标)(y坐标)位置显示一行字(左上脚坐标),

//其中x坐标必须为偶数。

//字占row行,一行col点。

//以上定义都是unsigned char全局变量,

************************************************************/

void write_oled(uchar x,uchar y,uchar coder)

{

uchar dat;

uchar i;

//uchar *dat1;

 Set_Remap_Format(0x14);     //定义2个地址,两个字节

 Write_cmd(0x15);

             Write_dat(0x1c+x);

 Write_dat(0x1c+x+1);

             Write_cmd(0x75);              //16行

 Write_dat(0x00+y);

 Write_dat(0x10+y);

             Write_cmd(0x5c);

 /*

 dat1=tab816+16*coder;

 dat=&dat1;  */

  for(i=0;i<16;i++)

  {

       dat=tab816[i+16*coder];

   dat=dat&0xf0;

change(dat);

       dat=(tab816[i+16*coder]<<4)&0xf0;

   change(dat);

}

}

/*********************************************************

写入一行8*16的数字

****************************************************/            

  void string816(uchar x,uchar y,uchar m)

  {

  uchar i;

  for(i=0;i<m;i++)

  {

  write_oled(x,y,i);

  x=x+4;

  } }        

/**********************************************************

在显示屏上写一个16*16的汉字

// 用字模表tab1616(1维数组),

//在坐标(x坐标)(y坐标)位置显示一行字(左上脚坐标),

//其中x坐标必须为偶数。

//字占row行,一行col点。

//以上定义都是unsigned char全局变量,coder为代码值

************************************************************/

void hzwrite_oled(uchar x,uchar y,uchar coder)

{

uchar dat;

uchar i;

 Set_Remap_Format(0x14);    //定义6个地址,24点列

 Write_cmd(0x15);

             Write_dat(0x1c+x);

 Write_dat(0x1c+0x06+x);

             Write_cmd(0x75);         //24行

 Write_dat(0x00+y);

 Write_dat(0x00+0x18+y);

             Write_cmd(0x5c);

  for(i=0;i<72;i++)

  {

       dat=tab2424[i+72*coder];

   dat=dat&0xf0;

change(dat);

       dat=(tab2424[i+72*coder]<<4)&0xf0;

   change(dat);

}

}

//***********************************************

// 写入一行汉字

/**********************************************/            

 void stinghz(uchar x,uchar y,uchar m)

 {

  uchar i;

  for(i=0;i<m;i++)

  {

   hzwrite_oled(x,y,i);

   x=x+6;

  }

  }

/***************************************

主函数

**************************************/

void main(void)

{

Initial ();

while(1)

{

Fill_RAM(0xff);

delay(2);

Fill_RAM(0xf0);

delay(2);

Fill_RAM(0x0f);

delay(2);

gedot(0xf0);

delay(2);

gedot(0x0f);

delay(2);

hang(0xff);

delay(2);

hang(0x00);

delay(2);

Fill_RAM(0x00);

//write_oled(0,0,0x00);

//write_oled(4,0,0x01);

biank();

hzwrite_oled(14,5,0x00);

hzwrite_oled(22,5,0x01);

hzwrite_oled(30,5,0x02);

hzwrite_oled(38,5,0x03);

stinghz(4,25,10) ;

string816(14,45,10);

delay(5);

}}


上一篇:HGS128647-Y-EH-LV 参考电路设计图
下一篇:HGS2561281-G-EH-LV应用电路设计参考