Proteus+Keil+STM32+锁存器的使用

Proteus+Keil+STM32+锁存器的使用

那些年踩过的坑……
本次记录一下关于锁存器的使用

这里用到一个概念:总线!!
什么是总线?
总线是指一条线上存在多个设备,但是每次只会让一个设备工作的线路!!!
(这里划重点,一定要牢记,这里很容易出错,比如我,在这栽过两次了)
很容易把总线的定义违反,弄成了一条线有多个设备工作,导致运行结果出错emmm。

B站讲解视频:视频链接:
https://www.bilibili.com/video/BV1EC4y1x74M#reply2722427573

题目描述:要用一个按钮和四个LED。进行用户按下几次按钮LED就显示多少的操作。因为是4个LED。所以数字显示成2进制的形式,比如:用户按钮按了9次,LED对应需要显示1001,对应的就是亮,灭,亮,灭。
当用户按下按钮16次时,LED显示为0000,即灭灭灭灭。如此循环的过程。
本次要求需要使用到三态门,锁存器,LED

  • 什么是锁存器?
    我的理解就是当你改变了当前状态,但是你又希望保持上个状态不变,我们就可以用锁存器锁住上个状态的。
    这就是锁存器的使用。

Proteus的电路图如下:

1
其中PB0充当总线,使用的是STM32F103R6,使用的锁存器是74LS75.
2
这里主要看一下这个锁存器的使用:D0,D1,D2,D3是输入,Q0~Q3是输出,输出有八个接口,其余四个是Q0 ~ Q3的非,就是相反的。E0/1是控制D0,D1输出是否有效的使能端,为高时有效,为低时无效。E2/3时控制D2,D3输出是否有效的使能端。同理为高有效,为低无效。

效果实现:

3
实现上述效果的代码附上:

这里只列出循环主体:

int flag = 1;
	int cnt = 0;
	int a[5] = {0, GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3};
	int b[20] = {0, a[1], a[2], a[1] | a[2], a[3], a[3] | a[1], a[3] | a[2], a[3] | a[2] | a[1], a[4], a[4] | a[1], a[4] | a[2], a[4] | a[2] | a[1], a[4] | a[3], a[4] | a[3] | a[1], a[4] | a[3] | a[2], a[4] | a[3] | a[2] | a[1]};
	HAL_GPIO_WritePin(GPIOB, a[1] | a[2] | a[3] | a[4], 0);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, 1);
  while (1)
  {
    /* USER CODE END WHILE */
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 1);
		GPIO_InitTypeDef GPIO_InitStruct = {0};
		//input
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
		/*Configure GPIO pin : PB0 */
		GPIO_InitStruct.Pin = GPIO_PIN_0;
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
		if (1 == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0))
		{
			flag = 0;
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1, 0);
		}
		if (!flag && 0 == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0))
		{
			flag = 1;
			GPIO_InitTypeDef GPIO_InitStruct = {0};
			//output
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
			/*Configure GPIO pins : PB0*/
			GPIO_InitStruct.Pin = GPIO_PIN_0;
			GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
			GPIO_InitStruct.Pull = GPIO_NOPULL;
			GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
			HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
			
			cnt++;
			if (cnt >= 16)
			{
				cnt = 0;
			}
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 0);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1, 1);
			HAL_GPIO_WritePin(GPIOB, b[15 - cnt], 0);
			HAL_GPIO_WritePin(GPIOB, b[cnt], 1);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1, 0);
		}
    /* USER CODE BEGIN 3 */
  }
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃酱斯密酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值