历史上的今天
今天是:2025年01月14日(星期二)
2019年01月14日 | STM32矩阵键盘输入通过串口三输出
2019-01-14 来源:eefocus
配置矩阵键盘输入
//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);
}
}
}
史海拾趣
|
我想用2806的SPI的功能,但我只想用到B组SPICLKB,SPISOMIB,SPISETB,而SPISIMOB我想用作普通的IO口,这样可以吗?谢谢各位了,(第一次用DSP)… 查看全部问答> |
|
有天,一个新工程师问我,做好产品开发最重要的是什么? 这个问题把我问住了,想了好一会,才回答说: 第一:千万不要相信经验,不是因为你的经验不够丰富,而是你面临的问题不可能和经验完全一样,经验还要经过实 ...… 查看全部问答> |
|
关于DSP2812Mv2的板子上的CY7C37064VP100 看见DSP2812Mv2的板子上的CY7C37064VP100对CS8900的地址线译码了, 但是你们板子上配套的例程上面只有关于CS8900 I/O模式操作的实验,开发中却想用8900的menory模式操作! 但是控制menory模式的MEMR,ME ...… 查看全部问答> |




