数码管:
void displayNumber(uint8_t aa,uint8_t num) {
// 数码管的显示模式
uint8_t displayMode[10][8] = {
{0, 0, 0, 0, 0, 0, 1, 1}, // 0
{1, 0, 0, 1, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0, 1}, // 2
{0, 0, 0, 0, 1, 1, 0, 1}, // 3
{1, 0, 0, 1, 1, 0, 0, 1}, // 4
{0, 1, 0, 0, 1, 0, 0, 1}, // 5
{0, 1, 0, 0, 0, 0, 0, 1}, // 6
{0, 0, 0, 1, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0, 1}, // 8
{0, 0, 0, 0, 1, 0, 0, 1} // 9
};
// afedcg
// 设置数码管的引脚状态
HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, (GPIO_PinState)displayMode[num][0]);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, (GPIO_PinState)displayMode[num][1]);
HAL_GPIO_WritePin(LED_C_GPIO_Port, LED_C_Pin, (GPIO_PinState)displayMode[num][2]);
HAL_GPIO_WritePin(LED_D_GPIO_Port, LED_D_Pin, (GPIO_PinState)displayMode[num][3]);
HAL_GPIO_WritePin(LED_E_GPIO_Port, LED_E_Pin, (GPIO_PinState)displayMode[num][4]);
HAL_GPIO_WritePin(LED_F_GPIO_Port, LED_F_Pin, (GPIO_PinState)displayMode[num][5]);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, (GPIO_PinState)displayMode[num][6]);
HAL_GPIO_WritePin(LED_DP_GPIO_Port, LED_DP_Pin, (GPIO_PinState)displayMode[num][7]);
if(aa==1){
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_SET); // 将 LED_1 引脚电平置高
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
}
else if(aa==2){
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_SET); // 将 LED_2 引脚电平置低
HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
}
else if(aa==3){
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_SET); // 将 LED_3 引脚电平置低
HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_RESET); // 将 LED_4 引脚电平置低
}
else if(aa==4){
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET); // 将 LED_1 引脚电平置高
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, GPIO_PIN_RESET); // 将 LED_2 引脚电平置低
HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin, GPIO_PIN_RESET); // 将 LED_3 引脚电平置低
HAL_GPIO_WritePin(LED_4_GPIO_Port, LED_4_Pin, GPIO_PIN_SET); // 将 LED_4 引脚电平置低
}
}
uint32_t seconds = 0;
uint8_t displayPosition = 1; // 初始化显示位置为第一位
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM3) { // 假设你使用的是 TIM3 定时器
seconds++; // 秒数加一
if (seconds >= 6000) { // 如果超过了一小时,重置秒数
seconds = 0;
}
}
}
void displayNumber00(uint32_t num) {
uint8_t digits[4] = {0}; // 存储每个位上的数字
// 分离每个位上的数字
for (int i = 3; i >= 0; i--) {
digits[i] = num % 10; // 取出最后一位数字
num /= 10; // 去掉最后一位数字
}
// 显示每个位上的数字
for (int i = 0; i < 4; i++) {
// 如果没有数字,则显示0
uint8_t digit = (i < 4) ? digits[i] : 0;
// 调用 displayNumber 函数显示数字
displayNumber(i + 1, digit);
// 延时一段时间,可以根据需要调整
HAL_Delay(2);
}
}
定时器:
普通定时(中断):
1.
2
3 启动定时器
HAL_TIM_Base_Start_IT(&htim3);
4 回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM3) {
//执行
}
}
编码器模式:
1
2
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
不需要回调函数
串口:
接线注意TX-RX RX-TX
1
2
基本函数
// 发送数据到串口
char data[] = "Hello, world!\r\n";
HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), HAL_MAX_DELAY);
// 发送数据到串口1,使用DMA模式
char data[] = "Yes\r\n";
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)data, strlen(data));
回调函数(发送or接收之后执行操作用)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
// 当串口 DMA 发送完成时,此回调函数被调用
if (huart->Instance == USART1)
{
// 这里可以添加你想要执行的操作
}
}
接受再发送回调函数(记得开中断)
主函数: HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart == &huart2) {
HAL_UART_Transmit_IT(&huart2, receiveData, Size);
HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
}
}
OLED:
初始化
开启IIC的IIC模式
开启快速模式
复制oled.c font.c 复制oled.h font.h
OLED_NewFrame();
//显示函数
OLED_ShowFrame();
显示函数
颜色参数:OLED_COLOR_NORMAL
OLED_COLOR_REVERSED
OLED_DrawCircle();等
OLED_Draw.....系列
画图形
显示本地图片
串口助手生成代码
复制到font.c末尾
在font.h中导出
最后
OLED_DrawImage(43,0,&aaaImg,OLED_COLOR_NORMAL);
显示汉字
在串口助手取模之后到font..c取代相同大小的数组,到font.h返回一下
最后直接在双引号直接写汉字和ASCLL的字符
OLED_PrintString(0,0,"这里写汉字",&font16x16,OLED_COLOR_NORMAL);
蓝牙模块
串口设置异步发送
蓝牙波特率默认9600
初始化代码
主函数接收数据
uint8_t receiveData[50];
HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart == &huart2) {
HAL_UART_Transmit_IT(&huart2, receiveData, Size);
HAL_UARTEx_ReceiveToIdle_IT(&huart2, receiveData, sizeof(receiveData));
}
}
当前示例为发送什么再接什么
在波特律动 串口助手 (keysking.com) 或手机app(搜索SPP然后连接)
超声波测距
旋转编码器
开启一个定时器的“编码器模式” 然后把旋转编码器AB分布i连接到:
开启定时器
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
初始化数据
htim3.Instance->CNT = 1000;
主函数循环
char send_buf[50] = {0};
uint16_t cnt_encoder = 0;
if (cnt_encoder != __HAL_TIM_GET_COUNTER(&htim3))
{
OLED_NewFrame();
cnt_encoder = __HAL_TIM_GET_COUNTER(&htim3);
sprintf(send_buf, "%d\n", cnt_encoder);
OLED_PrintString(0,0,send_buf,&font16x16,OLED_COLOR_NORMAL);
HAL_UART_Transmit(&huart1, (uint8_t *)send_buf, strlen(send_buf), 10);
HAL_UART_Transmit(&huart2, (uint8_t *)send_buf, strlen(send_buf), 10);
OLED_ShowFrame();
}
HAL_Delay(10);
光敏电阻传感器
开启ADC
连接光敏电阻DO到
主函数循环
HAL_ADC_Start(&hadc1);
uint16_t a = HAL_ADC_GetValue(&hadc1);
OLED_NewFrame();
char aa[10];
sprintf(aa, "%d\n", a);
OLED_PrintString(0,0,aa,&font16x16,OLED_COLOR_NORMAL);
HAL_UART_Transmit(&huart1, (uint8_t *)aa, strlen(aa), 10);
HAL_UART_Transmit(&huart2, (uint8_t *)aa, strlen(aa), 10);
OLED_ShowFrame();