#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;
}
}
}