SPI的读写GT21L字库芯片

void spi_init(void)
  {
    uint8 data;

    DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS)&(~(1<<MISO));        //设置MOSI,SCK,SS为输出,MISO为输入
 PORTB |= (1<<MISO)|(1<<SS);                //使能MISO上拉电阻有效 
    SPCR = (1<<SPE)|(1<<MSTR);                 //SPI使能,MSB,主机,SPI Mode 0SCK=Fosc/4
 SPSR = 0x00;
 data = SPSR;
    data = SPDR;
 
  }
 
void spi_send_byte(char data) 
  {
    SPDR = data;
 while(!(SPSR & (1<<SPIF)));                //等待数据传输结束
  }
 
char spi_receive_byte(void)
  {
    char data;
 SPDR = 0xff;
    while(!(SPSR & (1<<SPIF)));                //等待数据接收结束
 data = SPDR;
 return data;
  }
 
void HighSpeed_Read_GT21L(uint32 address,char *buf,uint32 length)
  {  
   SS_L();
      spi_send_byte(0x0B);                     //0x0b快速读取方式
      spi_send_byte(((address&0xFFFFFF)>>16)); //3个字节的地址
      spi_send_byte(((address&0xFFFF)>>8));
      spi_send_byte(address&0xFF);
      spi_send_byte(0xFF);                      //dummy字节                                    
           
      while(length--)
   {
     *(buf++)=spi_receive_byte();
   }
   SS_H();
  }
 
void Read_Font_GT21L16W(uint8 font_type, uint8 hzzf_h, uint8 hzzf_l, char *dot )
  {
 uint8 temp[2];
// uint8 hzzf_h,hzzf_l;
 uint16  index_addr;
 uint32  addr;
// hzzf_h = (uint8)((srcCode)>>8); 
// hzzf_l = (uint8)((srcCode)&0xff);
    uint16 srcCode;
 srcCode = (uint16)hzzf_h<<8+hzzf_l;
 switch(font_type)
   {
     case  GB12345:
           if(((hzzf_h>=0xa1)&&(hzzf_h<=0xa9))&&(hzzf_l>=0xa1))
              addr = ((((uint32)hzzf_h)-0xa1)*94 + (((uint32)hzzf_l)-0xa1))*32 + ((uint32)BaseAdd);
           else if(((hzzf_h>=0xb0)&&(hzzf_h<=0xf9))&&(hzzf_l>=0xa1))
              addr = ((((uint32)hzzf_h)-0xb0)*94 + (((uint32)hzzf_l)-0xa1)+1038)*32 + ((uint32)BaseAdd);
           else
        return;
    
           HighSpeed_Read_GT21L(addr ,dot, 32);       
        break;
       
     case  BIG5:
        if((hzzf_h>=0xa1)&&((hzzf_l>=0x40)&&(hzzf_l<=0x7e)))
          {
         index_addr = (hzzf_h-0xa1)*157+(hzzf_l-0x40);
          }
        else if((hzzf_h>=0xa1)&&((hzzf_l>=0xa1)&&(hzzf_l<=0xfe)))
          {
         index_addr = (hzzf_h-0xa1)*157+(hzzf_l-0xa1)+63;
          }
        else
       return;
  
        addr = Big5Table+(index_addr*2);
        HighSpeed_Read_GT21L(addr,temp,2);
        addr = BaseAdd+(((uint32)temp[0]<<8)+temp[1])*32;
        HighSpeed_Read_GT21L(addr,dot,32);
        break;
         
     case  JIS0208:
        if(((hzzf_h>=1)&&(hzzf_h<=89))&&((hzzf_l>=1)&&(hzzf_l<=94)))
          {
               index_addr = (hzzf_h-1)*94+(hzzf_l-1);
 //        index_addr = ((((hzzf_h&0xf0)>>4)*10+(hzzf_h&0x0f))-1)*94+(((hzzf_l&0xf0)>>4)*10+(hzzf_l&0x0f))-1;
          }
        else
       return;
  
        addr = JISTable+(index_addr*2);
        HighSpeed_Read_GT21L(addr,temp,2);
        addr = BaseAdd+(((uint32)temp[0]<<8)+temp[1])*32;
        HighSpeed_Read_GT21L(addr,dot,32);    
        break; 
  case  ASCLL:
     if((hzzf_h==0x00)&&((hzzf_l>=0x20)&&(hzzf_l<=0x7e)))
       addr = (hzzf_l-0x20)*16+ASCLL16;
     else
       return;
     HighSpeed_Read_GT21L(addr,dot,16);
     break;
  case  LDUNICODE:
     if((srcCode>=0x00a0)&&(srcCode<=0x0217))
       addr = (srcCode-0x00a0)*16+LDTable;
     else
       return;
     HighSpeed_Read_GT21L(addr,dot,16);
     break;
  case  XLUNICODE:
     if((srcCode>=0x0370)&&(srcCode<=0x03cf))
       addr = (srcCode-0x00a0)*16+XLTable;
     else
       return;
     HighSpeed_Read_GT21L(addr,dot,16);
     break;
  case  JLEUNICODE:
     if((srcCode>=0x0400)&&(srcCode<=0x04f9))
       addr = (srcCode-0x0400)*16+JLETable;
     else
       return;
     HighSpeed_Read_GT21L(addr,dot,16);
     break; 
     
    
     default:
        break;  
   }  
  }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值