1、芯片图
2、代码
(1)IO引脚初始化
void IO_Init(void)
{
_hvrc = 0x00; //???P-NMOS
_gatec = 0xff; //GxB & GxT??????
_hvdoen = 1;
_nfinps1 =0; //NFIN�������Ź���ѡ��
_nfinps0 =1; //NFIN��������ΪPA6
_pac = 0B11111111; //1:input 0:output
//pa0:DATA(output)--LED
//pa1:ISens(AP input)
//pa2:CLK(output)--LED
//pa3:C1P
//pa4:C2P
//pa5:C3P
//pa6:???--LED
//pa7:AN6 (Charge_DET)
_papu = 0B00000000;
// _pa = 0x00;
_pa = 0x00;
_pbc = 0B00000010; //
//pb5:CPN(input)
//pb4:KEY(input)
//pb3:CLR(output)--LED
//pb2:EN(output)
//pb1:LED(output)--LED???
_pb = 0x00;
// _pbpu = 0B00010000;
_pbpu = 0B00000010;
_paps0 = 0b01001100;
_paps1 = 0b00000101;
_pbps0 = 0b00000000;
_pbps1 = 0b00001000;
}
(2) 按键扫描
void fun_key_scan()
{
static unsigned char keyStep=0;
static unsigned int keyDelayTime=0;
switch (keyStep)
{
case 0:
if(KEY1_PRESS_DOWN() == 1){
keyStep++;
keyDelayTime = 0;
}
else{
if(gKeyClickTimes != 0){
keyDelayTime++;
//Em_Dev_PowerOn_Mode has mulclick,other mode not
if((keyDelayTime > DOUBLECLICK_TIME) || (gWorkMode != Em_Dev_PowerOn_Mode)){
if(gKeyClickTimes == 1){
gKey = Em_Key_shot;
}
else if((gKeyClickTimes >= 10) && (gKeyClickTimes < 20) ){//produce aging
gKey = Em_Key_Produce_Aging;
}
else if((gKeyClickTimes >= 20) ){//life aging
gKey = Em_Key_LIFE_Aging;
}
gKeyClickTimes = 0;
}
}
}
break;
case 1://debounce
if(KEY1_PRESS_DOWN() == 1){
keyDelayTime++;
if(keyDelayTime > DEBOUNCE_TIME){
keyDelayTime = 0;
keyStep++;
}
}
else{
keyDelayTime = 0;
keyStep = 0;
}
break;
case 2:
if(KEY1_PRESS_DOWN() == 1){
keyDelayTime++;
if(keyDelayTime > LONGKEY_TIME){
keyDelayTime = 0;
keyStep++;
gKey = Em_Key_long;
}
}
else{
keyDelayTime = 0;
keyStep = 0;
gKeyClickTimes++;
}
break;
case 3:
if(KEY1_PRESS_DOWN() == 0){
#ifdef EN_KEY_LONGUP
gKey.Key_Name = ONOFFKEY;
gKey.Key_Status = APP_KEY_LONG_UP;
#endif
keyStep = 0;
keyDelayTime = 0;
}
break;
default:
break;
}
}
3、分析原因
(1)首先应该定位问题出现在那里,主要分为三大部分,一个是IO_init部分,一个是key_scan,一个是work_mode里面的代码。
(2)分析IO_init的时候,首先要对照芯片原理图,目前比较重要的引脚有关于灯的IO1,IO2,IO3,KEY,分别对应pa2,pa0,pa6,pb1。
灯的IO口模式要设为输出模式,所以pac2 = 0,pac0 = 0,pac6 = 0。(0代表输出模式,但也因为是IO初始化,我们先全部配置为输入模式,然后之后在具体的点亮函数里面进行修改,改成输出模式)
同时papu2,0,6也要设为0(可配置可不配置,因为不是输入模式)
同时pa = 0x00(因为是初始化,所以我们先把这些全都用低电平)
按键的IO口模式要设为输入模式,所以pbc1 = 1(1代表输入模式)
pbpu1要设为1,因为key_pressdowm() = !_pb1,说明按下的时候要!_pb1为高电平,也就是按下的时候_pb1为低电平,即松开的时候_pb1为高电平,对应输入模式上拉电阻。
(3)经过比对,发现我将pb1配置成了输出模式!并且pupu1没有配置上拉!最后就是pb1我一开始就是配置了高电平(这是对的,但是我配置成输出模式,所以导致按键根本识别不出来,根本出不来低电压的效果)
(4)经过修改以后,我能够进行识别到按键,最后实现了正常点灯,加电机档位。