3个引脚控6个按键

一、按键处理思想分析

在这里插入图片描述

1.提示:K2右边K4下方还可以添加一个按键
2.注意:(1)S1和S3上拉,S2输出0时,按下K5或K2在S3脚都检测到低电平;(2)但在S1和S3上拉,S2输出1时,可以确定K2按下;(3)所以,可以利用这个特点,在判断按键按下的程序中,先处理识别是K2按下的情况,接着再处理K5按下的情况;
3.注意:if里面的return用法,遇到return,整个函数后面的内容都不执行了!下一步执行是在该函数被调用处的下一句!
4.反思:学习这种两者冲突的情况,先处理什么再处理什么;

代码如下:

// 分频后有4MHz可以用
void gpio_init(void)
{
	IOSTB =  C_PB0_Input | C_PB1_Input; 
//	BPHCON = (unsigned char)~(C_PB0_PHB);
	BPLCON = 0xcf;//下拉S1和S3 1100 1111
	
	LED_RED_OFF;
	LED_BLUE_OFF;
}

void Delayus(u8 Delay_t)//一直不知道这里参数为1是延时多少us?分频可以用是4MHz
{
	u8 Delay_i;
	for(Delay_i = 0;Delay_i < Delay_t;Delay_i++);
}

void sleep_fun(void)
{
	unsigned char time_s = 1;

	ENI();
	CLRWDT();
	
	key_BAT_GPIO();//S1 S3下拉  S2输出0
	
	Delayus(2); 
	
	do {
			SLEEP();
			
			CLRWDT();
			
			if(S1 | S3)  time_s = 0;
			else {
				key_sleep_GPIO();//S1 S3上拉  S2输出0 
				Delayus(2); 
        		if((!S1)|(!S3))  time_s = 0;
        	}
		} while(time_s);
	
	InitGPIO();//下拉S1和S3,保持状态
	DISI();
}


//取反
#define KEY_TRG_FALL(X)  (!(X)) 


unsigned char KeyScanValue(void)
{
	u8 keyData = 0xFF;
    u8 KeyTemp = 0;
    
    key_BAT_GPIO();//下拉S1 S3  S2输出0
    Delayus(200);
    KeyTemp = S1;
    KeyTemp |= (S3<<1);
    
    if(KeyTemp) {	
		switch (KeyTemp)
	    {
            case 0x01 : keyData = 1;   break;//K1
        	case 0x02 : keyData = 2;   break;//K4
        	default:        break;
	    }
	    return keyData;
    }
    
    key_GND_GPIO();//S1 S3上拉  S2输出1
    Delayus(10);
    KeyTemp = (KEY_TRG_FALL(S1)); 
	KeyTemp |= (KEY_TRG_FALL(S3)<<1);
	
	//先处理识别是K2按下的情况,接着再处理K5按下的情况;
	if(KeyTemp) {	
		switch (KeyTemp)
	    {
            case 0x01 : keyData = 4;   break;//K2
        	case 0x02 : keyData = 5;   break;
        	default:        break;
	    }
	    return keyData;
    }
    
    key_B_GPIO();//S1 S3上拉  S2输出0
    Delayus(10);
    KeyTemp = (KEY_TRG_FALL(S1)); 
	KeyTemp |= (KEY_TRG_FALL(S3)<<1);
	S2 = 1;
	
	if(KeyTemp) {	
		switch (KeyTemp)
	    {
            case 0x01 : keyData = 10;   break;//K5
        	case 0x02 : keyData = 11;   break;//K3
        	default:        break;
	    }
	    return keyData;
    }

    return keyData;
}	


void main(void)
{
 	DISI();	
 	
	gpio_init();//下拉S1和S3,S2输出模式
	timer0_init(); 
	
	ENI();	
	while(1)
	{
		CLRWDT();	
		
		value_Key = KeyScanValue(); 
		InitGPIO();//下拉S1和S3,保持状态
		
		if(value_Key != 0xff)
		 {
			switch (value_Key)
			 {
			        case 1  : LED_RED_ON;LED_BLUE_OFF;if(duty_flag == 0){duty_flag = 1;duty = 0x123412;}   break;//K1
					case 4  : if(duty_flag == 0){duty_flag = 1;duty = 0x123468;}    break;//K2
			     	case 11  :if(duty_flag == 0){duty_flag = 1;duty = 0x123452;}   break;//K3
			     	case 2  : LED_RED_OFF;LED_BLUE_ON;if(duty_flag == 0){duty_flag = 1;duty = 0x123422;}   break;//K4
			     	case 10  :LED_RED_ON;LED_BLUE_ON;if(duty_flag == 0){duty_flag = 1;duty = 0x123432;}   break;//K5
			     	default:        break;
			  }
		 }
		 else
		 {
			    if(duty_flag == 0)
				{
					LED_RED_OFF;
					LED_BLUE_OFF;
				
					sleep_fun();
				}
          }
     }
}

