[AT32F407] 【AT-START-F407测评】+驱动SSD1315的OLED显示屏

[复制链接]
3178|6
 楼主| gaoyang9992006 发表于 2021-1-29 12:02 | 显示全部楼层 |阅读模式
https://bbs.21ic.com/icview-3068602-1-1.html
接上次的串口例子,增加了新的代码
该OLED是用的I2C端口,一共4根线,本次VCC和GND利用开发板上提供的3.3V供电端口供电
I2C的SCL与SDA分别接开发板的PA4与PA6端口。
液晶屏手里有的通用代码是用GPIO模拟的I2C时序,本次不再修改,仅对端口的驱动进行移植。
为了使用I2C,因此IO端口模式应设置为开漏模式,先启用端口的时钟,然后配置两个IO为开漏模式即可,如下
  1. //OLED管脚初始化
  2.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
  3.         GPIO_StructInit(&GPIO_InitStructure);
  4.         GPIO_InitStructure.GPIO_Pins =GPIO_Pins_4|GPIO_Pins_6;
  5.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_OD;
  6.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;       
  7.         GPIO_Init(GPIOA,&GPIO_InitStructure);
然后将OLED基本的拉高拉低操作映射到这两个端口,通过宏定义实现,如下
  1. //-----------------OLED端口定义----------------

  2. #define OLED_SCL_Clr() GPIO_ResetBits(GPIOA,GPIO_Pins_4)
  3. #define OLED_SCL_Set() GPIO_SetBits(GPIOA,GPIO_Pins_4)

  4. #define OLED_SDA_Clr() GPIO_ResetBits(GPIOA,GPIO_Pins_6)
  5. #define OLED_SDA_Set() GPIO_SetBits(GPIOA,GPIO_Pins_6)


接下来就是直接使用OLED的库函数点亮屏幕,显示字符了
整个main.c内容如下
  1. #include "at32f4xx_gpio.h"
  2. #include "at32f4xx_usart.h"
  3. #include "oled.h"

  4. /*delay variable*/
  5. static __IO uint32_t fac_us;
  6. static __IO uint32_t fac_ms;
  7. /*delay macros*/
  8. #define STEP_DELAY_MS        50
  9. void Delay_init()
  10. {
  11.   /*Config Systick*/
  12.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  13.   fac_us = SystemCoreClock / (1000000U);
  14.   fac_ms = fac_us * (1000U);
  15. }

  16. void Delay_ms(u16 nms)
  17. {
  18.   u32 temp;
  19.   while(nms)
  20.   {
  21.     if(nms > STEP_DELAY_MS)
  22.     {
  23.       SysTick->LOAD = (u32)(STEP_DELAY_MS * fac_ms);
  24.       nms -= STEP_DELAY_MS;
  25.     }
  26.     else
  27.     {
  28.       SysTick->LOAD = (u32)(nms * fac_ms);
  29.       nms = 0;
  30.     }
  31.     SysTick->VAL = 0x00;
  32.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  33.     do
  34.     {
  35.       temp = SysTick->CTRL;
  36.     }while( (temp & 0x01) && !(temp & (1<<16)) );

  37.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  38.     SysTick->VAL = 0X00;
  39.   }
  40. }
  41. //串口初始化,根据原理图使用的是USART1,PA9为TX,PA10为RX
  42. void UART1_Init(uint32_t bound)
  43. {
  44.   GPIO_InitType GPIO_InitStructure;
  45.   USART_InitType USART_InitStructure;
  46.        
  47.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA,ENABLE);
  48.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1,ENABLE);
  49.   /* Configure the UART1 TX pin */
  50.   GPIO_StructInit(&GPIO_InitStructure);
  51.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
  52.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  53.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  54.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  55.        
  56.           /*Configure UART param*/
  57.   USART_StructInit(&USART_InitStructure);
  58.   USART_InitStructure.USART_BaudRate = bound;
  59.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  60.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  61.   USART_InitStructure.USART_Parity = USART_Parity_No;
  62.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  63.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       

  64.   USART_Init(USART1, &USART_InitStructure);
  65.   USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
  66.   USART_Cmd(USART1, ENABLE);  
  67. }

  68. int main(void)
  69. {
  70.         int i;
  71.        
  72.         //LED2管脚初始化
  73.         GPIO_InitType GPIO_InitStructure;
  74.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD, ENABLE);
  75.         GPIO_StructInit(&GPIO_InitStructure);
  76.         GPIO_InitStructure.GPIO_Pins =GPIO_Pins_13;
  77.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  78.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;       
  79.         GPIO_Init(GPIOD,&GPIO_InitStructure);

  80.         //OLED管脚初始化
  81.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
  82.         GPIO_StructInit(&GPIO_InitStructure);
  83.         GPIO_InitStructure.GPIO_Pins =GPIO_Pins_4|GPIO_Pins_6;
  84.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_OD;
  85.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;       
  86.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  87.        
  88.         Delay_init();
  89.         UART1_Init(115200);
  90.        
  91.         OLED_Init();//初始化OLED
  92.         OLED_ColorTurn(0);//0正常显示,1 反色显示
  93.         OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  94.        
  95.         while(1)
  96.         {
  97.                 GPIO_SetBits(GPIOD,GPIO_Pins_13);
  98.                 Delay_ms(200);
  99.                 GPIO_ResetBits(GPIOD,GPIO_Pins_13);               
  100.                 Delay_ms(200);
  101.                 USART_SendData(USART1,'A');
  102.                
  103.                 for(i=0;i<8;i++)
  104.                         OLED_ShowChinese(i*16,2,i,16);
  105.                 for(i=0;i<3;i++)
  106.                         OLED_ShowChinese(i*16,4,i+8,16);
  107.                         i=48;
  108.                   OLED_ShowChar(i,4,'A',16);
  109.                         i=i+8;
  110.       OLED_ShowChar(i,4,'T',16);
  111.                         i=i+8;
  112.       OLED_ShowChar(i,4,'3',16);
  113.                         i=i+8;
  114.       OLED_ShowChar(i,4,'2',16);
  115.                         i=i+8;
  116.       OLED_ShowChar(i,4,'F',16);
  117.                         i=i+8;
  118.       OLED_ShowChar(i,4,'4',16);
  119.                         i=i+8;
  120.       OLED_ShowChar(i,4,'0',16);
  121.                         i=i+8;
  122.       OLED_ShowChar(i,4,'7',16);                       
  123.         }
  124. }
编译烧录后效果如下所示
57172601388e709a8d.png
 楼主| gaoyang9992006 发表于 2021-1-29 13:27 | 显示全部楼层
补上项目工程,希望对用这个0.96寸)OLED显示屏的朋友有所帮助。
DEMO.zip (12.9 MB, 下载次数: 152)

评论

@strang :haha,能帮到你,真是很高兴。  发表于 2021-1-30 19:08
高博士,太快了。用了你的工程模板,我也把OLED屏电亮了。  发表于 2021-1-30 18:42
小明的同学 发表于 2021-3-1 19:15 | 显示全部楼层
听说都是用你的工程搞的OLED。
yangxiaor520 发表于 2021-3-1 20:45 来自手机 | 显示全部楼层
不错,感谢楼主分享。
xinpian101 发表于 2021-5-19 19:34 | 显示全部楼层
分享的不错,学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部