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);
}}