1.STM32分文件实现代码
编译的总文件夹dh11andlcd,C文件不能跨文件夹查找,新增的分文件,需要都放调用的文件夹下
C文件和H文件理解:H文件是门脸,放在前面给别人的,别人一看就知道有什么东西。C是给内部人用的,不用放在门脸上。
2.CubeMX设置
stm32GPIO口不能直接作为输入和输出引脚——是需要初始化的
基本上没有什么需要设置的
PA0——PA7接LCD1602的D0——D7
//电源
VSS -- GND
VDD -- 5V
//对比度
VO -- GND
//控制线
RS -- P1.0
RW -- P1.1
E -- P1.4
//背光灯
A -- 5V
K -- GDN
DH11的数据线接PB6(在程序里设置其为输入IO还是输出IO)
3.函数代码
DH11.h
只用 void DH11_to_data1(uint8_t data1[]);但是需要注意格式
#ifndef __DH11_H__
#define __DH11_H__
#include "gpio.h"
void DH11_to_data1(uint8_t data1[]);
#endif
DH11.c
#include "gpio.h"
#define tp_data_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
#define tp_data_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET)
void delay_us(uint16_t cnt)
{
uint8_t i;
while(cnt)
{
for (i = 0; i < 10; i++)
{
}
cnt--;
}
}
void MX_GPIO_pin_pp(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pins : PB0 PB1 PB2 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void MX_GPIO_pin_input(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pins : PB0 PB1 PB2 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void init_DHT(void)
{
MX_GPIO_pin_pp(); //需要写东西
tp_data_high;
tp_data_low;
HAL_Delay(25); //µÍµÄ½×¶Î
tp_data_high;
//Delay30us();
delay_us(30);
//Delay30us(); //¿ªÊ¼ÏìÓ¦½×¶Î µã¿¨
delay_us(30);
MX_GPIO_pin_input();//需要读东西
while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)); //¿¨DHTΪµÍ ×ßÍê
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)); //¿¨DHTÀ¸ß ×ßÍê ºóÃæÊÇÊý¾Ý½ÓÊÜ
}
void DH11_to_data1(uint8_t data1[])
{
int i,j; //i±íʾ8bitµÄÊý¾Ý j±íʾÿ¸öbitµÄÖµ
char tmp,flag;
init_DHT(); //³õʼ»¯ºó½ÓÊÜ8λÊý¾Ý+8λ +8λ+8λ +8λ
for(i=0;i<5;i++){
for(j=0;j<8;j++){
MX_GPIO_pin_input();//需要读东西
while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)); //ÀµÍ×ßÍê
//HAL_Delay()35us();
delay_us(35);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==1){
flag=1;
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)); //×ßÍê¸ßµçƽ
}else{
flag=0;
}
tmp=tmp<<1; //tmp±íʾ½ÓÊܵÄÒ»¸ö8λÊý¾Ý
tmp |=flag;
}
data1[i]=tmp;
}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
void lcd_line_show(char row,char line,char *string);
#endif
LCD1602.c
#include "gpio.h"
#define RS_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)
#define RS_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)
#define RW_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET)
#define RW_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET)
#define EN_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET)
#define EN_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET)
int site[2][16]={{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F}};
void cmd_write(char a)
{
RS_low;
RW_low; //RS 和 R/W 共同为低电平时可以写入指令(地址)
EN_low;
GPIOA->ODR = a;
//_nop_(); //延迟1.085us
HAL_Delay(5);
EN_high;
//_nop_();
HAL_Delay(5);
EN_low;
}
void data_write(char a)
{
RS_high;RW_low; // RS 为高电平 R/W 为低电平时可以写入数据
EN_low;
GPIOA->ODR = a;
HAL_Delay(5);
EN_high;
HAL_Delay(5);
EN_low;
}
void lcd_line_show(char row,char line,char *string)
{
switch (row){
case 1:
cmd_write(0x80+line);
while(*string){
data_write(*string);
string++;
}
break;
case 2:
cmd_write(0x80+0x40+line);
while(*string){
data_write(*string);
string++;
}
break;
}
}
void init_lcd(void)
{
HAL_Delay(15); //(1)延时 15ms
cmd_write(0x38); //(2)写指令 38H(不检测忙信号)
HAL_Delay(5); // (3)延时 5ms
// (4)以后每次写指令,读/写数据操作均需要检测忙信号
cmd_write(0x38); //(5)写指令 38H:显示模式设置
cmd_write(0x08); // (6)写指令 08H:显示关闭
cmd_write(0x01); //(7)写指令 01H:显示清屏
cmd_write(0x06); // (8)写指令 06H:显示光标移动设置
cmd_write(0x0C); // (9)写指令 0CH:显示开及光标设置
}
32里面微秒的延时函数
void delay_us(uint16_t cnt)
{
uint8_t i;
while(cnt)
{
for (i = 0; i < 10; i++)
{
}
cnt--;
}
}
main函数代码
#include "lcd1602.h"
#include "dh11.h"
#include "stdio.h"
int fputc(int ch, FILE *f)
{
unsigned char temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return ch;
}
//main中代码
uint8_t data1[4]={'0'};
char meseege1[16];
char meseege2[16];
init_lcd(); //(1) 在对液晶模块的初始化中要先设置其显示模式
//(2) 在液晶模块显示字符时光标是自动右移的,无霿人工干预
//(3) 每次输入指令前都要判断液晶模块是否处于忙的状怿
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
DH11_to_data1(data1);
printf("humidity:");
printf("%d.%d\r",data1[0],data1[1]);
printf("tempreture:");
printf("%d.%d\r",data1[2],data1[3]);
sprintf(meseege1,"humidity:%d.%d",data1[0],data1[1]);
lcd_line_show(1,0,meseege1);
sprintf(meseege2,"tempreture:%d.%d",data1[2],data1[3]);
lcd_line_show(2,0,meseege2);
HAL_Delay(2000);
}
4.实现效果