- #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, 下载次数: 4)