306 lines
5.1 KiB
C
306 lines
5.1 KiB
C
/**
|
|
******************************************************************************
|
|
* @file LCD.c
|
|
* @author jjj
|
|
* @version V1.0.0
|
|
* @date 06/13/2022
|
|
* @brief
|
|
******************************************************************************
|
|
*
|
|
*
|
|
* <h2><center>© 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);
|
|
}
|
|
}
|
|
|