本帖最后由 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)
|