二、睡眠唤醒及控制功耗

提示:电池3V睡眠整体功耗是18uA

// 看门狗唤醒 + do...while(1)应用
void sleep_fun(void)
{
	//每次进来为1,保证唤醒之后,还能继续在do...while执行多1次,再次进入睡眠
	unsigned char time_s = 1;

	ENI();
	CLRWDT();
	
	key_BAT_GPIO();//S1 S3下拉  S2输出0
	
	Delayus(2); 
	
	do {
			SLEEP();
			
			CLRWDT();
			
			if(S1 | S3)  time_s = 0;
			else {
				key_sleep_GPIO();//S1 S3上拉  S2输出0 
				Delayus(2); 
        		if((!S1)|(!S3))  time_s = 0;
        	}
		} while(time_s);
	
	InitGPIO();//下拉S1和S3,保持状态
	DISI();
}

三、不带ADC功能单片机,2脚控3键

在这里插入图片描述

四、LK杂记

1.NTC控温电路,对应ADC值计算

在这里插入图片描述在这里插入图片描述

2.灯和按键复用

在这里插入图片描述

在这里插入图片描述

3.AD按键

在这里插入图片描述

4.for循环语句奇怪的记录

在这里插入图片描述

5.字节传输

在这里插入图片描述

6.类型转换

在这里插入图片描述

五、看见蛮好的文章

1.链接: 月薪 4 万人民币是一种怎样的感受?
1)没有绝对的好公司和不好的公司,关键看你的规划和公司能够给你提供的岗位是否匹配。 (LK--提高自己学习新东西的信心--团队协作,沟通方式--用到的技术懂本质能应付如今的工作任务--珍惜时间认真去扩展知识,跳槽的底气)比如你去汇川,分配的岗位能否学习到核心的东西,对自己是否有提升?

2)你的目的和规划是什么?岗位能给你提供什么?薪水我觉得毕业前几年不是最大的因素,因为高不了哪里去,低也低不了哪里去。等自己的积累足够了,兑现的时候一年的收入能顶以前好几年。

3)比如你的目的是学习FOC核心技术,给你分配的岗位是总线开发,那可能有差异,你可能需要再考虑。

4)比如你的目的就是想找一家有潜质的公司一起成长,具体的工作内容不care,那么汇川肯定是该行业最优的选择。

5)比如你刚毕业,就想进大公司磨练两年,养成良好的职业习惯,那也可以考虑。

6)打工没什么不好,打好基础,尤其没什么积累的朋友,前几年应该寻找大平台踏踏实实积累自己,不要想着副业。等积累到了一定程度,可以考虑创业或者副业。沉迷于打工,风险就有点高了,毕竟收入的主动权不在自己手上,完全靠老板,您看疫情一来,自己身边创业的朋友关张的都有不少。光靠打工,和老板谈判没有筹码,没有退路。如果不是核心岗位,连谈判资格都没有。即使谈判成功,还是脱离不了打工的属性,做副业起码自己是自己的小老板吧?

7)如果能获得稳定的薪水外加一定的副业收入,抗风险能力不是加强了很多吗?赚钱这件事,真的是撑得撑死,饿得饿死。就是一层窗户纸,如果捅破了就觉得真的没那么难。尤其在深圳这个地方,光靠工资也就互联网行业还可以。想做副业有很多种途径,比如听说喜马拉雅有位女性,因为声音很柔和,录一段故事让听众睡前听能很好的改善失眠,年入几百万。现在是互联网时代,不要纠结在那几行代码,几个公式争来争去,少敲键盘少打嘴炮,多看看外面世界,赚钱的机会大把。

8)远离那么整天抱怨,传递负能量的人,躺平可以,但是整个抱怨这个埋怨那个,说郭嘉药丸的人都要敬而远之。也许很多人喷我,我的体会就是,自己认识的那些事业有成就的人,都是感恩的心态,积极阳光的心态,从来不会到处传递负面情绪,你没有资格把你的垃圾情绪倾倒给别人!

9)好日子在后头。穷则思变,想想自己能干什么,有什么长处,发扬光大,走有自己特色的差异化发展路线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值