独闷闷网

标题: 把已经调好的GT20L16S1Y字库芯片C语言驱动代码分享给大家。 [打印本页]

作者: jianhong_wu    时间: 2015-6-17 22:24
标题: 把已经调好的GT20L16S1Y字库芯片C语言驱动代码分享给大家。
本帖最后由 jianhong_wu 于 2015-6-17 22:25 编辑

★坚鸿-深圳:
今天把GT20L16S1Y字库芯片的C程序调试出来了,在这个调试这个程序的时候,有个地方很容易出错,就是在计算字库地址的公式中,应该把所有参与运算的变量都改成unsigned long的类型,避免溢出出错。我用的是stm8s105系列芯片内部自带的晶振,现在把调试好的C程序代码分享给大家:
GT20L16S1Y.h头文件:
  1. #ifndef _GT20L16S1Y_
  2. #define _GT20L16S1Y_

  3. #define SPI0_CS_ON()         (GPIO_WriteHigh(GPIOB,GPIO_PIN_4))          //拉高
  4. #define SPI0_CS_OFF()        (GPIO_WriteLow(GPIOB,GPIO_PIN_4))           //拉低

  5. #define SPI0_SCLK_ON()       (GPIO_WriteHigh(GPIOB,GPIO_PIN_3))          //拉高
  6. #define SPI0_SCLK_OFF()      (GPIO_WriteLow(GPIOB,GPIO_PIN_3))           //拉低

  7. #define SPI0_MOSI_ON()       (GPIO_WriteHigh(GPIOB,GPIO_PIN_2))          //拉高
  8. #define SPI0_MOSI_OFF()      (GPIO_WriteLow(GPIOB,GPIO_PIN_2))           //拉低

  9. void SPI0_clear(void);
  10. unsigned char SPI0_readByte(void);
  11. void SPI0_writeByte(unsigned char dat);
  12. void WORDLIB_read_ASCII_8x16(unsigned int ASCIICode, unsigned char *buffer);
  13. void WORDLIB_read_GB_16x16(unsigned int GBCode, unsigned char  *buffer);



  14. #endif








复制代码


