MS-DTU/Anjiehui7_Set_ZNY/User/Lcd_drv.c

372 lines
8.0 KiB
C
Raw Normal View History

2025-04-03 14:18:58 +08:00
#include "includes.h"
// <20>Ƿ<EFBFBD><C7B7>Լ<EFBFBD><D4BC><EFBFBD>״̬
u8 self_check_state = 0;
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TVideoBuf VideoBuf = {0};
TVideoBuf Last_VideoBuf = {0};
// <20><><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
// |-A-|
// F B
// |-G-|
// E C
// |-D-|
typedef struct
{
unsigned A : 1;
unsigned B : 1;
unsigned C : 1;
unsigned D : 1;
unsigned E : 1;
unsigned F : 1;
unsigned G : 1;
unsigned : 1;
} TChar;
// <20>ֿ⣬<D6BF><E2A3AC><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
const TChar CLib[] =
{
{0, 0, 0, 0, 0, 0, 0}, // ' '
{0, 0, 0, 0, 0, 0, 1}, // '-'
{0, 1, 1, 0, 0, 0, 1}, // '+' = '-|'
{1, 0, 0, 0, 0, 0, 0}, // '^'
{1, 1, 1, 0, 1, 1, 1}, // 'A'
{0, 0, 1, 1, 1, 1, 1}, // 'b'
{0, 0, 0, 1, 1, 0, 1}, // 'c'
{0, 1, 1, 1, 1, 0, 1}, // 'd'
{1, 0, 0, 1, 1, 1, 1}, // 'E'
{1, 0, 0, 0, 1, 1, 1}, // 'F'
{1, 0, 1, 1, 1, 1, 0}, // 'G'
{0, 0, 1, 0, 1, 1, 1}, // 'h'
{0, 0, 0, 0, 1, 1, 0}, // 'I'
{0, 1, 1, 1, 0, 0, 0}, // 'J'
{0, 0, 0, 1, 0, 0, 0}, // 'K' = '_'
{0, 0, 0, 1, 1, 1, 0}, // 'L'
{0, 0, 0, 1, 0, 0, 0}, // 'M' = '_'
{0, 0, 1, 0, 1, 0, 1}, // 'n'
{0, 0, 1, 1, 1, 0, 1}, // 'o'
{1, 1, 0, 0, 1, 1, 1}, // 'P'
{1, 1, 1, 0, 0, 1, 1}, // 'q'
{0, 0, 0, 0, 1, 0, 1}, // 'r'
{1, 0, 1, 1, 0, 1, 1}, // 'S'
{0, 0, 1, 0, 0, 0, 1}, // 't'
{0, 1, 1, 1, 1, 1, 0}, // 'U'
{0, 1, 0, 0, 1, 1, 1}, // 'V'
{0, 0, 0, 1, 0, 0, 0}, // 'W' = '_'
{0, 0, 0, 1, 0, 0, 0}, // 'X' = '_'
{0, 1, 1, 1, 0, 1, 1}, // 'y'
{0, 0, 0, 1, 0, 0, 0}, // 'Z' = '_'
{1, 1, 1, 1, 1, 1, 0}, // '0'
{0, 1, 1, 0, 0, 0, 0}, // '1'
{1, 1, 0, 1, 1, 0, 1}, // '2'
{1, 1, 1, 1, 0, 0, 1}, // '3'
{0, 1, 1, 0, 0, 1, 1}, // '4'
{1, 0, 1, 1, 0, 1, 1}, // '5'
{1, 0, 1, 1, 1, 1, 1}, // '6'
{1, 1, 1, 0, 0, 0, 0}, // '7'
{1, 1, 1, 1, 1, 1, 1}, // '8'
{1, 1, 1, 1, 0, 1, 1}, // '9'
};
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ֿ<EFBFBD><D6BF>еı<D0B5><C4B1><EFBFBD>
typedef enum
{
CODE_SPACE, CODE_MINUS, CODE_PLUS, CODE_EXP,
CODE_A, CODE_B, CODE_C, CODE_D, CODE_E, CODE_F, CODE_G,
CODE_H, CODE_I, CODE_J, CODE_K, CODE_L, CODE_M, CODE_N,
CODE_O, CODE_P, CODE_Q, CODE_R, CODE_S, CODE_T,
CODE_U, CODE_V, CODE_W, CODE_X, CODE_Y, CODE_Z,
CODE_0, CODE_1, CODE_2, CODE_3, CODE_4, CODE_5, CODE_6, CODE_7, CODE_8, CODE_9
} TCode;
TCode HT1621_Char2Code(char c)
{
if(c >= '0' && c <= '9')
return CODE_0 + (c - '0');
if(c >= 'a' && c <= 'z')
return CODE_A + (c - 'a');
if(c >= 'A' && c <= 'Z')
return CODE_A + (c - 'A');
if(c == '-')
return CODE_MINUS;
if(c == '+')
return CODE_PLUS;
if(c == '^')
return CODE_EXP;
return CODE_SPACE;
}
// pin_no: 1~32
// com_no: 1~4
void HT1621_WriteBuf(u16 pin_com, u8 bit_val)
{
uint8_t byte_index, bit_index;
uint8_t pin_no = pin_com / 10;
uint8_t com_no = pin_com % 10;
if(pin_no < 1 || pin_no > 25)
return;
if(com_no < 1 || com_no > 6)
return;
byte_index = pin_no - 1;
bit_index = com_no - 1; // COM6<4D><36>λ<EFBFBD><CEBB>COM1<4D><31>λ
if(bit_val)
VideoBuf.buf[byte_index] |= (1 << bit_index);
else
VideoBuf.buf[byte_index] &= ~(1 << bit_index);
}
// дһ<D0B4><D2BB><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>ַ<EFBFBD>
// pin_comA = (A<>ε<EFBFBD>pin_no) * 10 + (A<>ε<EFBFBD>com_no)
void HT1621_WriteChar(char c, u16 pin_comA, u16 pin_comB, u16 pin_comC, u16 pin_comD, u16 pin_comE, u16 pin_comF, u16 pin_comG)
{
TCode code = HT1621_Char2Code(c);
HT1621_WriteBuf(pin_comA, CLib[code].A);
HT1621_WriteBuf(pin_comB, CLib[code].B);
HT1621_WriteBuf(pin_comC, CLib[code].C);
HT1621_WriteBuf(pin_comD, CLib[code].D);
HT1621_WriteBuf(pin_comE, CLib[code].E);
HT1621_WriteBuf(pin_comF, CLib[code].F);
HT1621_WriteBuf(pin_comG, CLib[code].G);
}
// дһ<D0B4><D2BB><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// pin_comA = (A<>ε<EFBFBD>pin_no) * 10 + (A<>ε<EFBFBD>com_no)
void HT1621_Write7Seg(u8 val, u16 pin_comA, u16 pin_comB, u16 pin_comC, u16 pin_comD, u16 pin_comE, u16 pin_comF, u16 pin_comG)
{
HT1621_WriteBuf(pin_comA, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comB, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comC, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comD, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comE, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comF, val & 1);
val >>= 1;
HT1621_WriteBuf(pin_comG, val & 1);
}
///////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HT16L23<32><33><EFBFBD><EFBFBD>оƬ
//<2F><><EFBFBD><EFBFBD>
#define WRITE_LCD 0x80
#define DRIVE_MODE_CMD 0x82
#define SYS_MODE_CMD 0x84
#define FRQ_CMD 0x86
#define BLINK_FRQ_CMD 0x88
#define VOL_SET_CMD 0x8a
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BIAS_LCD 0x34 // <20><><EFBFBD><EFBFBD>ģʽ SEG40*8com<6F><6D>ʾ<EFBFBD><CABE>λģʽ 1/8duty 1/3bias
#define SYS_MODE_LCD 0x03 //<2F><>ʾ<EFBFBD><CABE><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>񶼴<EFBFBD><F1B6BCB4><EFBFBD>
#define FRQ_LCD 0x02 //3--128HZ 2--64
#define BLINK_FRQ_LCD 0x00 //blinking off
#define VOL_LCD 0x02 //1--<2D>ڲ<EFBFBD>V <20><>ѹ3.3v
///////////////////////////////////////////////////////////////////////////////////
void HT1621_Delay()
{
__NOP();
}
// ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
#define HT1621_CS_EN() \
{ \
LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_12); \
HT1621_Delay(); \
}
#define HT1621_CS_DIS() \
{ \
LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_12); \
HT1621_Delay(); \
}
#define HT1621_CLK_LOW() \
{ \
LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_13); \
HT1621_Delay(); \
}
#define HT1621_CLK_HIGH() \
{ \
LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_13); \
HT1621_Delay(); \
}
#define HT1621_DATA_1() \
{ \
LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_14); \
HT1621_Delay(); \
}
#define HT1621_DATA_0() \
{ \
LL_GPIO_ResetOutputPin(GPIOD, LL_GPIO_PIN_14); \
HT1621_Delay(); \
}
// д 1 bit
void HT1621_Bit(u8 b1)
{
HT1621_CLK_LOW();
if(b1)
{
HT1621_DATA_1();
}
else
{
HT1621_DATA_0();
}
HT1621_CLK_HIGH();
}
// д<><D0B4><EFBFBD><EFBFBD>bits
void HT1621_Bits(u8 byte, u8 num)
{
while(num--)
{
HT1621_Bit(byte & 0x80);
byte <<= 1;
}
}
// д<><D0B4><EFBFBD><EFBFBD>
void HT1621_Cmd(u8 cmd, u8 val)
{
// Ƭѡ
HT1621_CS_EN();
HT1621_Bits(cmd, 8);
HT1621_Bits(val, 8);
// ȡ<><C8A1>Ƭѡ
HT1621_CS_DIS();
}
// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
void HT1621_SetParams()
{
HT1621_Cmd(DRIVE_MODE_CMD, BIAS_LCD);
HT1621_Cmd(VOL_SET_CMD, VOL_LCD); //ʹ<><CAB9><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HT1621_Cmd(FRQ_CMD, FRQ_LCD);
HT1621_Cmd(BLINK_FRQ_CMD, BLINK_FRQ_LCD);
HT1621_Cmd(SYS_MODE_CMD, SYS_MODE_LCD);
}
// ˢ<><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void HT1621_Refresh()
{
u8 i;
// <20>Ƚ<EFBFBD><C8BD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ݺͱ<DDBA>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD>޸ı<DEB8><C4B1>򲻲<EFBFBD><F2B2BBB2><EFBFBD>
if(memcmp(&VideoBuf, &Last_VideoBuf, sizeof(VideoBuf)) == 0)
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ݺͱ<DDBA>־λ
Last_VideoBuf = VideoBuf;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD>־λ<D6BE><CEBB>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
if(!self_check_state && !VideoBuf.blink_visible)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>
if(VideoBuf.fld1_blink) // <20><>ʾ1
{
Disp_Fld1Text(" ");
Disp_Fld1PointOff();
}
if(VideoBuf.fld2_blink) // <20><>ʾ2
{
Disp_Fld2Text(" ");
Disp_Fld2PointOff();
}
if(VideoBuf.fld3_blink) // <20><>ʾ3
{
Disp_Fld3Text(" ");
Disp_Fld3PointOff();
}
if(VideoBuf.fld4_blink) // <20><>ʾ4
{
Disp_Fld4Text(" ");
Disp_Fld4PointOff();
}
if(VideoBuf.battery_blink) // <20><><EFBFBD><EFBFBD>
Disp_WriteBattery(0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD>
for(i = 0; i < VideoBuf.cursor_width; i++)
Disp_DispChar(VideoBuf.cursor_pos + i, ' ');
}
// Ƭѡ
HT1621_CS_EN();
HT1621_Bits(WRITE_LCD, 8); // cmd
HT1621_Bits(0, 8); // addr
for(i = 0; i < sizeof(VideoBuf.buf); i++)
HT1621_Bits(VideoBuf.buf[i], 8);
// ȡ<><C8A1>Ƭѡ
HT1621_CS_DIS();
// <20>ָ<EFBFBD><D6B8><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ݺͱ<DDBA>־λ
VideoBuf = Last_VideoBuf;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĻȫϨ<C8AB><CFA8>
void HT1621_AllOff()
{
self_check_state = 1;
memset(VideoBuf.buf, 0x00, sizeof(VideoBuf.buf)); // <20><>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
HT1621_Refresh();
self_check_state = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļȫ<C4BB><C8AB><EFBFBD><EFBFBD>
void HT1621_AllOn()
{
self_check_state = 1;
memset(VideoBuf.buf, 0xFF, sizeof(VideoBuf.buf)); // <20><>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
HT1621_Refresh();
self_check_state = 0;
}
void LCD_Init()
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
/**/
LL_GPIO_SetOutputPin(GPIOD, LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void LCD_MyOpen()
{
HT1621_SetParams();
}