这公司叫高通,但新版规格书不带地址运算,带地址运算规格书下载GT30L32S4W规格书,带地址运算
芯片管脚配置:
基础驱动及读取代码:
/**
******************************************************************
* @brief GT20 SPI发送指令
* @param [in] cmd 字符在芯片中的地址
* @retval None
******************************************************************
*/
static void GT30L32_Send_Byte(uint32_t cmd)
{
uint8_t i;
cmd=cmd|0x03000000;
for(i=0;i<32;i++)
{
GT20L_CLK_0;
if(cmd&0x80000000)
{
GT20L_MOSI_1;
}
else
{
GT20L_MOSI_0;
}
GT20L_CLK_1;
cmd=cmd<<1;
}
}
/**
******************************************************************
* @brief GT20 SPI读取一个字节
* @param [in]None
* @retval 一个字节
******************************************************************
*/
static uint8_t GT30L32_Read_Byte(void)
{
uint8_t i;
uint8_t dat=0;
cm_gpio_level_e S1Y_SO = CM_GPIO_LEVEL_LOW;
GT20L_CLK_1;
for(i=0;i<8;i++)
{
GT20L_CLK_0;
dat=dat<<1;
cm_gpio_get_level(GT20L_SIMO,&S1Y_SO);
if(S1Y_SO)
{
dat=dat|0x01;
}
else
{
dat&=0xFE;
}
GT20L_CLK_1;
}
return dat;
}
/****************************************************
* @brief 从字库中读数据
* @param [in] Address : 表示字符点阵在芯片中的字节地址。
* @param [in] byte_long : 是读点阵数据字节数。
* @param [out] p_arr : 是保存读出的点阵数据的数组。
* @retval None
*****************************************************/
static void GT30L32_Read( uint32_t address, uint8_t byte_long, uint8_t* p_arr )
{
unsigned int j = 0;
GT20L_CLK_1;
GT20L_MOSI_1;
GT20L_CS_0;
GT30L32_Send_Byte( address );
for( j = 0; j < byte_long; j++ )
{
p_arr[j] = GT30L32_Read_Byte();
}
GT20L_CS_1;
}
[GT30L32S4W所有字体数据都是横置横排]
排置: W(横置横排)
点阵大小为 8X16的字母"A"的
点阵数据: 00 10 28 28 28 44 44 7C 82 82 82 82 00 00 00 00
如果读到的数据不对请检查驱动是否正确
代码将横置横排转换为竖置竖排墨水屏显示
/***************************************
* @brief ASCII8x16
* @param [in] ASCIICode:表示ASCII 码(8bits)
* @param [in] BaseAdd:说明该套字库在芯片中的起始地址。
* @param [out] DZ_Data:是保存读出的点阵数据的数组。
* @retval 1 成功 0 失败
***************************************/
void GT30L32_Ascii8x16_Data( uint8_t ASCIICode, uint8_t* S1YDZ_Data )
{
uint32_t BaseAdd = 0x1DD780;
uint32_t address = (ASCIICode - 0x20 ) * 16 + BaseAdd;
uint8_t zk[16];
uint8_t dat= 0;
uint8_t dat_zk = 0;
uint8_t i,z;
unsigned int j = 0;
if( ( ASCIICode >= 0x20 ) && ( ASCIICode <= 0x7e ) )
{
GT20L_CLK_1;
GT20L_MOSI_1;
GT20L_CS_0;
GT30L32_Send_Byte( address );
//htl_uart0_printf("-----\r\n");
for( j = 0; j < 16; j++ )
{
zk[j] = GT30L32_Read_Byte();
// htl_uart0_printf("[%02x]",zk[j]);
}
// htl_uart0_printf("-----\r\n");
GT20L_CS_1;
}
/转换输出///
j=0;
for(z=0;z<8;z++)
{
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i];
dat_zk =dat_zk<<z;
if(dat_zk&0X80)dat=dat|0x01;
else dat&=0xFE;
}
S1YDZ_Data[j] = dat;
dat =0;
dat_zk =0;
j++;
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i+8];
dat_zk =dat_zk<<z;
if(dat_zk&0X80)dat=dat|0x01;
else dat&=0xFE;
}
S1YDZ_Data[j]= dat;
j++;
}
}
15X16中文代码
/********************************************************************************
* @brief GB2312_15X16汉字字符读取 30 byte
* @param [in] GB2312Code 汉字内码
* @param [out] BUF 缓存数组
* @retval none
*******************************************************************************/
void GT30L32_GB2312_15X16(const unsigned char *GB2312Code , uint8_t *BUF)
{
uint8_t i;
uint8_t dat= 0;
uint8_t dat_zk = 0;
uint8_t z;
uint8_t j = 0;
uint8_t zk[32];
uint32_t Address ; //表示汉字或ASCII字符点阵在芯片中的字节地址。
uint32_t BaseAdd = 0x2C9D0; //说明点阵数据在字库芯片中的起始地址。
uint8_t MSB = *GB2312Code; //表示汉字内码GBCode 的高8bits。
uint8_t LSB = *(GB2312Code + 1); //表示汉字内码GBCode 的低8bits
/*计算方法:*/
if((MSB >=0xA1) && (MSB <= 0Xa9) && (LSB >=0xA1))
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
else if((MSB >=0xB0) && (MSB <= 0xF7) && (LSB >=0xA1))
Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;
/********* 获取字符点阵数据 ****************/
GT20L_CLK_1;
GT20L_MOSI_1;
GT20L_CS_0;
osDelay(1);//大约0.11S
GT30L32_Send_Byte( Address );
for( i = 0; i < 32; i++ )
{
zk[i] = GT30L32_Read_Byte();
}
GT20L_CS_1;
/*****************转换输出**************************/
for(z=0;z<8;z++)//16个字节
{
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i*2];
dat_zk =dat_zk<<z;
if(dat_zk&0X80)dat=dat|0x01;
else dat&=0xFE;
}
BUF[j] = dat;
dat =0;
dat_zk =0;
j++;
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i*2+16];
dat_zk =dat_zk<<z;
if(dat_zk&0X80)dat=dat|0x01;
else dat&=0xFE;
}
BUF[j]= dat;
j++;
}
//*************************************
for(z=0;z<7;z++)//16个字节
{
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i*2+1];
dat_zk =dat_zk<<z;
if(dat_zk&0X80) dat=dat|0x01;
else dat&=0xFE;
}
BUF[j] = dat;
dat =0;
dat_zk =0;
j++;
for(i=0;i<8;i++)
{
dat=dat<<1;
dat_zk = zk[i*2+1+16];
dat_zk =dat_zk<<z;
if(dat_zk&0X80) dat=dat|0x01;
else dat&=0xFE;
}
BUF[j]= dat;
j++;
}
}