/*******************************************************
* 函数名称:WORDLIB_read_GB_16x16
* 函数功能:读取字库芯片中一个国标汉字的16x16点阵编码
* 入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
buffer必须大于等于32个字节。
* 出口参数:无
******************************************************/
void WORDLIB_read_GB_16x16(uint16_t GBCode, uint8_t *buffer)
{
uint32_t BaseAddr = 0x2C9D0; //16x16点阵的起始地址,见手册《GT23L32S4W用户手册》
uint8_t GBCode_MSB = (GBCode >> 8) & 0xFF; //汉字内码的高八位
uint8_t GBCode_LSB = GBCode & 0xFF; //汉字内码的低八位
uint32_t WordAddr = 0; //汉字或者ASCII字符点阵在芯片中的字节地址
const uint32_t BUFSIZE = 32; //缓冲区的大小
uint8_t i;
//计算地址,见手册《GT23L32S4W用户手册》
if((GBCode_MSB >= 0xA4) && (GBCode_MSB <= 0xA8) && (GBCode_LSB >= 0xA1))
{
WordAddr = BaseAddr;
}
else if((GBCode_MSB >= 0xA1) && (GBCode_MSB <= 0xA9) && (GBCode_LSB >= 0xA1))
{
WordAddr = ((GBCode_MSB - 0xA1) * 94 + (GBCode_LSB - 0xA1)) * BUFSIZE + BaseAddr;
}
else if((GBCode_MSB >= 0xB0) && (GBCode_MSB <= 0xF7) && (GBCode_LSB >= 0xA1))
{
WordAddr = ((GBCode_MSB - 0xB0) * 94 + (GBCode_LSB - 0xA1) + 846) * BUFSIZE + BaseAddr;
}
SPI_CLEAR(); //清除SPI总线
delay_nop(10);
//开始快速读取点阵数据:Read Data Bytes At Higher Speed
SPI_CS_OFF();
delay_nop(10);
SPI_WRITE_BYTE(CMD_FASTREAD_WORDLIB); //发送命令字:0x0B
SPI_WRITE_BYTE((WordAddr >> 16) & 0xff); //从高到低,依次发送三个字节的地址
SPI_WRITE_BYTE((WordAddr >> 8) & 0xff);
SPI_WRITE_BYTE(WordAddr & 0xff);
SPI_WRITE_BYTE(CMD_DUMMY); //最后发送一个字节的假数据 Dummy Byte
//delay_nop(10);
for(i = 0; i < BUFSIZE; i++)
{
*(buffer + i) = SPI_READ_BYTE(); //读取字库芯片发送过来的点阵编码
}
SPI_CS_ON(); //CS置高,结束本次操作
delay_nop(10);
SPI_CLEAR(); //清除SPI总线
delay_nop(10);
}
|