STC12C 发表于 2024-8-19 11:10:59

读取字库芯片GT30L32S4W在12864OLED上显示

本帖最后由 DebugLab 于 2024-8-19 12:38 编辑

用32G12K128 读取字库芯片GT30L32S4W
一、字库信息:1、字库标准:GB2312国标汉字,ASCII字符。2、点阵排列方式:字节横置横排3、驱动方式:SPI二、OLED信息1、SSD13260.96寸128642、IIC驱动在使用字库芯片GT30L32S4W时需要注意芯片的数据手册,https://wenku.baidu.com/view/425b560a7fd5360cbb1adb73.html百度文库里的V1.01A版本中有计算公式。三、字库电路图:
四、SPI驱动
5、程序:程序分三部分:1、SPI驱动 2、字库数据处理 3、oled显示1、SPI驱动部分:1、SPI驱动部分:voidSPI_Init(void){                  P_SW3 &= 0xCF;                         //1100 1111                  P_SW3 |= 0x30;                        //0011 0000            //功能引脚切换                     S2CON = 0x10;                                     //00010000   允许串口接收数据                  USART2CR1 = 0x10;                  USART2CR4 = 0x00;                  USART2CR1 |= 0x08;         }/************************************************************************/voidSPI_WriteByte(unsigned char Byte){         S2TI=0;    S2BUF = Byte;    while(!S2TI) ;   
}
/************************************************************************/unsigned charSPI_ReadByte(void){         S2TI=0;    S2BUF = 0xFF;    while(!S2TI) ;       return (S2BUF);
}2、字库数据处理
/*********************************************************************************@brief发送字符地址*@paramAddr      地址*@retval none*******************************************************************************/void GT30L32S4W_Address_2(long Addr){         SPI_WriteByte(0x03);      //一般读取         /*发送擦除扇区地址的高位*/         SPI_WriteByte((unsignedchar)((Addr & 0xFF0000) >> 16));         /*发送擦除扇区地址的中位 */         SPI_WriteByte((unsignedchar)((Addr & 0xFF00) >> 8));         /*发送擦除扇区地址的低位 */         SPI_WriteByte((unsignedchar)(Addr & 0xFF));}/***@brief获取该汉字字符在15x16点GB2312标准库中的起始位置*@note   *@paramGB2312Code*@retval None*@date   2021/4*/static long GT30L32S4W_Get_Addr_GB2312_15x16(unsignedchar *GB2312Code){         unsignedchar   MSB,LSB ;            //         unsignedlong Base_Add ;             //         Base_Add= GT30L32S4W_BaseADD_15x16 ;         MSB= *GB2312Code;         LSB= *(GB2312Code + 1);         if((MSB>= 0xA1) && (MSB <= 0xA9) && (LSB >= 0xA1))         {                   return    ((MSB - 0xA1) * 94 + (LSB - 0xA1)) * 32 +Base_Add ;            
         }         elseif((MSB >= 0xB0) && (MSB <= 0xF7) && (LSB >= 0xA1))         {                   return((MSB - 0xB0) * 94 + ((LSB-0xA1) + 846)) * 32+ Base_Add ;            }         return-1;}/***@brief接收字符数据*@note   *@paramaddr                            bytesArray接收到的字符                            numOfBytes接受字符的长度*@retval None*@date   2021/1*/void GT30L32S4W_Read_FontBytes(long addr,unsigned char *bytesArray, unsigned char numOfBytes){         unsignedchar i;
         SPI_CS= 0;         GT30L32S4W_Address_2(addr);         for(i = 0; i < numOfBytes; i++)         {                   bytesArray= SPI_ReadByte();         }         SPI_CS= 1;}

