把已经调好的GT20L16S1Y字库芯片C语言驱动代码分享给大家。
本帖最后由 jianhong_wu 于 2015-6-17 22:25 编辑★坚鸿-深圳:
今天把GT20L16S1Y字库芯片的C程序调试出来了,在这个调试这个程序的时候,有个地方很容易出错,就是在计算字库地址的公式中,应该把所有参与运算的变量都改成unsigned long的类型,避免溢出出错。我用的是stm8s105系列芯片内部自带的晶振,现在把调试好的C程序代码分享给大家:
GT20L16S1Y.h头文件:
#ifndef _GT20L16S1Y_
#define _GT20L16S1Y_
#define SPI0_CS_ON() (GPIO_WriteHigh(GPIOB,GPIO_PIN_4)) //拉高
#define SPI0_CS_OFF() (GPIO_WriteLow(GPIOB,GPIO_PIN_4)) //拉低
#define SPI0_SCLK_ON() (GPIO_WriteHigh(GPIOB,GPIO_PIN_3)) //拉高
#define SPI0_SCLK_OFF() (GPIO_WriteLow(GPIOB,GPIO_PIN_3)) //拉低
#define SPI0_MOSI_ON() (GPIO_WriteHigh(GPIOB,GPIO_PIN_2)) //拉高
#define SPI0_MOSI_OFF() (GPIO_WriteLow(GPIOB,GPIO_PIN_2)) //拉低
void SPI0_clear(void);
unsigned char SPI0_readByte(void);
void SPI0_writeByte(unsigned char dat);
void WORDLIB_read_ASCII_8x16(unsigned int ASCIICode, unsigned char *buffer);
void WORDLIB_read_GB_16x16(unsigned int GBCode, unsigned char*buffer);
#endif
GT20L16S1Y.c的源文件:
#include"stm8s.h"
#include "GT20L16S1Y.h"
#include "delay.h"
/*******************************************************
*函数名称:SPI0_clear
*函数功能:清除SPI总线状态
*入口参数:无
*出口参数:无
******************************************************/
void SPI0_clear(void)
{
SPI0_CS_ON(); //拉高
SPI0_SCLK_ON();//拉高
SPI0_MOSI_ON();//拉高
}
/*******************************************************
*函数名称:SPI0_readByte
*函数功能:SPI0读取一个字节数据
*入口参数:无
*出口参数:unsigned char
******************************************************/
unsigned char SPI0_readByte(void)
{
unsigned chari;
unsigned chardat;
for(i = 0; i < 8; i++)
{
dat <<= 1;
SPI0_SCLK_OFF(); //下降沿,MISO字库芯片移出一个bit
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_1)!= 0)
{
dat |= 0x01;
}
else
{
dat |= 0x00;
}
delay(1);
SPI0_SCLK_ON();
delay(1);
}
return dat;
}
/*******************************************************
*函数名称:SPI0_writeByte
*函数功能:SPI0写出一个字节数据
*入口参数:unsigned char
*出口参数:无
******************************************************/
void SPI0_writeByte(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SPI0_SCLK_OFF();
if(dat & 0x80)
{
SPI0_MOSI_ON();
}
else
{
SPI0_MOSI_OFF();
}
dat <<= 1;
delay(1);
SPI0_SCLK_ON(); //上升沿,MOSI字库芯片移入一个bit
delay(1);
}
}
/*******************************************************
*函数名称:WORDLIB_read_ASCII_8x16
*函数功能:读取字库芯片中一个ASCII字符的8x16点阵编码
*入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
buffer必须大于等于16个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_ASCII_8x16(unsigned int ASCIICode,unsigned char *buffer)
{
unsigned long BaseAddr = 0x3b7c0; //8x16点阵的起始地址,见手册《GT23L32S4W用户手册》
unsigned long WordAddr = 0; //ASCII字符点阵在芯片中的字节地址
unsigned long ASCIICodeTemp =0;
const unsigned int BUFSIZE = 16; //缓冲区的大小
unsigned chari;
ASCIICodeTemp=ASCIICode&0xff;
//计算地址,见手册《GT20L16S1Y用户手册》
if((ASCIICodeTemp >= 0x20) && (ASCIICodeTemp <= 0x7E))
{
WordAddr = (ASCIICodeTemp - 0x20) * BUFSIZE + BaseAddr;
}
SPI0_clear(); //清除SPI总线
delay(1);
//开始快速读取点阵数据:Read Data Bytes At Higher Speed
SPI0_CS_OFF();
delay(1);
SPI0_writeByte(0x0b);//发送命令字:0x0B
SPI0_writeByte((WordAddr >> 16) & 0xff); //从高到低,依次发送三个字节的地址
SPI0_writeByte((WordAddr >> 8) & 0xff);
SPI0_writeByte(WordAddr & 0xff);
SPI0_writeByte(0xff); //最后发送一个字节的假数据 Dummy Byte
for(i = 0; i < BUFSIZE; i++)
{
*(buffer + i) = SPI0_readByte(); //读取字库芯片发送过来的点阵编码
}
SPI0_CS_ON(); //CS置高,结束本次操作
delay(1);
SPI0_clear(); //清除SPI总线
delay(1);
}
/*******************************************************
*函数名称:WORDLIB_read_GB_16x16
*函数功能:读取字库芯片中一个国标汉字的16x16点阵编码
*入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
buffer必须大于等于32个字节。
*出口参数:无
******************************************************/
void WORDLIB_read_GB_16x16(unsigned int GBCode, unsigned char*buffer)
{
unsigned long BaseAddr = 0; //16x16点阵的起始地址,见手册《GT20L16S1Y用户手册》
unsigned long GBCode_MSB = 0; //汉字内码的高八位
unsigned long GBCode_LSB = 0; //汉字内码的低八位
unsigned long WordAddr = 0; //汉字或者ASCII字符点阵在芯片中的字节地址
const unsigned char BUFSIZE = 32; //缓冲区的大小
unsigned char i;
GBCode_MSB = (GBCode >> 8) & 0xFF; //汉字内码的高八位
GBCode_LSB = GBCode & 0xFF; //汉字内码的低八位
//计算地址,见手册《GT20L16S1Y用户手册》
if(GBCode_MSB == 0xA9&& GBCode_LSB >= 0xA1)
{
WordAddr = (282+(GBCode_LSB-0xA1))*32+ BaseAddr;
}
else if(GBCode_MSB >= 0xA1&&GBCode_MSB <= 0xA3&& GBCode_LSB >= 0xA1)
{
WordAddr = (GBCode_MSB-0xA1)*94+(GBCode_LSB-0xA1)*32+ BaseAddr;
}
else if(GBCode_MSB >= 0xB0&&GBCode_MSB <= 0xF7&& GBCode_LSB >= 0xA1)
{
WordAddr = ((GBCode_MSB-0xB0)*94+(GBCode_LSB-0xA1)+846)*32+ BaseAddr;
}
SPI0_clear(); //清除SPI总线
delay(1);
//开始快速读取点阵数据:Read Data Bytes At Higher Speed
SPI0_CS_OFF();
delay(1);
SPI0_writeByte(0x0B); //发送命令字:0x0B
SPI0_writeByte((WordAddr >> 16) & 0xff); //从高到低,依次发送三个字节的地址
SPI0_writeByte((WordAddr >> 8) & 0xff);
SPI0_writeByte(WordAddr & 0xff);
SPI0_writeByte(0xff); //最后发送一个字节的假数据 Dummy Byte
for(i = 0; i < BUFSIZE; i++)
{
*(buffer + i) = SPI0_readByte(); //读取字库芯片发送过来的点阵编码
}
SPI0_CS_ON(); //CS置高,结束本次操作
delay(1);
SPI0_clear(); //清除SPI总线
delay(1);
}
页:
[1]