#include "lcd.h" #include SPIClass * vspi = NULL; /****************************************************************************** 函数说明:LCD串行数据写入函数 入口数据:dat 要写入的串行数据 返回值: 无 ******************************************************************************/ void LCD_Writ_Bus(uint8_t dat) { /* uint8_t i; digitalWrite(LCD_CS,0); for(i=0;i<8;i++) { digitalWrite(LCD_SCL,0); if(dat&0x80) digitalWrite(LCD_SDA,1); else digitalWrite(LCD_SDA,0); digitalWrite(LCD_SCL,1); dat<<=1; } digitalWrite(LCD_CS,1); */ vspi->transfer(dat); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA8(uint8_t dat) { LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA(uint16_t dat) { //LCD_Writ_Bus(dat>>8); vspi->transfer16(dat); } /****************************************************************************** 函数说明:LCD写入命令 入口数据:dat 写入的命令 返回值: 无 ******************************************************************************/ void LCD_WR_REG(uint8_t dat) { digitalWrite(LCD_DS,0);//写命令 LCD_Writ_Bus(dat); digitalWrite(LCD_DS,1);//写数据 } /****************************************************************************** 函数说明:设置起始和结束地址 入口数据:x1,x2 设置列的起始和结束地址 y1,y2 设置行的起始和结束地址 返回值: 无 ******************************************************************************/ void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2) { #if USE_HORIZONTAL==0 LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 #elif USE_HORIZONTAL==1 LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1+80); LCD_WR_DATA(y2+80); LCD_WR_REG(0x2c);//储存器写 #elif USE_HORIZONTAL==2 LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 #elif USE_HORIZONTAL==3 LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1+80); LCD_WR_DATA(x2+80); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 #endif } /****************************************************************************** 函数说明:LCD初始化函数 入口数据:无 返回值: 无 ******************************************************************************/ void Lcd_Init(void) { //************* Start Initial Sequence **********// //delay(120); //LCD_WR_REG(0x01); //上电后硬件会自己复位 delay(220); LCD_WR_REG(0x36); if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); else LCD_WR_DATA8(0xA0); LCD_WR_REG(0x3A); LCD_WR_DATA8(0x05); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x33); LCD_WR_REG(0xB7); LCD_WR_DATA8(0x35); LCD_WR_REG(0xBB); LCD_WR_DATA8(0x19); LCD_WR_REG(0xC0); LCD_WR_DATA8(0x2C); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x01); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x12); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x20); LCD_WR_REG(0xC6); LCD_WR_DATA8(0x0F); LCD_WR_REG(0xD0); LCD_WR_DATA8(0xA4); LCD_WR_DATA8(0xA1); LCD_WR_REG(0xE0); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2B); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x54); LCD_WR_DATA8(0x4C); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x23); LCD_WR_REG(0xE1); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x51); LCD_WR_DATA8(0x2F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x23); LCD_WR_REG(0x21); LCD_WR_REG(0x11); delay(120); LCD_WR_REG(0x29); } /****************************************************************************** 函数说明:LCD清屏函数 入口数据:无 返回值: 无 ******************************************************************************/ void LCD_Clear(uint16_t Color) { uint16_t i,j; LCD_Address_Set(0,0,LCD_W-1,LCD_H-1); for(i=0;i>10; c=c&0x03ff; unsigned int g=c>>5; c=c&0x001f; unsigned int b=c; unsigned int output=0; g=g*2; output= (r<<11)|(g<<5)|(b); return output; } void lcd_init() { pinMode(LCD_SDA, OUTPUT); pinMode(LCD_SCL, OUTPUT); pinMode(LCD_CS, OUTPUT); pinMode(LCD_DS, OUTPUT); digitalWrite(LCD_SDA,0); digitalWrite(LCD_SCL,0); digitalWrite(LCD_CS,0); digitalWrite(LCD_DS,0); vspi = new SPIClass(VSPI); vspi->begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS); vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0)); pinMode(vspi->pinSS(), OUTPUT); //HSPI SS digitalWrite(vspi->pinSS(), LOW); //pull SS slow to prep other end for transfer pinMode(LCD_LED, OUTPUT); digitalWrite(LCD_LED,1); Lcd_Init(); }