【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);
}
【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);
}