STM32 - 키 제어 LED 램프
2869 단어 단편기
/*********************************************************
** FileName:
** Description:
,
CPU
** Author:
** Date: 2019/9/30
** Others:
*********************************************************/
#include "stm32f10x.h" //STM32
#include "stm32f10x_gpio.h"
#include "sys.h"
#define KEYPORT GPIOA
#define KEY1 GPIO_Pin_0
#define KEY2 GPIO_Pin_1
typedef enum {
KeyScanState_0=0x00,
KeyScanState_1=0x01,
KeyScanState_2=0x02,
}KeyScanState_Typedef;
KeyScanState_Typedef KeyScanState=KeyScanState_0;
vu32 flag=0;
void GPIO_Configuration(void);
void Systick_Configuration(void);
void keyscan(void);
int main (void){//
RCC_Configuration(); //
GPIO_Configuration();// GPIO
Systick_Configuration();
while(1)
{
keyscan();
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=KEY1|KEY2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(KEYPORT,&GPIO_InitStructure);
}
void Systick_Configuration(void)
{
SysTick_Config(9000000/1000*20);// 20ms
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
void keyscan()
{
vu16 KeyPortStatus=0;
if(flag==1)
{
flag=0;
KeyPortStatus=GPIO_ReadInputData(KEYPORT)&0x0003;
switch(KeyScanState)
{
case KeyScanState_0:
{
if(KeyPortStatus!=0x0003)//
{
KeyScanState=KeyScanState_1;
}
break;
}
case KeyScanState_1:
{
if(KeyPortStatus!=0x0003)//
{
if(GPIO_ReadInputDataBit(KEYPORT,KEY1)==0)// 1
{
GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)));
}
else if(GPIO_ReadInputDataBit(KEYPORT,KEY2)==0)// 2
{
GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)));
}
KeyScanState=KeyScanState_2;
}
else
{
KeyScanState=KeyScanState_0;
}
break;
}
case KeyScanState_2:
{
if(KeyPortStatus==0x0003)//
{
KeyScanState=KeyScanState_0;
}
break;
}
}
}
}
인터럽트 안에서 20ms씩 설정하고 flag를 한 번 부여하면 됩니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 출력 포인터 변수 주소(16진수)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.