jinglixixi_457498010

  • 4 主题
  • 4 帖子
  • 462 积分
  • 身份:LV2 初级技术员
  • E币:416

【大联大世平基于NXP传感器】 I/O口使用及OLED屏显示驱动

本帖最后由 jinglixixi_457498010 于 2021-9-15 02:08 编辑

上次存在的下载问题解决了,终于可以进行程序设计了!
这里的程序下载与以前的方式完成不一样,是使用纯指令来完成的,恍惚又会到了以往的DOS时代。
在程序编译后所生成的目标文件是BIN类型的,而非通常所生成的HEX文件。
程序下载是在DK6Programmer的控制下通过串口来实现的,下载前需使用cd指令来进入指定的目录,以led_blinky例程为例,则是在命令窗口键入"cd Documents\MCUXpressoIDE_11.4.0_6237\workspace\k32w061dk6_led_blinky"。随后,键入“DK6Programmer -l”指令以查看当前的串口号。其实这也大可必,因为通过设备管理器就可弄清开发板所占用的串口号。然后用 “DK6Programmer.exe-V5 -s ”+“串口号” -P 1000000 -pFLASH@0x00=” +“生成的bin文件路径”即可完成下载。
1.jpg
图1下载前
当然省事的办法就是直接将Debug文件夹的bin文件直接拖至“DK6Programmer.exe-V5 -s +“串口号”-P 1000000 -p FLASH@0x00=”之后,然后回车,随后再输入“Y”即可,见图2所示。
2.jpg
图2 完成下载
程序下载后,开发板就会自动加载运行程序。
这种下载方式还是比较适合连续调试,因为程序修改编译后,只需按一下“↑”键即可召回原来的指令予以执行。
对于I/O的使用,最好是由LED开启,在开发板上有2个LED,即红色的D4和绿色的D3,见图3所示。由于LED的一端已接GND,因此另一端提供高电平即可点亮。
3.jpg
图3 LED电路
在程序中,用函数GPIO_PortSet( )来点亮LED,用函数GPIO_PortClear ( )来点亮LED,要使LED闪烁,则用函数GPIO_PortToggle ( )。
4.jpg
图4 红灯的点亮与熄灭
对于2个LED该如何来控制它们呢?
那就是从引脚入手,要点亮红灯用GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << 0);
要点亮绿灯用GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u <<1);
5.jpg
图5点亮绿灯
有了前面的基础,我们就可以I/O来模拟I2C通讯以驱动OLED屏。
该显示屏为0.91寸的单色屏,尺寸规格为80*160像素点。
OLED屏与开发板的连接关系为:
SCL---PIO11
SDA---PIO10
这样设置的好处在于,利用Arduino接口来连接能省去连线的麻烦。
为输出高低电平,所进行的语句定义为:
#define OLED_SCLK_Set()  GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u << 11)
#define OLED_SDIN_Set()  GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u << 10)
OLED屏的初始化函数为:
  1. voidOLED_Init(void)
  2. {
  3. Write_IIC_Command(0xAE); //display off
  4. Write_IIC_Command(0x40);//--set start line address
  5. Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7
  6. Write_IIC_Command(0xc8);//Set COM Output Scan Direction
  7. Write_IIC_Command(0x81);//--set contrast control register
  8. Write_IIC_Command(0xff);
  9. Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
  10. Write_IIC_Command(0xa6);//--set normal display
  11. Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
  12. Write_IIC_Command(0x1F);
  13. Write_IIC_Command(0xd3);//-set display offset
  14. Write_IIC_Command(0x00);//-not offset
  15. Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
  16. Write_IIC_Command(0xf0);//--set divide ratio
  17. Write_IIC_Command(0xd9);//--set pre-charge period
  18. Write_IIC_Command(0x22);
  19. Write_IIC_Command(0xda);//--set com pins hardware configuration
  20. Write_IIC_Command(0x02);
  21. Write_IIC_Command(0x8d);//--set DC-DC enable
  22. Write_IIC_Command(0x14);
  23. Write_IIC_Command(0xdb);//--set vcomh
  24. Write_IIC_Command(0x49);//0x20,0.77xVcc
  25. Write_IIC_Command(0xaf);//--turn on oled panel
  26. }
字符显示函数为:
  1. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_tChar_Size)
  2. {
  3. unsignedchar c=0,i=0;
  4. c=chr-' ';
  5. if(x>Max_Column-1)
  6. {
  7. x=0;
  8. y=y+2;
  9. }
  10. if(Char_Size ==16)
  11. {
  12. OLED_Set_Pos(x,y);
  13. for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  14. OLED_Set_Pos(x,y+1);
  15. for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  16. }
  17. }
字符串显示函数为:
  1. voidOLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_tChar_Size)
  2. {
  3. unsignedchar j=0;
  4. while (chr[j]!='\0')
  5. {
  6. OLED_ShowChar(x,y,chr[j],Char_Size);
  7. x+=8;
  8. if(x>120)
  9. {
  10. x=0;
  11. y+=2;
  12. }
  13. j++;
  14. }

  15. }
实现图6所示效果的主程序为:
  1. int main(void)
  2. {
  3. /* Define the init structure for the output LED pin*/
  4. gpio_pin_config_tled_config = {
  5. kGPIO_DigitalOutput,
  6. 1,
  7. };
  8. /* Board pin init */
  9. /* Security code to allow debug access */
  10. SYSCON->CODESECURITYPROT = 0x87654320;
  11. RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);
  12. RESET_PeripheralReset(kGPIO0_RST_SHIFT_RSTn);
  13. BOARD_BootClockRUN();
  14. BOARD_InitDebugConsole();
  15. BOARD_InitPins();
  16. /* Init output LED GPIO. */
  17. GPIO_PortInit(GPIO, BOARD_LED_PORT);
  18. //GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN, &led_config);
  19. GPIO_PinInit(GPIO, BOARD_LED_PORT, 1, &led_config);
  20. GPIO_PinInit(GPIO, BOARD_LED_PORT, 0, &led_config);
  21. GPIO_PinInit(GPIO, BOARD_LED_PORT, 11, &led_config);
  22. GPIO_PinInit(GPIO, BOARD_LED_PORT, 10, &led_config);
  23. /* Set systick reload value to generate 1ms interrupt */
  24. if (SysTick_Config(SystemCoreClock / 1000U))
  25. {
  26. while (1)
  27. {
  28. }
  29. }
  30. GPIO_PortClear(GPIO, BOARD_LED_PORT, 1u << 0);  // OFF
  31. GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << 1);     //  ON
  32. OLED_Init();
  33. OLED_Clear();
  34. OLED_ShowString(0,0,"K32W061 TEST",16);
  35. OLED_ShowString(0,2,"OLED DISPLAY",16);
  36. while (1)
  37. {
  38. /* Delay 1000 ms */
  39. SysTick_DelayTicks(1000U);
  40. GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << 1);
  41. }
6.jpg
图6 显示效果
有了OLED屏的显示功能,后面再有显示任务就交它好了!
红.gif
绿.gif

您需要登录后才可以评论 登录 | 立即注册

最新评论

楼层直达:
快速回复
0
1
广告
关闭 热点推荐上一条 /3 下一条
快速回复 返回列表