3、oled显示此处显示重点是:字库芯片读取方式是:点阵排列方式:字节横置横排0101 01010202 0202而OLED显示方式是竖置横排。00               12               00               12
               00               12               00               12这就需要将获得的字库数据进行处理。处理程序简陋,水平不够{:mad:}/*** @briefASCII_15x16 将横置横排转换为竖置竖排。* @param*szhp                   竖置横排字符数据。 * @param   *hzhp                   横置横排字符数据。* @retval None.*/void GB2312_15x16_HengZhiHengPai_to_ShuZhiHengPai(unsigned char*szhp, unsigned char*hzhp){      unsigned chari, j;      //扫描横置横排的byte0-byte7到竖置横排的byte0-byte14      //i:表示,横置横排 i组      //j:表示,竖置横排 j组            for (j = 0; j <= 7; j ++ )                                        //竖置横排第j组      {                for ( i = 0; i <= 14; i += 2 )                        //将横置横排的(byte0、2、4、6、8、10、12、14)的第j位取出放置到竖置横排的Byte0-7                {                        if (*(hzhp + i) & (0x01 << (7-j)))      //取 横置横排第i行的第j位,如果为1执行此句,否则执行else                        {                              *(szhp + j) |= (0x01 << i/2);      //将横置横排的第i行的第j位放到竖置竖排的第(7-i)位                        }
                        else                              *(szhp + j) &= ~(0x01 << i/2);//取横置横排第i行的第j位,如果为0执行此句
                }      }            for (j = 8; j <= 15; j += 1)      //扫描竖置横排的byte8-byte15到横置横排的byte8-byte15      {                for (i = 1; i <= 15; i += 2 )                {                        if (*(hzhp + i) & (0x01 << (7-(j - 8))))      //                        {                              *(szhp + j) |= (0x01 << ((i - 1)/2));                        }                        else                              *(szhp + j) &= ~(0x01 << ((i - 1)/2));
                }      }      
      for (j = 16; j <= 23; j ++ )                                        //竖置横排第j组      {                for ( i = 16; i <= 30; i += 2 )                        //                {                        if (*(hzhp + i) & (0x01 << (7-(j - 16))))      //取 横置横排第i行的第j位,如果为1执行此句,否则执行else                        {                              *(szhp + j) |= (0x01 << ((i - 16) / 2));      //将横置横排的第i行的第j位放到竖置竖排的第(7-i)位                        }                        else                              *(szhp + j) &= ~(0x01 << ((i - 16) / 2));//取横置横排第i行的第j位,如果为0执行此句
                }      }      
      for (j = 24; j <= 31; j += 1)      //扫描竖置横排的byte8-byte15到横置横排的byte8-byte15      {                for (i = 17; i <= 31; i += 2 )                {                        if (*(hzhp + i) & (0x01 << (7-(j - 24))))      //                        {                              *(szhp + j) |= (0x01 << ((i - 17)/2));                        }                        else                              *(szhp + j) &= ~(0x01 << ((i - 17)/2));
                }            }      
}/*********************************************************                            ********汉字******************************************************************//***@brief获取该汉字字符在15x16点GB2312*@note   一个字符占32字节*@paramNone*@retval None*@date   2021/4*/voidGT30L32S4W_Get_Bytes_GB2312_15x16(unsigned char *GB2312Code, unsigned char*bytesArray){         longaddr;
         addr= GT30L32S4W_Get_Addr_GB2312_15x16(GB2312Code);
         if(addr == -1) return;
         GT30L32S4W_Read_FontBytes(addr,bytesArray, 32);}

/**
* @briefOLED显示汉字
* @paramLine 行位置,范围:1~4
* @paramColumn 列位置,范围:1~16
* @paramtext 要显示的一个字符,范围:字库芯片
* @retval 无
*/
void OLED_GB2312_15x16_ShowChar(unsigned char Line, unsigned char Column, unsigned char *text)
{            
      unsigned char i,j;
      unsigned char SZHPArray;
      unsigned char HZHPArray;
      while(*text != 0)
      {
                GT30L32S4W_Get_Bytes_GB2312_15x16(text,HZHPArray);
                GB2312_15x16_HengZhiHengPai_to_ShuZhiHengPai(SZHPArray,HZHPArray);
               
                for(j = 0; j < 32; j ++)
                {
                        OLED_SetCursor((unsigned char)((Line - 1) * 2), (unsigned char)((Column - 1) * 8));                //设置光标位置在上半部分
                        for (i = 0; i < 16; i++)
                        {
                              oled_data(SZHPArray);                        //显示上半部分内容
                        }
                        OLED_SetCursor((unsigned char)((Line - 1) * 2 + 1), (unsigned char)((Column - 1) * 8));      //设置光标位置在下半部分
                        for (i = 0; i < 16; i++)
                        {
                              oled_data(SZHPArray);                //显示下半部分内容
                        }
                }
                text += 2;      //下个字
                Column += 2;
      }
}

页: [1]
查看完整版本: 读取字库芯片GT30L32S4W在12864OLED上显示