OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3345|回复: 1

蓝桥杯学习之LED&KEY的基础配置

[复制链接]

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2020-10-6
在线时间
6 小时
发表于 2021-3-24 22:17:47 | 显示全部楼层 |阅读模式
8个LED(共阳极)74HC573锁存I/O的端口输出电平,想使LED灯亮的话需要先使能74HC573的使能端(高电平),然后使相应的I/O口为低电平。
LED1到LED8分别对应着PC8到PC15;NLE(74HC573使能端)对应着PD2;
当74HC573的使能端(NLE)为高电平时,可以对这些I/O口进行相应的设置,使LED做出相应的亮灭变化。然后将NLE变为低电平,这时这些I/O口的高低电平被锁存到74HC573中。LED等的亮灭情况也会暂时不会改变,直至NLE被使能和I/O端口的高低电平有变化。
I/O口的初始化步骤为:
void LED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;//1、定义GPIO初始化结构定义变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//2、初始化I/O口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED0|LED1|LED2|LED3|LED4|LED5|LED6|LED7;//3.LED引脚配置,PC08~PC15
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//74HC573锁存引脚配置,PD2
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
以下是端口定义
#define LED0    GPIO_Pin_8#define LED1    GPIO_Pin_9#define LED2    GPIO_Pin_10#define LED3    GPIO_Pin_11#define LED4    GPIO_Pin_12#define LED5    GPIO_Pin_13#define LED6    GPIO_Pin_14#define LED7    GPIO_Pin_15#define LEDALL  GPIO_Pin_AllLED灯控制函数为void LED_Control(uint16_t LED,uint8_t LED_Status){if(LED_Status == 0){    GPIO_SetBits(GPIOC,LED);    GPIO_SetBits(GPIOD,GPIO_Pin_2);     //高电平 灯灭    GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //状态锁存 }else{    GPIO_ResetBits(GPIOC,LED);    GPIO_SetBits(GPIOD,GPIO_Pin_2);    GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //状态锁存}}4个独立按键分别是B1-PA0;B2-PA8;B3-PB1;B4-PB2,必须注意输入模式为上拉输入,对应的GPIO口为低电平时表明按键按下。定义:#define RBl GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)#define RB2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)#define RB3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)#define RB4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)按键中断初始化为void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin = B1;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = B2;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = B3;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = B4;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_Init(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_Init(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_Init(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line2;EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;NVIC_Init(&NVIC_InitStructure);
}
中断函数中根据按键中断号设置相应的中断状态标记:
void EXTI0_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line0) != RESET)  {    state = 1;    EXTI_ClearITPendingBit(EXTI_Line0);  }}void EXTI1_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line1) != RESET)  {    state = 3;    EXTI_ClearITPendingBit(EXTI_Line1);  }}void EXTI2_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line2) != RESET)  {    state = 4;    EXTI_ClearITPendingBit(EXTI_Line2);  }}void EXTI9_5_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line8) != RESET)  {    state = 2;    EXTI_ClearITPendingBit(EXTI_Line8);  }}以上的函数设置均可在官方库文件中找到相应的参照GPIO设置可以在.\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle中找到参照中断(EXTI&NVIC)设置可以在.\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config中找到参照
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2020-10-6
在线时间
6 小时
 楼主| 发表于 2021-3-24 22:18:29 | 显示全部楼层
啊,排版没弄好,将就看吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 14:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表