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的电路图如下:

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

效果实现:

Proteus+Keil+STM32+锁存器的使用_第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 */
  }

你可能感兴趣的:(STM32)