按键问题收集(涉及点灯和电机)

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)经过修改以后,我能够进行识别到按键,最后实现了正常点灯,加电机档位。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值