文章目录
一、按键处理思想分析
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)好日子在后头。穷则思变,想想自己能干什么,有什么长处,发扬光大,走有自己特色的差异化发展路线。