stm32单片机引脚_单片机IO口不够用了,怎么办?

这几天公子比较闲,像看看手上有没有好玩的模块,于是,公子找到了一款OV系列的摄像头,于是翻了一下自己的2年都没有打开的盒子(公子专门来放开发板的)。可是找了半天,都没有找到开发板,费了九牛二虎之力,才找到一块STM32F103C8T6的,长这个样子,可是引脚不够呀!没关系,现在公子告诉大家该怎么解决。

540b627b30dd47c18ef0a9d36b8ca6e2.png

1 IO口扩展:

扩展的方法很多,锁存器;输出串并转换/输入并串转换;I²C总线等等……

不过公子一般都是喜欢采用138或者164来扩展的,以138为例,电路图如下:

d8be9e0ea12523624a4c4b0f74754283.png

这款芯片的作用是把串行输入的数据并行输出。注意,它没有锁存功能,在允许输出的情况下,每一个时钟的上升沿,数据依次从最低位移向最高位。因此,在做数码管的输出显示的时候会出现拖影的想象,下面我们再看看它的真值表,有了真值表我们才知道如何正确的去编写程序去驱动它(其它复杂的器件还需要对照时序图编

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32单片机的3个IO控制6个LED灯的程序示例,使用了第一种方式,即使用74HC238译码器: ```c #include "stm32f10x.h" #define LED_PORT GPIOA #define ADDR_PORT GPIOB void GPIO_Config(void); void delay(uint32_t count); int main(void) { GPIO_Config(); while (1) { // 点亮第1个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_0); GPIO_Write(LED_PORT, GPIO_Pin_0, GPIO_Pin_0); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_0, GPIO_Pin_RESET); // 点亮第2个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_1); GPIO_Write(LED_PORT, GPIO_Pin_1, GPIO_Pin_1); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_1, GPIO_Pin_RESET); // 点亮第3个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_2); GPIO_Write(LED_PORT, GPIO_Pin_2, GPIO_Pin_2); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_2, GPIO_Pin_RESET); // 点亮第4个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_0); GPIO_Write(LED_PORT, GPIO_Pin_3, GPIO_Pin_3); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_3, GPIO_Pin_RESET); // 点亮第5个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_1); GPIO_Write(LED_PORT, GPIO_Pin_4, GPIO_Pin_4); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_4, GPIO_Pin_RESET); // 点亮第6个LED灯 GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_2); GPIO_Write(LED_PORT, GPIO_Pin_5, GPIO_Pin_5); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_5, GPIO_Pin_RESET); } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置LED引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); // 配置地址引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ADDR_PORT, &GPIO_InitStructure); } void delay(uint32_t count) { for(uint32_t i = 0; i < count; i++); } ``` 需要注意的是,此程序只是一个示例,具体的引脚配置和控制方式需要根据实际情况进行修改。同时,需要根据实际使用的译码器型号,确定地址引脚的数量和连接方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值