本帖最后由 jinglixixi 于 2019-12-7 09:02 编辑
在OLED屏的显示中,是使用GPIO口来模拟I2C通讯以驱动OLED屏进行显示。 此外,使用GPIO口与延时程序相配合还能驱动单总线器件来工作,如DHT11这类的单总线器件,其使用效果如图所示。 在这当中延时程序的作用比较关键,微秒级的延时程序为: - void Delay_us(unsigned int us)
- {
- unsigned int a;
- while(us)
- {
- a=12;
- while(a--)
- { __asm("NOP");}
- us--;
- }
- }
复制代码 毫秒级的延时程序为: - void delay_1ms(unsigned int ms)
- {
- while(ms)
- {
- Delay_us(1000);
- ms--;
- }
- return;
- }
复制代码
由于没有示波器之类的工具验证,延时值不很精确,期待有此类工具者能对其加以修正。 另外,与驱动OLED屏不同的是,驱动OLED屏只控制GPIO输出信号;而单总线的信号是双向的,需要在使用过程中对信号传送方向进行切换。 对DHT11数据引脚的定义如下: #define DHT11_Port 1 #define DHT11_Pin 14U #define DHT11_DQ_OUT GPIO->B[DHT11_Port][DHT11_Pin] #define DHT11_DQ_IN GPIO_PinRead(GPIO,DHT11_Port,DHT11_Pin) 相应的DHT11的初始化函数为: - uint8_t DHT11_Init(void)
- {
- GPIO->DIR[DHT11_Port] |= 1U << DHT11_Pin;
- GPIO->B[DHT11_Port][DHT11_Pin];
- DHT11_Rst();
- return DHT11_Check();
- }
复制代码
读取DHT11温湿度值得函数为: - uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
- {
- uint8_t buf[5];
- uint8_t i;
- DHT11_Rst();
- if(DHT11_Check()==0)
- {
- for(i=0;i<5;i++)
- {
- buf[i]=DHT11_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=buf[0];
- *temp=buf[2];
- }
- }else return 1;
- return 0;
- }
复制代码
显示DHT11温湿度的主程序为: - int main(void)
- {
- uint8_t temp;
- uint8_t humi;
-
- /* Board pin, clock, debug console init */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- /* enable clock for GPIO*/
- CLOCK_EnableClock(kCLOCK_Gpio0);
- CLOCK_EnableClock(kCLOCK_Gpio1);
-
- BOARD_InitPins();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
- OLED_Init();
- OLED_Clear();
- while (1)
- {
- OLED_ShowString(0,2,"Temperate:",16);
- OLED_ShowString(0,4,"Humidity:",16);
- DHT11_Read_Data(&temp,&humi);
- OLED_ShowNum(88,2,temp,3,16);
- OLED_ShowNum(88,4,humi,3,16);
- delay_1ms(2000);
- }
- }
复制代码
|