GT20L16S1Y.c的源文件:
  1. #include  "stm8s.h"
  2. #include "GT20L16S1Y.h"
  3. #include "delay.h"


  4. /*******************************************************
  5. *  函数名称:SPI0_clear
  6. *  函数功能:清除SPI总线状态
  7. *  入口参数:无
  8. *  出口参数:无
  9. ******************************************************/
  10. void SPI0_clear(void)
  11. {
  12.         SPI0_CS_ON();    //拉高
  13.         SPI0_SCLK_ON();  //拉高
  14.         SPI0_MOSI_ON();  //拉高
  15. }

  16. /*******************************************************
  17. *  函数名称:SPI0_readByte
  18. *  函数功能:SPI0读取一个字节数据
  19. *  入口参数:无
  20. *  出口参数:unsigned char
  21. ******************************************************/
  22. unsigned char SPI0_readByte(void)
  23. {
  24.         unsigned char  i;
  25.         unsigned char  dat;
  26.         
  27.         for(i = 0; i < 8; i++)
  28.         {
  29.                 dat <<= 1;
  30.                 SPI0_SCLK_OFF();          //下降沿,MISO字库芯片移出一个bit        
  31.                 if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_1)!= 0)
  32.                 {
  33.                         dat |= 0x01;
  34.                 }
  35.                 else
  36.                 {
  37.                         dat |= 0x00;
  38.                 }
  39.                 delay(1);
  40.                 SPI0_SCLK_ON();
  41.                 delay(1);
  42.         }
  43.         return dat;
  44. }

  45. /*******************************************************
  46. *  函数名称:SPI0_writeByte
  47. *  函数功能:SPI0写出一个字节数据
  48. *  入口参数:unsigned char
  49. *  出口参数:无
  50. ******************************************************/
  51. void SPI0_writeByte(unsigned char dat)
  52. {
  53.         unsigned char i;

  54.         for(i = 0; i < 8; i++)
  55.         {
  56.                 SPI0_SCLK_OFF();                                                                                                
  57.                 if(dat & 0x80)
  58.                 {
  59.                         SPI0_MOSI_ON();
  60.                 }
  61.                 else
  62.                 {
  63.                         SPI0_MOSI_OFF();
  64.                 }
  65.                 dat <<= 1;
  66.                 delay(1);
  67.                 SPI0_SCLK_ON();                                                                                                        //上升沿,MOSI字库芯片移入一个bit
  68.                 delay(1);               
  69.         }
  70. }

  71. /*******************************************************
  72. *  函数名称:WORDLIB_read_ASCII_8x16
  73. *  函数功能:读取字库芯片中一个ASCII字符的8x16点阵编码
  74. *  入口参数:ASCIICode,ASCII码;buffer,点阵编码的缓冲区;
  75.                                  buffer必须大于等于16个字节。
  76. *  出口参数:无
  77. ******************************************************/
  78. void WORDLIB_read_ASCII_8x16(unsigned int ASCIICode,unsigned char *buffer)
  79. {

  80.         unsigned long BaseAddr        = 0x3b7c0;     //8x16点阵的起始地址,见手册《GT23L32S4W用户手册》
  81.         unsigned long WordAddr        = 0;              //ASCII字符点阵在芯片中的字节地址
  82.         unsigned long ASCIICodeTemp   =0;
  83.         const unsigned int BUFSIZE    = 16;        //缓冲区的大小
  84.         unsigned char  i;

  85.         ASCIICodeTemp=ASCIICode&0xff;
  86.         //计算地址,见手册《GT20L16S1Y用户手册》
  87.         
  88.       
  89.         if((ASCIICodeTemp >= 0x20) && (ASCIICodeTemp <= 0x7E))
  90.         {
  91.                 WordAddr        = (ASCIICodeTemp - 0x20) * BUFSIZE + BaseAddr;
  92.         }

  93.         SPI0_clear();           //清除SPI总线
  94.         delay(1);
  95.         
  96.         //开始快速读取点阵数据:Read Data Bytes At Higher Speed
  97.         SPI0_CS_OFF();
  98.         delay(1);
  99.         
  100.         SPI0_writeByte(0x0b);  //发送命令字:0x0B
  101.         SPI0_writeByte((WordAddr >> 16) & 0xff);    //从高到低,依次发送三个字节的地址
  102.         SPI0_writeByte((WordAddr >> 8) & 0xff);
  103.         SPI0_writeByte(WordAddr & 0xff);
  104.         SPI0_writeByte(0xff);           //最后发送一个字节的假数据 Dummy Byte
  105.         for(i = 0; i < BUFSIZE; i++)
  106.         {
  107.                 *(buffer + i)        = SPI0_readByte();                                                                //读取字库芯片发送过来的点阵编码
  108.         }

  109.         SPI0_CS_ON();                                                                                                                 //CS置高,结束本次操作
  110.         delay(1);

  111.         SPI0_clear();                                                                                                                //清除SPI总线
  112.         delay(1);
  113. }


  114. /*******************************************************
  115. *  函数名称:WORDLIB_read_GB_16x16
  116. *  函数功能:读取字库芯片中一个国标汉字的16x16点阵编码
  117. *  入口参数:GBCode,汉字内码;buffer,点阵编码的缓冲区;
  118.                                  buffer必须大于等于32个字节。
  119. *  出口参数:无
  120. ******************************************************/
  121. void WORDLIB_read_GB_16x16(unsigned int GBCode, unsigned char  *buffer)
  122. {
  123.         unsigned long BaseAddr        = 0;       //16x16点阵的起始地址,见手册《GT20L16S1Y用户手册》
  124.         unsigned long GBCode_MSB        = 0;   //汉字内码的高八位
  125.         unsigned long GBCode_LSB        = 0;         //汉字内码的低八位
  126.         unsigned long WordAddr        = 0;                      //汉字或者ASCII字符点阵在芯片中的字节地址
  127.         const unsigned char BUFSIZE        = 32;              //缓冲区的大小
  128.         unsigned char   i;
  129.         GBCode_MSB        = (GBCode >> 8) & 0xFF;   //汉字内码的高八位
  130.         GBCode_LSB        = GBCode & 0xFF;         //汉字内码的低八位

  131.         //计算地址,见手册《GT20L16S1Y用户手册》

  132.         if(GBCode_MSB == 0xA9&& GBCode_LSB >= 0xA1)
  133.         {
  134.                 WordAddr        = (282+(GBCode_LSB-0xA1))*32+ BaseAddr;
  135.         }
  136.         else if(GBCode_MSB >= 0xA1&&GBCode_MSB <= 0xA3&& GBCode_LSB >= 0xA1)
  137.         {
  138.                 WordAddr        = (GBCode_MSB-0xA1)*94+(GBCode_LSB-0xA1)*32+ BaseAddr;
  139.         }
  140.         else if(GBCode_MSB >= 0xB0&&GBCode_MSB <= 0xF7&& GBCode_LSB >= 0xA1)
  141.         {
  142.                 WordAddr        = ((GBCode_MSB-0xB0)*94+(GBCode_LSB-0xA1)+846)*32+ BaseAddr;
  143.         }

  144.         SPI0_clear();           //清除SPI总线
  145.         delay(1);
  146.         
  147.         //开始快速读取点阵数据:Read Data Bytes At Higher Speed
  148.         SPI0_CS_OFF();
  149.         delay(1);
  150.         
  151.         SPI0_writeByte(0x0B);                      //发送命令字:0x0B
  152.         SPI0_writeByte((WordAddr >> 16) & 0xff);    //从高到低,依次发送三个字节的地址
  153.         SPI0_writeByte((WordAddr >> 8) & 0xff);
  154.         SPI0_writeByte(WordAddr & 0xff);
  155.         SPI0_writeByte(0xff);               //最后发送一个字节的假数据 Dummy Byte
  156.         for(i = 0; i < BUFSIZE; i++)
  157.         {
  158.                 *(buffer + i)        = SPI0_readByte();    //读取字库芯片发送过来的点阵编码
  159.         }

  160.         SPI0_CS_ON();                                                                                                                 //CS置高,结束本次操作
  161.         delay(1);

  162.         SPI0_clear();                                                                                                             //清除SPI总线
  163.         delay(1);
  164. }



复制代码







欢迎光临 独闷闷网 (http://dumenmen.com/) Powered by Discuz! X3.2