那些年踩过的坑……
本次记录一下关于锁存器的使用
这里用到一个概念:总线!!
什么是总线?
总线是指一条线上存在多个设备,但是每次只会让一个设备工作的线路!!!
(这里划重点,一定要牢记,这里很容易出错,比如我,在这栽过两次了)
很容易把总线的定义违反,弄成了一条线有多个设备工作,导致运行结果出错emmm。
B站讲解视频:视频链接:
https://www.bilibili.com/video/BV1EC4y1x74M#reply2722427573
题目描述:要用一个按钮和四个LED。进行用户按下几次按钮LED就显示多少的操作。因为是4个LED。所以数字显示成2进制的形式,比如:用户按钮按了9次,LED对应需要显示1001,对应的就是亮,灭,亮,灭。
当用户按下按钮16次时,LED显示为0000,即灭灭灭灭。如此循环的过程。
本次要求需要使用到三态门,锁存器,LED
Proteus的电路图如下:
其中PB0充当总线,使用的是STM32F103R6,使用的锁存器是74LS75.
这里主要看一下这个锁存器的使用:D0,D1,D2,D3是输入,Q0~Q3是输出,输出有八个接口,其余四个是Q0 ~ Q3的非,就是相反的。E0/1是控制D0,D1输出是否有效的使能端,为高时有效,为低时无效。E2/3时控制D2,D3输出是否有效的使能端。同理为高有效,为低无效。
效果实现:
这里只列出循环主体:
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 */
}