×
单片机 > 单片机程序设计 > 详情

STM32矩阵键盘输入通过串口三输出

发布时间:2020-08-26 发布时间:
|

配置矩阵键盘输入


//PA0~PA3为推挽式输出

//PA4~PA7为上拉输入

//PA9->RXD  PA10->TXD

 

void  KEY44_Init(void)

{

//PA0~PA3为推挽式输出

 

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);


//PA4~PA7为上拉输入

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5  |GPIO_Pin_6 |GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

 

unsigned char key44_Scan(void)

{

H_1 = 0;

H_2 = 1;

H_3 = 1;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 1;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 2;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 3;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 4;

}

}

 

H_1 = 1;

H_2 = 0;

H_3 = 1;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 5;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 6;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 7;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 8;

}

}

 

H_1 = 1;

H_2 = 1;

H_3 = 0;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 9;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 10;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 11;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 12;

}

}

 

H_1 = 1;

H_2 = 1;

H_3 = 1;

H_4 = 0;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 13;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 14;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 15;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 16;

}

}

return 0;

}

配置USART3


void USART3_Init(u32 bound)

{

// PB10 & PB11

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;


//开启GPIOB 和 复用功能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

//开启USART3的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);


//PB10 ->Tx 配置为复用推挽式输出 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);


//PB11 ->Rx 配置为浮空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

//配置串口

USART_InitStructure.USART_BaudRate = bound;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

USART_Init(USART3, &USART_InitStructure);

 

USART_Cmd(USART3,ENABLE);


USART_GetFlagStatus(USART3,USART_FLAG_TC);//防止第一个字符被吞

}


主函数


u8  key_num = 0;

 

u8 i = 0;

 

int main(void)

KEY44_Init();

delay_init();

USART3_Init(115200);

while(1)

{

key_num = key44_Scan(); 

if(key_num != 0)

{

USART_SendData(USART3,key_num);

while(USART_GetFlagStatus(USART3,USART_FLAG_TC) == 0);

 

}

}

}


关键字:STM32  矩阵键盘输入  串口

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式