- void KEY_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
-
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
-
-
- }
- void Hang_Output(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
-
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
-
- }
- void Hang_Input(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
-
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
-
- }
- void Lie_Input(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
- }
- void Lie_Output(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
- }
- unsigned char GetKey(void)
- {
-
- unsigned char keyvalue = 0;
- uint16_t hangvalue=0;
-
- // 第1回合第1步
- KEY_Init();
- delay_us(20);
- GPIO_ResetBits(GPIOE,GPIO_Pin_6); //PE.6,5,4,3 输出低
- GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);
-
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- if (hangvalue != 0x1f)// 从IO口输入,读IO口
- {
- // 读出的不是0x0f说明有按键被按下
- // 第1回合第2步:读出端口从读出值来判断是哪一行
- delay_ms(20);
- GPIO_ResetBits(GPIOE,GPIO_Pin_6); //PE.6,5,4,3 输出低
- GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- if (hangvalue != 0x1f)// 从IO口输入,读IO口
- {
- Hang_Output();
- Lie_Input();
- delay_us(20);
- // 第一回合中算出行号
- switch (hangvalue)
- {
- case 0x0F:
- keyvalue=4;
- break;
- case 0x17:
-
- keyvalue=5;
-
- break;
- case 0x1b:
- keyvalue=1;
- break;
- case 0x1d:
-
-
- keyvalue=2;
-
- break;
- case 0x1e:
-
-
- keyvalue=3;
-
- break;
-
- default: break;
-
- }
- Hang_Input();
- Lie_Output();
- delay_us(20);
- GPIO_ResetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
- GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- while (hangvalue != 0x1f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- }
- delay_ms(2);
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- while (hangvalue != 0x1f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- }
- return keyvalue;
- }
-
- }
- KEY_Init();
- delay_us(20);
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- if (hangvalue != 0x1f)// 从IO口输入,读IO口
- {
- // 读出的不是0x0f说明有按键被按下
- // 第1回合第2步:读出端口从读出值来判断是哪一行
- delay_ms(20);
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- if (hangvalue != 0x1f)// 从IO口输入,读IO口
- {
- Hang_Output();
- Lie_Input();
- delay_us(20);
- // 第一回合中算出行号
- switch (hangvalue)
- {
- case 0x0F:
-
-
-
- keyvalue=9;
-
- break;
- case 0x17:
-
-
- keyvalue=10;
-
- break;
- case 0x1b:
-
-
- keyvalue=6;
-
- break;
- case 0x1d:
-
-
- keyvalue=7;
-
- break;
- case 0x1e:
-
-
- keyvalue=8;
-
- break;
-
-
- default: break;
-
- }
- Hang_Input();
- Lie_Output();
- delay_us(20);
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- while (hangvalue != 0x1f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
- }
-
-
- return keyvalue;
- }
-
- }
- KEY_Init();
- delay_us(20);
-
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- if (hangvalue != 0x3f)// 从IO口输入,读IO口
- {
- // 读出的不是0x0f说明有按键被按下
- // 第1回合第2步:读出端口从读出值来判断是哪一行
- delay_ms(20);
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- if (hangvalue != 0x3f)// 从IO口输入,读IO口
- {
- Hang_Output();
- Lie_Input();
- delay_us(20);
- // 第一回合中算出行号
- switch (hangvalue)
- {
- case 0x1F:
-
-
-
- keyvalue=14;
-
- break;
- case 0x2F:
-
-
- keyvalue=15;
-
- break;
- case 0x37:
-
-
- keyvalue=16;
-
- break;
- case 0x3B:
-
-
- keyvalue=11;
-
- break;
- case 0x3D:
-
-
- keyvalue=12;
-
- break;
- case 0x3E:
-
-
- keyvalue=13;
-
- break;
- default: break;
-
- }
- Hang_Input();
- Lie_Output();
- delay_us(20);
-
- GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
-
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- while (hangvalue != 0x3f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- }
- delay_ms(2);
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- while (hangvalue != 0x3f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- }
- return keyvalue;
- }
-
- }
- KEY_Init();
- delay_us(20);
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
- GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- if (hangvalue != 0x3f)// 从IO口输入,读IO口
- {
- // 读出的不是0x0f说明有按键被按下
- // 第1回合第2步:读出端口从读出值来判断是哪一行
- delay_ms(20);
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
- GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- if (hangvalue != 0x3f)// 从IO口输入,读IO口
- {
- Hang_Output();
- Lie_Input();
- delay_us(20);
- // 第一回合中算出行号
- switch (hangvalue)
- {
- case 0x1F:
-
-
-
- keyvalue=20;
-
- break;
- case 0x2F:
-
-
- keyvalue=21;
-
- break;
- case 0x37:
-
-
- keyvalue=22;
-
- break;
- case 0x3B:
-
-
- keyvalue=17;
-
- break;
- case 0x3D:
-
- keyvalue=18;
-
- break;
- case 0x3E:
-
-
- keyvalue=19;
-
- break;
- default: break;
-
- }
- Hang_Input();
- Lie_Output();
- delay_us(20);
- GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
- GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
-
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- while (hangvalue != 0x3f)
- {
-
- hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
- }
-
- return keyvalue;
- }
-
- }
- return 0;
- }
输出模式都改成开漏了。大神帮我看看,那儿还有问题?谢谢!