2503|2

1455

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【AT-START-F425测评】GPIO口的使用及OLED屏显示驱动 [复制链接]

  本帖最后由 jinglixixi 于 2022-3-30 09:27 编辑

在AT-START-F425的开发板上,有3个LED和1个用户键,其原理图见图1所示。

    

图1 LED与KEY电路

通过例程led_toggle,可以作为GPIO的输出功能,那该如何使用GPIO口的输入功能来实现KEY控制LED呢?

其程序如下:

int main(void)
{
  system_clock_config();
  at32_board_init();
  at32_button_init();
  while(1)
  {
       if(at32_button_state())
              at32_led_off(LED2);
       else
              at32_led_on(LED2);
       delay_ms(200);
  }
}

也就是说,使用函数at32_button_init()就能将按键所连接的引脚设为输入功能,而使用函数at32_button_state()就能读取按键的状态,从而就可控制LED的亮灭。

所用的函数at32_button_init()和t at32_button_state(),其内容如下:

void at32_button_init(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(USER_BUTTON_CRM_CLK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = USER_BUTTON_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
  gpio_init(USER_BUTTON_PORT, &gpio_init_struct);
}

uint8_t at32_button_state(void)
{
     return gpio_input_data_bit_read(USER_BUTTON_PORT, USER_BUTTON_PIN);
}

 

这样就实现了以KEY控制LED的目的,并掌握了GPIO口的输入输出功能及使用。

 

在此基础上,若以GPIO来模拟I2C驱动OLED屏则是一件很简单的事。

实现要做的就是确定OLED屏所要连接的引脚,为了使用的方便就选取Arduino接口的PA5和PA6,

其中PA5接SCL,PA6接SDA。

 

图2  Arduino接口

 

接下来是设置输出高低电平的定义,其内容如下:

#define OLED_SCLK_Clr()  GPIOA->clr = GPIO_PINS_5

#define OLED_SCLK_Set()  GPIOA->scr = GPIO_PINS_5

#define OLED_SDIN_Clr()  GPIOA->clr = GPIO_PINS_6

#define OLED_SDIN_Set()  GPIOA->scr = GPIO_PINS_6

随后是对相关引脚的功能设置,其函数内容如下:

void app_oled_init(void)
{
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
}

 

OLED屏的初始化函数为:

void OLED_Init(void)
{
Write_IIC_Command(0xAE);
Write_IIC_Command(0x20);
Write_IIC_Command(0x10);
Write_IIC_Command(0xb0);
Write_IIC_Command(0xc8);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
Write_IIC_Command(0x40);
Write_IIC_Command(0x81);
Write_IIC_Command(0xdf);
Write_IIC_Command(0xa1);
Write_IIC_Command(0xa6);
Write_IIC_Command(0xa8);
Write_IIC_Command(0x3F);
Write_IIC_Command(0xa4);
Write_IIC_Command(0xd3);
Write_IIC_Command(0x00);
Write_IIC_Command(0xd5);
Write_IIC_Command(0xf0);
Write_IIC_Command(0xd9);
Write_IIC_Command(0x22);
Write_IIC_Command(0xda);
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb);
Write_IIC_Command(0x20);
Write_IIC_Command(0x8d);
Write_IIC_Command(0x14);
Write_IIC_Command(0xaf);
}

实现图3所示效果的主程序为:

int main(void)
{
system_clock_config();
at32_board_init();
app_oled_init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F425",16);
OLED_ShowString(0,2,"OLED TEST",16);
OLED_ShowString(8,4,"jinglixixi",16);
while(1)
{
at32_led_toggle(LED2);
delay_ms(200);
at32_led_toggle(LED3);
delay_ms(200);
at32_led_toggle(LED4);
delay_ms(200);
}
}

图3显示效果

 

为便于大家使用,其工程文件为:

 

oled96.zip

1.54 MB, 下载次数: 3

最新回复

感谢分享,非常给力,兄弟进度很快,学习你的经验,期待后续更精彩的作品  详情 回复 发表于 2022-3-30 12:56
点赞 关注
 
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 
感谢分享,非常给力,兄弟进度很快,学习你的经验,期待后续更精彩的作品
 
 
 

回复

1455

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
lugl4313820 发表于 2022-3-30 12:56 感谢分享,非常给力,兄弟进度很快,学习你的经验,期待后续更精彩的作品

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表