st7920驱动OCMJ2X8C屏使用CGRAM自定义图标

这篇博客介绍了如何使用STM32F103C8T6微控制器驱动12864点阵LCD显示器,包括设置指令、自定义图标存入及显示的方法。通过扩展指令集设置CGRAM地址,存储16*16像素的图标,并通过调用码在屏幕上显示。博主提供了详细的代码实现,包括数据写入、显示函数及初始化配置,并给出了字模提取软件的使用步骤。
摘要由CSDN通过智能技术生成

1、官网地址:前台 - 肇庆市金鹏实业有限公司 (gptlcm.cn)

2、屏参数:点阵数128*32,显示2行8列。供电5v,注意供电不足5v时显示不清或不显示。

3、手册上相关说明

每个调用码可以存一个16*16的图标,所以总共能存4个16*16的图标。根据40H-4FH等地址存入,显示时使用调用码。

 4、自定义图标放入CGROM操作步骤:

    存入步骤:

  1. 设置为扩充指令集;
  2. 设置SR=0,允许设定CGRAM地址;
  3. 设置为基本指令集;
  4. 循环执行以下操作写入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、图片制作

  1. 先找图片,在阿里巴巴矢量库中找【返回】图片,下载-》字号16-》PNG下载,字模软件用的图片格式是bmp,所以图片用电脑自带的画图软件另存为bmp格式。
  2. 使用字模提取软件

基本操作-》打开图像图标;

参数设置-》其他选项-》选横向取模,字节倒序不选。

取模方式-》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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值