打印
[CW32F030系列]

【CW32F030CxTx StartKit测评】+驱动OLED和DHT11

[复制链接]
745|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-7-8 15:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ar, cw
本帖最后由 51xlf 于 2022-7-8 17:01 编辑

这里要驱动是IIC接口的OLED,没有使用硬件IIC,这样便于移植相关的程序到其他的芯片上。

oled的资料就不再赘述了。
OLED和CW32F030CxTx的对应接口是PA3--SCL,PA4--SDA
使用宏定义,便于后期好修改IO口。
#define OLED_SCLK_Pin GPIO_PIN_3
#define OLED_SCLK_GPIO_Port CW_GPIOA
#define OLED_SDIN_Pin GPIO_PIN_4
#define OLED_SDIN_GPIO_Port CW_GPIOA


使用宏定义,确定SCL和SDA的IO操作。CW库里面直接给定义好了如何给IO置高或者置低。
cw32f030_gpio.h里面有所有的IO的操作。
#define OLED_SCLK_Clr() PA03_SETLOW()//SCL  拉低
#define OLED_SCLK_Set() PA03_SETHIGH()   //SCL  拉高

#define OLED_SDIN_Clr() PA04_SETLOW()//SDA  拉低
#define OLED_SDIN_Set() PA04_SETHIGH()  //SDA  拉高


初始化一下IO口。
GPIO_InitTypeDef GPIO_InitStructure;
            __RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStructure.Pins = OLED_SDIN_Pin|OLED_SCLK_Pin;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.IT = GPIO_IT_NONE;
        GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(OLED_SDIN_GPIO_Port, &GPIO_InitStructure);


其他的设置都是开发板默认的设置了。
OLED_Init();
    OLED_Clear();
    OLED_ShowStringCN(0,16,"芯源CW32 MCU ",1);
    OLED_ShowString(0,0,"bbs.21ic.com",16,1); //表示x=4,y=8开始显示字符串
    OLED_Refresh();

主要是介绍一下,如何将汉字和英文字符混合显示。
void OLED_ShowStringCN(uint8_t x,uint8_t y,uint8_t *chr,uint8_t mode)
{   unsigned short k,x0;
    unsigned char i,j;
    while(*chr) {
        if((*chr) < 128)
        {
            OLED_ShowChar(x,y,*chr,16,mode);
            x+=8;
            chr++;
        } else {

            for (k=0; k<hz16_num; k++)
            {
                if ((hz16[k].Index[0]==*(chr))&&(hz16[k].Index[1]==*(chr+1)))
                {
                    for(i=0; i<16; i++)
                    {
                        for(j=0; j<8; j++)
                        {
                            if(hz16[k].Msk[i*2]&(0x80>>j))        OLED_DrawPoint(x+j,y+i,mode);
                            else {
                                OLED_DrawPoint(x+j,y+i,!mode);;
                            }
                        }
                        for(j=0; j<8; j++)
                        {
                            if(hz16[k].Msk[i*2+1]&(0x80>>j))        OLED_DrawPoint(x+j+8,y+i,mode);
                            else
                            {
                                OLED_DrawPoint(x+j+8,y+i,!mode);;
                            }
                        }
                    }
                }
            }
            chr+=2;
            x+=16;
        }

    }
}


看看显示的效果怎么样?


已经实现了OLED的驱动,这里测试一下如何读取温湿度传感器DHT11。具体怎么读取温湿度这里就不再赘述了。
看看如何在程序里面实现吧。
首选是要定义使用的DHT11的IO口,使用的PA2.
  #define DHT11_IO_Pin GPIO_PIN_2
#define DHT11_IO_GPIO_Port CW_GPIOA
驱动端口,使用宏定义实现1或者0的输入,
//设置驱动IO端口
#define DHT11_DQ_OUT_1 PA02_SETHIGH();
#define DHT11_DQ_OUT_0 PA02_SETLOW();
#define DHT11_DQ_IN GPIO_ReadPin(DHT11_IO_GPIO_Port,DHT11_IO_Pin)
配置IO口为输入或者输出。这里使用的是库函数自带的宏定义。PA02_DIR_OUTPUT();这个可以直接实现,非常方便。
void DHT11_IO_OUT(void)
{
                PA02_DIR_OUTPUT();
}

void DHT11_IO_IN(void)
{
                PA02_DIR_INPUT() ;
}
这里重点说一下,延时1us,我没有修改systick的延时,直接使用的是for循环。
这里测试了一下,for循环10个数据正好1us。
void delayUs(uint32_t nus)
{
                uint32_t i;
i = nus * 10;
while(i--);
}

然后就是在main函数读取温湿度数据就行了。

        if(!dht11Read(&temperature, &humidity))//Read DHT11 Value
        {
            sprintf(s_temp,"温度:%02d'C",temperature);
            OLED_ShowStringCN(0,0,(unsigned char*)s_temp,1);// 显示温湿度
            sprintf(s_temp,"湿度:%02d%%  ",humidity);
            OLED_ShowStringCN(0,16,(unsigned char*)s_temp,1);// 显示温湿度
            OLED_Refresh();
        }
看看显示的效果。


源代码如下
BSP.rar (1.96 KB)

使用特权

评论回复
沙发
妇女半边天| | 2022-7-14 11:15 | 只看该作者
这么多评测,是有活动吗

使用特权

评论回复
板凳
huquanz711| | 2022-7-15 07:29 | 只看该作者
DHT11很经典的传感器啊

使用特权

评论回复
地板
duo点| | 2022-7-15 14:43 | 只看该作者
一楼的老铁有点后知后觉了,活动早就过了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9629

帖子

23

粉丝