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中找到参照
|