TMC32_QJB/LCD/LCD.c
2026-04-30 16:23:12 +08:00

306 lines
5.1 KiB
C

/**
******************************************************************************
* @file LCD.c
* @author jjj
* @version V1.0.0
* @date 06/13/2022
* @brief
******************************************************************************
*
*
* <h2><center>&copy; COPYRIGHT 2022 </center></h2>
******************************************************************************
**/
#include "LCD.h"
const uint8_t SegCode[11]= {
0x5f, //0
0x06, //1
0x3d, //2
0x2f, //3
0x66, //4
0x6b, //5
0x7b, //6
0x0e, //7
0x7f, //8
0x6f, //9
0x20 //-
};
const uint8_t LCDAddr[11][2]={
{13,12},
{15,14},
{17,16},
{19,18},
{21,20},
{10,11},
{8,9},
{6,7},
{4,5},
{2,3},
{0,1}
};
extern void Delay_us(uint32_t us);
extern uint32_t gFunTrace;
/**
* @function AppLCDInit
* @brief LCD³õʼ»¯
*/
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_Board_Init;
memset((void *)&GPIO_Board_Init,0,sizeof(GPIO_InitTypeDef));
GPIO_Board_Init.Pin = GPIO_PIN_5|GPIO_PIN_6;
GPIO_Board_Init.Pull = GPIO_NOPULL;
GPIO_Board_Init.Speed = GPIO_FAST_SPEED;
GPIO_Board_Init.Otype = GPIO_MODE_OUTPUT_PP;
GPIO_Board_Init.Mode = GPIO_MODE_OUT;
GPIO_Init(GPIOB, &GPIO_Board_Init);
GPIO_Board_Init.Pin = GPIO_PIN_3;
GPIO_Board_Init.Pull = GPIO_NOPULL;
GPIO_Board_Init.Speed = GPIO_FAST_SPEED;
GPIO_Board_Init.Otype = GPIO_MODE_OUTPUT_PP;
GPIO_Board_Init.Mode = GPIO_MODE_OUT;
GPIO_Init(GPIOE, &GPIO_Board_Init);
//LCD backlight
GPIO_Board_Init.Pin = GPIO_PIN_12;
GPIO_Board_Init.Pull = GPIO_NOPULL;
GPIO_Board_Init.Speed = GPIO_LOW_SPEED;
GPIO_Board_Init.Otype = GPIO_MODE_OUTPUT_PP;
GPIO_Board_Init.Mode = GPIO_MODE_OUT;
GPIO_Board_Init.SMIT = GPIO_INPUTSCHMIT_DISABLE;
GPIO_Init(GPIOD, &GPIO_Board_Init);
GPIO_ResetBits(GPIOD,GPIO_PIN_12);
LCD_CS_H;
LCD_WR_H;
LCD_DAT_H;
TMC_Delay(500);
LCD_SendCmd(0x52);
LCD_SendCmd(0X30);
LCD_SendCmd(0X00);
LCD_SendCmd(0X0A);
LCD_SendCmd(0X02);
LCD_SendCmd(0X06);
LCD_SendCmd(BIAS1_3_4COM);
LCD_SendCmd(SYSEN);
LCD_SendCmd(LCDON);
}
/**
* @function LCD_SendCmd
* @brief
*/
void LCD_SendCmd(uint8_t Cmd)
{
LCD_CS_L;
Delay_us(1);
LCD_SendBit(0x80,3);
LCD_SendBit(Cmd,9);
LCD_CS_H;
Delay_us(1);
}
/**
* @function LCD_SendBit
* @brief
*/
void LCD_SendBit(uint8_t dat,uint8_t cnt)
{
u8 i;
for(i=0; i<cnt; i++)
{
LCD_WR_L;
Delay_us(1);
if((dat&0x80)==0)
{
LCD_DAT_L;
}
else
{
LCD_DAT_H;
}
Delay_us(1);
LCD_WR_H;
Delay_us(1);
dat<<=1;
}
}
/**
* @function LCD_SendDataBit
* @brief
*/
void LCD_SendDataBit(u8 dat,u8 cnt)
{
u8 i;
for(i=0; i<cnt; i++)
{
if((dat&0x01)==0)
{
LCD_DAT_L;
}
else
{
LCD_DAT_H;
}
Delay_us(1);
LCD_WR_L;
Delay_us(1);
LCD_WR_H;
Delay_us(1);
dat>>=1;
}
}
/**
* @function LCD_Erase
* @brief
*/
void LCD_Erase(void)
{
uint8_t i;
gFunTrace = 20;
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(0,6);//start address
for(i=0;i<DISPLAY_CHAR_MAX;i++)
{
LCD_SendDataBit(0,8);
}
LCD_CS_H;
Delay_us(1);
gFunTrace = 21;
i = SegCode[0];
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[0][0]<<2,6);
LCD_SendDataBit(i,4); //
LCD_CS_H;
Delay_us(1);
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[0][1]<<2,6);
LCD_SendDataBit(i>>4,4);
LCD_CS_H;
Delay_us(1);
gFunTrace = 22;
}
/**
* @function LCD_Display
* @brief
*/
void LCD_Display(uint8_t *p,uint8_t num)
{
uint8_t i,sCode;
LCD_Erase();
gFunTrace = 23;
for(i=0;i<num;i++)
{
sCode = SegCode[p[i]];
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[i][0]<<2,6);
LCD_SendDataBit(sCode,4); //
LCD_CS_H;
Delay_us(1);
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[i][1]<<2,6);
LCD_SendDataBit(sCode>>4,4); //
LCD_CS_H;
Delay_us(1);
}
gFunTrace = 24;
}
/**
* @function LCD_CharDisplay
* @brief
*/
void LCD_CharDisplay(char *p,uint8_t num)
{
uint8_t i,sCode,j;
LCD_Erase();
gFunTrace = 25;
j = 0;
for(i=0;i<num;i++)
{
if(p[i]=='-')sCode = 10;
else if(p[i]>='0' && p[i]<='9')sCode = p[i] - '0';
else continue;
sCode = SegCode[sCode];
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[j][0]<<2,6);
LCD_SendDataBit(sCode,4); //
LCD_CS_H;
Delay_us(1);
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[j][1]<<2,6);
LCD_SendDataBit(sCode>>4,4); //
LCD_CS_H;
Delay_us(1);
j++;
if(j==11)break;
}
gFunTrace = 26;
}
void LCD_Display_test(uint8_t p)
{
uint8_t i,sCode;
LCD_Erase();
for(i=0;i<11;i++)
{
sCode = p;
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[i][0]<<2,6);
LCD_SendDataBit(sCode,4); //
LCD_CS_H;
Delay_us(1);
LCD_CS_L;
LCD_SendBit(0xa0,3);
LCD_SendBit(LCDAddr[i][1]<<2,6);
LCD_SendDataBit(sCode>>4,4); //
LCD_CS_H;
Delay_us(1);
}
}