网站开发及上线过程,网站建设备案策划书,温州网站建设设计公司,微网站在哪建之前一直想用hpdl1414画一块手表#xff0c;前面pcb测试板画完没空调试#xff0c;最近刚好空出来时间#xff0c;遂发下驱动。 这里简单赘述hpdl1414的驱动原理#xff1a;D0-D6负责数据输入#xff08;ascii表后7位#xff09;#xff0c;A0,A1负责更改hpdl1414模块显…之前一直想用hpdl1414画一块手表前面pcb测试板画完没空调试最近刚好空出来时间遂发下驱动。 这里简单赘述hpdl1414的驱动原理D0-D6负责数据输入ascii表后7位A0,A1负责更改hpdl1414模块显示的位数wr负责控制是否写入数据。
下图为pcb接线d4忘记画了用pb7来 hpdl1414.h
#ifndef HPDL1414_H
#define HPDL1414_H#include stm32l0xx_hal.h// 数据引脚定义
#define D0_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
#define D0_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define D1_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)
#define D1_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)
#define D2_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define D2_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define D3_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define D3_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define D4_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define D4_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define D5_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
#define D5_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define D6_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define D6_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)// 控制引脚定义
#define WR1_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET) // 前4位
#define WR1_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define WR2_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET) // 后4位
#define WR2_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)
#define A0_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)
#define A0_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)
#define A1_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)
#define A1_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)// 函数声明
void hpdl1414_init(void);
void hpdl1414_write_dual_char(uint8_t position, char c);
void hpdl1414_display_string(const char *str); // 修复未定义错误
void hpdl1414_display_8digit_string(const char *str);#endif // HPDL1414_H
hpdl1414.c
#include hpdl.h
#include string.h// 微秒延时函数
static void delay_us(uint16_t us) {while (us--) {__NOP(); __NOP(); __NOP(); __NOP();}
}// 设置数据引脚
static void set_data_pins(uint8_t data) {(data 0x01) ? D0_H : D0_L;(data 0x02) ? D1_H : D1_L;(data 0x04) ? D2_H : D2_L;(data 0x08) ? D3_H : D3_L;(data 0x10) ? D4_H : D4_L;(data 0x20) ? D5_H : D5_L;(data 0x40) ? D6_H : D6_L;
}// 设置地址引脚
static void set_address(uint8_t addr) {(addr 0x01) ? A0_H : A0_L;(addr 0x02) ? A1_H : A1_L;
}// 初始化函数
void hpdl1414_init(void) {WR1_H; WR2_H; // 禁用写入A0_L; A1_L; // 地址归零D0_L; D1_L; D2_L; D3_L; D4_L; D5_L; D6_L; // 数据引脚置低
}// 写入单个字符到指定位置0-7
void hpdl1414_write_dual_char(uint8_t position, char c) {uint8_t physical_pos;if (position 4) {// 前4位WR1控制修正地址顺序0→3, 1→2, 2→1, 3→0physical_pos 3 - position; // 关键修改反向映射set_address(physical_pos);set_data_pins(c);WR1_L; delay_us(1); WR1_H;} else if (position 8) {// 后4位WR2控制同样修正地址顺序physical_pos 7 - position; // 关键修改反向映射set_address(physical_pos);set_data_pins(c);WR2_L; delay_us(1); WR2_H;}
}// 显示4位字符串兼容旧代码
void hpdl1414_display_string(const char *str) {uint8_t len strlen(str);if (len 4) len 4;for (uint8_t i 0; i len; i) {hpdl1414_write_dual_char(i, str[i]);}for (uint8_t i len; i 4; i) {hpdl1414_write_dual_char(i, );}
}// 显示8位字符串
void hpdl1414_display_8digit_string(const char *str) {uint8_t len strlen(str);if (len 8) len 8;for (uint8_t i 0; i len; i) {hpdl1414_write_dual_char(i, str[i]);}for (uint8_t i len; i 8; i) {hpdl1414_write_dual_char(i, );}
}
main.c(部分) hpdl1414_init();// 显示1234hpdl1414_display_string(1234);uint8_t i 0;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){hpdl1414_display_8digit_string(12345678);//hpdl1414_display_8digit_string( DESSSQ );//hpdl1414_display_8digit_string(ILOVEYOU);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
最后附上驱动成功图片