各位大神,原子哥,帮我看看这个程序哪里有问题,运行是没有错误的,仿真调试时主函数stmark变量一直是13,也就是mark一直13,按键按下,LED0没反应,求解惑
主函数
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
//void keyboard_scan();
int main(void)
{
// u8 t=0;
u8 stmark=0; u8 mark=0;
delay_init();
LED_Init();
// KEY_Init();
NVIC_Configuration();
uart_init(9600);
LED0=0;
keyboard_init();
while(1)
{
stmark=update_key();
if(stmark!=0)mark=stmark;
if(mark==1)
{
LED0=1;
}
KEY函数
#include "key.h"
#include "delay.h"
struct io_port
{
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
static struct io_port key_output[4] = {
{GPIOA, GPIO_Pin_15}, {GPIOA, GPIO_Pin_14},
{GPIOA, GPIO_Pin_13}, {GPIOA, GPIO_Pin_12}
};
static struct io_port key_input[4] = {
{GPIOC, GPIO_Pin_4}, {GPIOC, GPIO_Pin_5},
{GPIOC, GPIO_Pin_11}, {GPIOC, GPIO_Pin_12}
};
unsigned char key[4][4];
void keyboard_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char i;
//输入
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //
GPIO_Init(GPIOA, &GPIO_InitStructure);
for(i = 0; i < 4; i++)
{
GPIO_SetBits(key_output
.GPIO_x, key_output.GPIO_pin);
}
}
u8 update_key(void)
{
unsigned char i, j;
for(i = 0; i < 4; i++)
{
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
for(j = 0; j < 4; j++)
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
{
key[j] = 1;
}else{
key[j] = 0;
}
}
GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
if(key[0][0]==1)return 13;
if(key[0][1]==1)return 14;
if(key[0][2]==1)return 15;
if(key[0][3]==1)return 16;
if(key[1][0]==1)return 9;
if(key[1][1]==1)return 10;
if(key[1][2]==1)return 11;
if(key[1][3]==1)return 12;
if(key[2][0]==1)return 5;
if(key[2][1]==1)return 6;
if(key[2][2]==1)return 7;
if(key[2][3]==1)return 8;
if(key[3][0]==1)return 1;
if(key[3][1]==1)return 2;
if(key[3][2]==1)return 3;
if(key[3][3]==1)return 4;
}
应该用:RCC_APB2PeriphClockCmd才对 啊!!!!
如果是STM32F103X的芯片如下才是正确的:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
你连时钟都没有开启。我已经彻底无语了。你对stm32芯片的时钟不太了解吧。………………
GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
从你的代码上看的话,应该是 GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
才对.
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
{
key[i][j] = 1;
}else{
key[i][j] = 0;
}
相信你已经看明白了.哪里错了...
#include "key.h"
#include "delay.h"
struct io_port
{
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
static struct io_port key_output[4] = {
{GPIOA, GPIO_Pin_15}, {GPIOA, GPIO_Pin_14},
{GPIOA, GPIO_Pin_13}, {GPIOA, GPIO_Pin_12}
};
static struct io_port key_input[4] = {
{GPIOC, GPIO_Pin_4}, {GPIOC, GPIO_Pin_5},
{GPIOC, GPIO_Pin_11}, {GPIOC, GPIO_Pin_12}
};
unsigned char key[4][4];
void keyboard_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char i;
/* ¼üÅìDDé¨Ãèêä3öÏß êä3ö¸ßμçƽ */
/* PA0 PA1 PA2 PA3 êäèë*/
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //ê1ÄüPB,PC¶Ë¿úê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* ¼üÅìáDé¨ÃèêäèëÏß ¼ü±»°′ê±êäèë¸ßμçƽ ·Å¿aêäèëμíμçƽ */
/* PA4 PA5 PA6 PA7 êä3ö*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //
GPIO_Init(GPIOA, &GPIO_InitStructure);
for(i = 0; i < 4; i++)
{
GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
}
}
u8 update_key(void)
{
unsigned char i, j;
for(i = 0; i < 4; i++) //iêÇêä3ö¿ú£¬òà′ÎÖÃμíμçƽ
{
GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
for(j = 0; j < 4; j++) //jêÇêäèë¿ú£¬μ±¼ü°′ÏÂê±μ¼í¨±»ÖÃÎaμíμçƽ
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
{
key[i][j] = 1;
}else{
key[i][j] = 0;
}
}
GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
}
if(key[0][0]==1)return 13;
if(key[0][1]==1)return 14;
if(key[0][2]==1)return 15;
if(key[0][3]==1)return 16;
if(key[1][0]==1)return 9;
if(key[1][1]==1)return 10;
if(key[1][2]==1)return 11;
if(key[1][3]==1)return 12;
if(key[2][0]==1)return 5;
if(key[2][1]==1)return 6;
if(key[2][2]==1)return 7;
if(key[2][3]==1)return 8;
if(key[3][0]==1)return 1;
if(key[3][1]==1)return 2;
if(key[3][2]==1)return 3;
if(key[3][3]==1)return 4;
}
我刚才粘贴少了一部分,现在又发了一次程序,麻烦看看哪里错误,调试是没错的,仿真也通过,就是到了mark那里变成13就不变了,按键按下也不管用,麻烦了,谢谢
PA13-----------------JTMS
PA14-----------------JTCK
PA15-----------------JTDI
这仨货可不能直接当作普通io口来使用的。
void PB3PB4PA13PA14PA15_TO_Normal_IO_Mode(void)
{
/*
PB3-----------------JTDO
PB4-----------------JNTRST
PA13-----------------JTMS
PA14-----------------JTCK
PA15-----------------JTDI
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
*/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
//3õê¼»ˉGPIOB íÆíìêä3ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_4);
//3õê¼»ˉGPIOA íÆíìêä3ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_15);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA, GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}
一周热门 更多>