#include <STM32f10x.h> #include <delay.h> #include <stdio.h> uint8_t key,k=-1; void usart_configuration(void) { USART_InitTypeDef usart1_init; GPIO_InitTypeDef io; RCC_APB2PeriphclockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE); USART_DeInit(USART1); //USART1_RX PA.9 io.GPIO_Pin = GPIO_Pin_9; //PA.9 io.GPIO_Speed = GPIO_Speed_50MHz; io.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &io); //初始化PA9 //USART1_RX PA.10 io.GPIO_Pin = GPIO_Pin_10;//PA.10 io.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &io); //初始化PA10 usart1_init.USART_BaudRate=9600; usart1_init.USART_WordLength=USART_WordLength_8b; usart1_init.USART_StopBits=USART_StopBits_1; usart1_init.USART_Parity=USART_Parity_No; usart1_init.USART_HardwareFlowControl=USART_HardwareFlowControl_None; usart1_init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART1,&usart1_init); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1,ENABLE); USART_CleaRFlag(USART1,USART_FLAG_TC); } void NVIC_configuration(void) { NVIC_InitTypeDef nvic_init; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); nvic_init.NVIC_IRQChannel=USART1_IRQn; nvic_init.NVIC_IRQChannelPreemptionPriority = 0; nvic_init.NVIC_IRQChannelSubPriority = 1; nvic_init.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic_init); } void key_Init1(void) { GPIO_InitTypeDef io; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOC的时钟 io.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出 io.GPIO_Speed=GPIO_Speed_50MHz; io.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3; GPIO_Init(GPIOB,&io); io.GPIO_Mode=GPIO_Mode_IPD; io.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15; GPIO_Init(GPIOB,&io); GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3); } void key_Init2(void) { GPIO_InitTypeDef io; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOC的时钟 io.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出 io.GPIO_Speed=GPIO_Speed_50MHz; io.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15; GPIO_Init(GPIOB,&io); io.GPIO_Mode=GPIO_Mode_IPD; io.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3; GPIO_Init(GPIOB,&io); GPIO_SetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15); } uint8_t key_Scan(void) { uint8_t i; key_Init1(); for(i=0;i<4;i++) switch(i) { case 0:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1) { key_Init2(); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return '*'; if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'D'; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return '#'; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 0; } break; case 1:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1) { key_Init2(); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'C'; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 9; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 8; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 7; } break; case 2:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1) { key_Init2(); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'B'; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 6; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 5; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 4; } break; case 3:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1) { key_Init2(); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'A'; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 3; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 2; else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 1; } break; } return k; //return 0;//用于松手检测 } int main() { delay_init(); NVIC_configuration(); usart_configuration(); while(1) { key=key_Scan(); if(key!=k){ if(key=='A') { printf("A"); } if(key=='B') { printf("B"); } if(key=='C') { printf("C"); } if(key=='D') { printf("D"); } if(key=='*') { printf("*"); } if(key=='#') { printf("#"); } if(key!='A'||key!='B'||key!='C'||key!='D'||key!='*'||key!='#'){ printf("%d\n",key); } delay_ms(300); key=k; } } }
|