新手上路
- 积分
- 20
- 金钱
- 20
- 注册时间
- 2022-4-9
- 在线时间
- 5 小时
|
使用HT1622驱动断码屏,屏幕亮一会儿会黑屏,有大佬遇到过吗,使用的是PY32单片机,48MHZ频率,驱动代码如下
static uint8_t NumData[] = {0xEE, 0x48, 0xD6, 0xDA, 0x78, 0xBA, 0xBE, 0xC8, 0xFE, 0xFA};
static uint8_t _NumData[] = {0x77, 0x012, 0x6B, 0x5B, 0x1E, 0x5D, 0x7D, 0x13, 0x7F, 0x5F};
/**
***********************************************************
* @brief 屏幕控制引脚初始化
* @param
* @return
***********************************************************
*/
void GpioInitHT1622(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE(); /* Enable GPIOA clock */
//HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_7 | GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; /* Push-pull output */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* Enable pull-up */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; /* GPIO speed */
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* GPIO initialization */
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7
, GPIO_PIN_RESET);
}
/**
***********************************************************
* @brief 屏幕背光控制引脚初始化
* @param
* @return
***********************************************************
*/
void GpioInitBackLight(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOF_CLK_ENABLE();
/* Initialize GPIO PA11 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; /* Push-pull output */
GPIO_InitStruct.Pull = GPIO_PULLDOWN; /* Enable pull-up */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; /* GPIO speed */
/* GPIO initialization */
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_SET);
}
/**
***********************************************************
* @brief 关闭屏幕背光
* @param
* @return
***********************************************************
*/
void BacklightOff(void)
{
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_SET);
}
/**
***********************************************************
* @brief 打开屏幕背光
* @param
* @return
***********************************************************
*/
void BacklightOn(void)
{
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_RESET);
}
/**
***********************************************************
* @brief HT1622 底层驱动
* @param Data 数据 Length 数据长度
* @return
***********************************************************
*/
void Write_HT1622_Byte1(uint8_t Data, uint8_t length)
{
uint8_t i, Temp = 0x01;
for (i = 0; i < length; i++)
{
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_WR_L;
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
if (Data & Temp)
{
LCD_DAT_H;//数据线置1
}
else
{
LCD_DAT_L;//数据线置0
}
Temp <<= 1; //准备下一位
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_WR_H; //“写”时钟置1
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
}
}
/**
***********************************************************
* @brief HT1622写入数据函数
* @param Address 写数据地址 Data 数据
* @return
***********************************************************
*/
void Write_HT1622_Byte(uint8_t Data, uint8_t length)
{
uint8_t i, Temp = 0x80;
for (i = 0; i < length; i++)
{
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
//“写”时钟置0
LCD_WR_L;
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
if (Data & Temp)
{
LCD_DAT_H;//数据线置1
}
else
{
LCD_DAT_L;//数据线置0
}
Temp >>= 1; //准备下一位
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_WR_H; //“写”时钟置1
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
}
}
/**
***********************************************************
* @brief HT1622写入数据函数
* @param Address 写数据地址 Data 数据
* @return
***********************************************************
*/
void Write_HT1622_Data(uint8_t Address, uint8_t Data)
{
uint8_t Addr;
if (Address == 0) // 如果 Address 为 0,返回或者执行其他适当操作
{
return; // 不执行任何操作
}
LCD_CS_L; //片选置0
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
Addr = (Address - 1) * 2;
Addr <<= 2; //将实际地址挪到高位
Write_HT1622_Byte(0xA0, 3); //写入写数据的ID 101 高3位有效
Write_HT1622_Byte(Addr, 6); //写入6个位初始地址 高6位有效
Write_HT1622_Byte1(Data, 8); //写入8个位数据
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_CS_H; //片选置1
}
/**
***********************************************************
* @brief HT1622写命令函数
* @param Command 命令
* @return
***********************************************************
*/
void Write_HT1622_Command(uint8_t Command)
{
LCD_CS_L; //片选置0
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
Write_HT1622_Byte(0x80, 3); //写入命令的ID:100
Write_HT1622_Byte(Command, 8); //写入实际命令的高8位(CMD.):C8-C1
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_WR_L; //|
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_DAT_L; //|写入一个“1”即手册上所指“无关位”的那一个数据位
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_WR_H; //|
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
LCD_CS_H; //片选置1
}
/**
***********************************************************
* @brief 清屏
* @param
* @return
***********************************************************
*/
void Dispay_Clear(void)
{
uint8_t i;
for (i = 0; i <= 65; i++)
{
Write_HT1622_Data(i, 0x0);
}
}
|
|