1、官网地址:前台 - 肇庆市金鹏实业有限公司 (gptlcm.cn)
2、屏参数:点阵数128*32,显示2行8列。供电5v,注意供电不足5v时显示不清或不显示。
3、手册上相关说明
每个调用码可以存一个16*16的图标,所以总共能存4个16*16的图标。根据40H-4FH等地址存入,显示时使用调用码。
4、自定义图标放入CGROM操作步骤:
存入步骤:
- 设置为扩充指令集;
- 设置SR=0,允许设定CGRAM地址;
- 设置为基本指令集;
- 循环执行以下操作写入16个字节数据(设定CGRAM的存储地址,写入自定义数据);
- 显示步骤:
- 设置DDRAM地址;
- 写入CGRAM调用码
5、实现代码:
/*
数据写入
num:0,1,2,3,对应调用号0000H,0002H,0004H,0006H
pdat:图标数据
*/
void SET_CGRAM(uint8_t num,uint8_t *pdat)
{
uint8_t i,add;
wr_lcd (comm,0x34);//扩展指令集
wr_lcd (comm,0x02); //允许写CGRAM地址
wr_lcd (comm,0x30); //基本指令集
add = (num <<4) | 0x40;//DB6=1,所以或0x40
for(i=0;i<16;i++)
{
wr_lcd (comm,add+i);
wr_lcd (dat,pdat[i*2]);
wr_lcd (dat,pdat[i*2+1]);
}
}
void Set_Cursor(uint8_t x1,uint8_t y1)
{
uint8_t i=0;
switch(x1)
{
case 0:
i=0x80;
break;
case 1:
i=0x90;
break;
}
i=y+i;
wr_lcd (comm,i);
}
/*
显示函数
形参:x1,y1显示坐标,num:0,1,2,3,对应调用号0000H,0002H,0004H,0006H
*/
void Display_CGRAM(uint8_t x1,uint8_t y1,uint8_t num)
{
Set_Cursor(x1,y1);
wr_lcd (dat,0);
wr_lcd (dat,num*2);
}
6、代码解释:
wr_lcd (comm,0x34); 0x34=0011 0100 即DL=1 8bit接口,RE=1:扩充指令集 G=0 绘图OFF
wr_lcd (comm,0x02); 0x02: SR=0
CGRAM地址:从0x40开始,因为DB6=1 ,0100 0000=0x40
Display_CGRAM函数是写调用号。
7、函数调用
在main.c里初始化SET_CGRAM(1,Ret);
显示时调用 Display_CGRAM(0,1,1);
8、图片制作
- 先找图片,在阿里巴巴矢量库中找【返回】图片,下载-》字号16-》PNG下载,字模软件用的图片格式是bmp,所以图片用电脑自带的画图软件另存为bmp格式。
- 使用字模提取软件,
基本操作-》打开图像图标;
参数设置-》其他选项-》选横向取模,字节倒序不选。
取模方式-》C51
16*16的图片生成的字节数16*16/8=32个字节。一行16个点对应2个字节。
uint8_t Ret[32]={
0x00,0x00,0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x7F,0xF8,0x70,0x1C,
0x38,0x06,0x0C,0x06,0x06,0x02,0x02,0x06,0x00,0x0E,0x07,0xFC,0x07,0xF0,0x00,0x00,
};
参考:带字库12864超详细扩展操作,写自定义字符,画图,画直线,画圆,读取数据等操作.doc (book118.com)
附OCMJ2X8C的初始化,用的stm32f103c8t6
#define uint unsigned int
#define uchar unsigned char
#define x 0x80
#define y 0x80
#define comm 0
#define dat 1
#define Set_rs GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define Clr_rs GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define Set_rw GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define Clr_rw GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define Set_e GPIO_SetBits(GPIOB,GPIO_Pin_1)
#define Clr_e GPIO_ResetBits(GPIOB,GPIO_Pin_1)
vu32 nTime;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void wr_lcd (uchar dat_comm,uchar content);
void chk_busy (void) //忙检测
{
//PA7接DB7,设为输入,作为忙检测
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Clr_rs;
Set_rw;
Set_e;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)!=0)
;
Clr_e;
//转为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*---------------显示汉字或字符----------------*/
void chn_disp (uchar *chn)
{
uchar i,j;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
j=0;
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
wr_lcd (comm,0x90);
j=1;
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
}
void Delay(vu32 time)
{
nTime = time;
while(nTime--);
}
void GPIO_Configuration(void) //初始化IO口
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void init_lcd (void)
{
// rst=1;
GPIO_Configuration();
GPIO_SetBits(GPIOB,GPIO_Pin_0) ; //RST引脚置高
Delay(1000);
//Set_psb;
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
Delay(5000);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uint a;
chk_busy ();
//Delay(20);
a=(uint)content;
if(dat_comm)
{
Set_rs; //data
Clr_rw; //write
}
else
{
Clr_rs; //command
Clr_rw; //write
}
//Delay(10);
GPIO_Write(GPIOA,a);
//Delay(20);
Set_e;
Delay(30);
Clr_e;
}
/*----------------显示图形-----------------*/
void img_disp (uchar *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
wr_lcd (comm,0x36);
}