【SPI480272高速工业液晶屏试用体验】模拟SPI总线驱动SPI48027...

  • donatello
  • LV6工程师
  • |      2017-08-09 22:23:25
  • 浏览量 1193
  • 回复:0
【SPI480272高速工业液晶屏试用体验】模拟SPI总线驱动SPI480272屏幕不成功 最近在试用LinkIt 7697板子,也就顺便试试用这个板子驱动一下SPI480272屏幕。无奈这板子不能在Arduino IDE下成功驱动硬件SPI接口(可能是json库的SPI引脚和板子的SPI引脚不是同一组),因此只能用GPIO模拟SPI的方法了。驱动移植的初期挺顺利的,无论是刷屏、还是显示ASCII字符都没有问题,但是显示汉字的时候就出问题了,原因未知,欢迎同是使用这个屏幕的小伙伴一同交流原因。
#include "DS3231.h" 

#include "LCD1602.h"



#define LCD_XSIZE 480

#define LCD_YSIZE 272 

#define BUSY 14

#define CMD_Xaddr 0x1   //显示X位置寄存器

#define CMD_Yaddr 0x2   //显示Y位置寄存器

#define CMD_Ctrl  0x3   //功能寄存器

#define CMD_Data  0x5   //显存GRAM功能写入寄存器

#define CMD_Yaddr_Start     0x6   

#define CMD_Yaddr_End       0x7   

#define CMD_Xaddr_Start     0x8   

#define CMD_Xaddr_End       0x9   

#define CMD_FRONT          0xA   

#define CMD_BACK           0xB   

#define CMD_Ctrl_Fill ((1<<6)|63)

#define ZF08_NORMAL        0x0E

#define ZF16_NORMAL        0x1E

#define ZF24_NORMAL        0x2E

#define ZF32_NORMAL        0x3E



#define ZF08_TRANSP        0x4E  

#define ZF16_TRANSP        0x5E

#define ZF24_TRANSP        0x6E

#define ZF32_TRANSP        0x7E



#define sck 13

#define busy 12

#define mosi 11

#define cs 10



void SPILCD_Init()

{

    pinMode(sck,OUTPUT);

    pinMode(busy,INPUT_PULLUP);

    pinMode(mosi,OUTPUT);

    pinMode(cs,OUTPUT);

}



void ANA_SPI_Send(byte data)

{

  byte i;          //IO模拟单字节发送

  for(i=0;i<8;i++)

  {

    digitalWrite(sck,0);

    if(data&0x80)digitalWrite(mosi,1);

    else digitalWrite(mosi,0);

    digitalWrite(sck,1);

    data<<=1;

  }  

}



void LCD_send_command(byte cmd)              

{

  digitalWrite(cs,0);

  ANA_SPI_Send(cmd);

  digitalWrite(cs,1);

}



void LCD_send_data(int data)           

{

  digitalWrite(cs,0);

  ANA_SPI_Send(data>>8);

  ANA_SPI_Send(data);

  digitalWrite(cs,1);

}



void LCD_write_com(int adds,int num)

{

    LCD_send_command(adds);

    LCD_send_data(num);

}



void LCD_SET_Backlight(unsigned char BLK_num)

{

  LCD_write_com(CMD_Ctrl,BLK_num);

}



void LCD_Set_Windows(unsigned int x0, unsigned int y0,  unsigned int x1, unsigned int y1)

{

  LCD_write_com(CMD_Xaddr_Start ,x0);

  LCD_write_com(CMD_Xaddr_End ,x1);

  LCD_write_com(CMD_Yaddr_Start ,y0);

  LCD_write_com(CMD_Yaddr_End ,y1);

  LCD_write_com(CMD_Xaddr, x0);

  LCD_write_com(CMD_Yaddr, y0);

}



void LCD_Set_Front_Color(int color)

{

  LCD_write_com(CMD_FRONT,color);

  LCD_send_command(CMD_Data); 

}



void LCD_Set_Back_Color(int color)

{

  LCD_write_com(CMD_BACK,color);

  LCD_send_command(CMD_Data); 

}



void LCD_Set_RAM_Addr(int x,int y)

{

  LCD_write_com(CMD_Yaddr,y);

  LCD_write_com(CMD_Xaddr,x);

}



void LCD_RectangleFill(int x0,int y0,int x1,int y1,int color)

{

  LCD_Set_Windows(x0,y0,x1,y1);

  LCD_Set_Front_Color(color);

  LCD_write_com(CMD_Ctrl,CMD_Ctrl_Fill);

  //delay(20);

  while(digitalRead(busy)==0);

  LCD_Set_Windows(0,0,(LCD_XSIZE-1),(LCD_YSIZE-1));

}



void LCD_Clear_Screen(int color)

{

  LCD_RectangleFill(0,0,(LCD_XSIZE-1),(LCD_YSIZE-1),color);

}



void LCD_Draw_ASCIIChar(int x,int y,char ch,int LineColor,int FillColor,byte CMD_CHAR_MOD)

{

  LCD_Set_Front_Color(LineColor);

  LCD_Set_Back_Color(FillColor); 

  LCD_Set_RAM_Addr(x,y);

  LCD_write_com(CMD_CHAR_MOD,ch);

  //delay(20);

  while(digitalRead(busy)==0);

}



void LCD_DrawString(int x,int y,char *pStr,int LineColor,int FillColor,byte CMD_CHAR_MOD)

{

  LCD_Set_Front_Color(LineColor);

  LCD_Set_Back_Color(FillColor); 

  LCD_Set_RAM_Addr(x,y);

  while(*pStr>0)

    {

      if (*pStr > 0x80)//汉字

      {

        LCD_write_com(CMD_CHAR_MOD,((*pStr)<<8)+(*(pStr+1)));

        pStr += 2;      

      }

      else//ASCII码

      {

        LCD_write_com(CMD_CHAR_MOD,*pStr);

        pStr += 1;     

      }

      while(digitalRead(busy)==0);

      //delay(20);

  }   

}



void setup() 

{

  pinMode(7,OUTPUT);

  Serial.begin(115200);

  SPILCD_Init();

  LCD_SET_Backlight(63);

  LCD_Clear_Screen(0xffe0);

  //attachInterrupt(6,blink,CHANGE);

  //DS3231 ds3231;

  LCD_DrawString(0,0,"ICKEY donatello",0,0xffff,ZF32_TRANSP);

  LCD_DrawString(0,32,"Linkit 7697",0,0xffff,ZF32_TRANSP);

  LCD_DrawString(0,64,"SPI480272 TFTLCD",0,0xffff,ZF32_TRANSP);

  LCD_DrawString(0,96,"云汉电子社区",0,0xffff,ZF32_TRANSP);

  while(1)

  {

  }

}



int val=0,flag=0;



void loop() 

{

    int adc_val = analogRead(A0);

    Serial.println(adc_val);

    //analogWrite(7,adc_val/20);

    delay(1000); 

}



void blink()//中断函数

{

  Serial.println("进入外部中断");

  flag=1-flag;

  if(flag==0)digitalWrite(7,0);

  else if(flag==1)digitalWrite(7,1);

}
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子