[C] 纯文本查看 复制代码
#include "lcd.h"
#include "gpio.h"
#include "spi.h"
#define _lcd_cs1_dis HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET)
#define _lcd_cs1_en HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_RESET)
#define _lcd_cs2_dis HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET)
#define _lcd_cs2_en HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_RESET)
#define _spiMOSI_set HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET)
#define _spiMOSI_clr HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET)
SMS2813_MAP_TypeDef lcdRam;
static int pinConfigLcd(void)
{
MX_GPIO_Init();
// lcd管脚配置
// _lcd_cs1_w;
_lcd_cs1_dis;
// _lcd_cs2_w;
_lcd_cs2_dis;
// _spiMOSI_dir;
_spiMOSI_clr;
// _spiSCK_dir;
// _spiSCK_set;
return _OK;
}
static int setLcdCs(uint8 page, uint8 sta)
{
// _lcd_cs1_w;
// _lcd_cs2_w;
switch (page)
{
case _LOW32:
if (sta == _EN)
{
_lcd_cs1_en;
_lcd_cs2_dis;
}
else
_lcd_cs1_dis;
break;
case _HIGH32:
if (sta == _EN)
{
_lcd_cs2_en;
_lcd_cs1_dis;
}
else
_lcd_cs2_dis;
break;
default:
_lcd_cs1_dis;
_lcd_cs2_dis;
break;
}
return _OK;
}
//软件SPI
// static int wrLcdSerialData(uint16 dat, uint8 num)
// {
// int i;
// for (i = 0; i < num; i++)
// {
// if (dat & (0x8000 >> i))
// _spiMOSI_set;
// else
// _spiMOSI_clr;
// _spiSCK_clr;
// HAL_Delay(1);
// _spiSCK_set;
// }
// return num;
// }
//硬件spi
static int wrLcdSerialData(uint16 dat, uint8 num)
{
HAL_SPI_Transmit(&hspi1, (uint8_t *)&dat, num, 100);
return num;
}
uint8 wrLcdCommand(uint16 command, uint8 pag)
{
LCD_WORD_TypeDef dat;
// _spiSCK_dir;
// _spiSCK_set;
// _spiMOSI_dir;
// _spiMOSI_set;
setLcdCs(pag, _EN);
dat.COMMAND.lcdCommand = command & 0x1ff;
dat.COMMAND.lcdCtr = W_COMMAND;
wrLcdSerialData(dat.data, 12);
setLcdCs(pag, _DIS);
// _spiMOSI_set;
return _OK;
}
int32 lcd_init(uint8_t full)
{
// 管脚配置
pinConfigLcd();
// 启动bais 1/3,COMM 4
wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _LOW32);
wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _HIGH32);
HAL_Delay(200);
// 打开系统振荡器
wrLcdCommand(LCD_SYS_EN, _LOW32);
wrLcdCommand(LCD_SYS_EN, _HIGH32);
HAL_Delay(200);
// 开显示
wrLcdCommand(LCD_ON, _LOW32);
wrLcdCommand(LCD_ON, _HIGH32);
HAL_Delay(200);
if (full)
{
// 清屏
clearLcd();
lcd_full();
}
return _OK;
}
int lcd_full(void)
{
wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _LOW32);
printLcdPage((const uint32 *)(&lcdRam.cs1Data), _LOW32);
wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _HIGH32);
printLcdPage((const uint32 *)(&lcdRam.cs2Data), _HIGH32);
return _OK;
}
//软件
// int printLcdPage(const uint32 *dat, uint8 pag)
// {
// int i, j;
// LCD_WORD_TypeDef idat;
// // _spiSCK_dir;
// // _spiSCK_set;
// // _spiMOSI_dir;
// _spiMOSI_set;
// setLcdCs(pag, _EN);
// // 发送b101A5A4A3A2A0
// idat.DATA.lcdCtr = W_DATA;
// idat.DATA.lcdAddr = 0;
// wrLcdSerialData(idat.data, 9);
// for (i = 0; i < 4; i++)
// {
// for (j = 0; j < 32; j++)
// {
// // if (!(j & 0x7))
// // HAL_Delay(1);
// if (dat[i] & (1ul << j))
// _spiMOSI_set;
// else
// _spiMOSI_clr;
// _spiSCK_clr;
// // __NOP;
// HAL_Delay(1);
// _spiSCK_set;
// }
// }
// setLcdCs(pag, _DIS);
// _spiMOSI_set;
// return _OK;
// }
//硬件
int printLcdPage(const uint32 *dat, uint8 pag)
{
int i, j;
LCD_WORD_TypeDef idat;
setLcdCs(pag, _EN);
// 发送b101A5A4A3A2A0
idat.DATA.lcdCtr = W_DATA;
idat.DATA.lcdAddr = 0;
wrLcdSerialData(idat.data, 9);
for (i = 0; i < 4; i++)
{
for (j = 0; j < 32; j++)
{
uint16_t dataToSend = (dat[i] & (1ul << j)) ? 1 : 0;
wrLcdSerialData(dataToSend, 1);
}
}
setLcdCs(pag, _DIS);
return _OK;
}
int setLcd(void)
{
memset(&lcdRam.cs1Data, 0xFFFFFFFF, sizeof(lcdRam.cs1Data));
memset(&lcdRam.cs2Data, 0xFFFFFFFF, sizeof(lcdRam.cs2Data));
return _OK;
}
int clearLcd(void)
{
memset(&lcdRam.cs1Data, 0, sizeof(lcdRam.cs1Data));
memset(&lcdRam.cs2Data, 0, sizeof(lcdRam.cs2Data));
return _OK;
}