关于#stm32#的问题:为什么我的OLED都显示0000

#include "stm32f10x.h"                  // Device header
#include "delay.h"   
#include "DHT11.h" 
#include "OLED.h" 
uint8_t temp;
uint8_t humi;
int main(void)
{ 
    OLED_Init();
    DHT11_IO_OUT();
    DHT11_IO_IN();
     DHT11_Init();
 
    while(1)
    {
        
 DHT11_Read_Data(&temp,&humi);
    OLED_ShowNum(1,1,temp,4);
        OLED_ShowNum(2,1,humi,4);
}
    }


#include "stm32f10x.h"   // Device header
#include "DHT11.h" 
#include "delay.h" 
#define  DHT11_PORT    GPIOA
#define  DHT11_IO   GPIO_Pin_7
#define     DHT11_RCC  RCC_APB2Periph_GPIOA
void DHT11_IO_OUT(void)//输出
{
    GPIO_InitTypeDef   GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(DHT11_RCC ,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=DHT11_IO;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}


void DHT11_IO_IN(void)//输入
{
    GPIO_InitTypeDef   GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(DHT11_RCC ,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=DHT11_IO;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}


void DHT11_RST(void){
    DHT11_IO_OUT();
    GPIO_ResetBits(DHT11_PORT,DHT11_IO);//主机控制总线,拉低电平,大于18us给从机开始信号
    Delay_us(20);
    GPIO_SetBits(DHT11_PORT,DHT11_IO);//再拉高总线,等待从机信号
    Delay_us(30);
    GPIO_ResetBits(DHT11_PORT,DHT11_IO);
}


uint8_t DHT11_Check(void){//检查从机
    uint8_t retry;
    DHT11_IO_IN();//输入
    while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry <100)//如果主机读取高电平或是retry小于100循环,这里是在等待从机应答,等待低电平
    {
    
        retry++;
        Delay_us(1);
    }
    if(retry>=100)return 0;    
    else retry=0;
    while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO)==1) && retry<100)//这时候从机应答,但是要持续大于80us,之后要拉高DHT80us再开始传输数据
    {
    
        retry++;
        Delay_us(1);
    }
    if(retry>=100)return 0;
    return 1;
}
uint8_t DHT11_Init(void){
  GPIO_InitTypeDef   GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=DHT11_IO;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
    DHT11_RST();
    return DHT11_Check();
}


static uint8_t DHT_Read_Bit(void)
{

    uint8_t retry = 0;
    while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry <100)//等待变为低电平
    {
    
        retry++;
        Delay_us(1);
    }
    retry = 0;
    while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry <100)//等待变为高电平
    {
    
        retry++;
        Delay_us(1);
    }
    Delay_us(40);//等待40us
    if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1)
            return 1;
    else
            return 0;
    }

    
uint8_t DHT_Read_Byte(void)
{

    uint8_t i,dat;
    dat = 0;
    for(i = 0;i < 8; i++)
    {
    dat <<= 1;
    dat |= DHT_Read_Bit();
}
    return dat;
    }

    
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
    //humi:湿度值为(范围:20%~90%)
    //返回值:0,正常;1,读取失败
    uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
    {
        uint8_t i;
        uint8_t buf[5];
        DHT11_RST();
        if(DHT11_Check() == 1)
        {
            for(i= 0;i < 5;i++)
            {
            
                buf[i] = DHT_Read_Byte();
            }
            if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
            {
            
                *humi = buf[0];
                *temp = buf[2];
            }
        }
        
        else return 1;
        return 0;
    }



为什么我的OLED都显示0000

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这个问题有点宽泛,可以先确定DHT11测回来的值有没有问题,或者向OLED发送固定值显示看显示有没有问题,这样可以缩小问题范围。