历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2019年03月28日 | 关于STM32按键妙用详解

2019-03-28 来源:eefocus

假设PB6、7、4  三个端口:


按下为低电平(0)、否则为高电平(1)。


void ReadKey(void)


{


//1.获取GPIB->IDR寄存器值(获取键值)


         u16 ReadData = (GPIO_InputData( GPIOB )  &  0xD0)  ^  0xD0;  


        


         //2.判断哪一位发生改变(按键按下)


         Trg = ReadData & (ReadData ^ cont);


         //3.在按键按下后,哪一位发生改变(按键松开)


         Rel = ReadData ^ Trg ^ cont;


         //4.按键按下没有发生改变(长按) – 保存上一次 获取的按键值


         cont = ReadData;


}


解析:


         按键使用时,分为四种状态:


未按下

按下(短按)

长按

松开

在以上4总状态下,解析ReadKey()函数。


注意:


容易迷惑的地方在于 GPIO_InputDta()函数获取的值应该为多少


         由于知道 PB6、7、4 默认状态为1,按下为0 则获取的IDR 寄存器值为


1101 0000(0xD0)


         &/^ 两种逻辑运算符需要知道。


                   &:  0 & 1 = 0 ( 真 与 假 = 假)


                   ^:      0 ^ 1 = 1    1 ^ 1 = 0 ( 相同为0,不同为1)


 


按键未被按下

ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值}  &  0xD0)  ^  0xD0 =        0x00;

Trg = ReadData & (ReadData ^ cont)  = 0x00 & (0x00 ^ 0x00) =                            0x00;

Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x00 =                                              0x00;

cont = ReadData =                                                                                                   0x00;

 


按键被按下(短按)

//这里GPIO_InputData 获取的是PB6 bit位为0    0x90


ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值}  &  0xD0)  ^  0xD0 = 0x40;

 


Trg = ReadData & (ReadData ^ cont)  = 0x40 & (0x40 ^ 0x00) =                                       0x40;

Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x40 ^ 0x00 =                                                      0x00;

cont = ReadData =                                                                                                                  0x40;

 


按键没有松开(长按)

//这里GPIO_InputData 获取的是PB6 bit位为0    则为0x90


ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值}  &  0xD0)  ^  0xD0 = 0x40;

 


Trg = ReadData & (ReadData ^ cont)  = 0x40 & (0x40 ^ 0x40) =                              0x00;

Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x00 ^ 0x40 =                                                      0x00;

cont = ReadData =                                                                                                                  0x40;

 


按键松开(释放)

//这里GPIO_InputData 获取的是PB6 bit位为1    则为0xD0


ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值}  &  0xD0)  ^  0xD0 = 0x00;

 


Trg = ReadData & (ReadData ^ cont)  = 0x00 & (0x00 ^ 0x40) =                              0x00;

Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x40 =                                                      0x40;

cont = ReadData =                                                                                                                  0x00;

 


 


总结:


         根据4种按键状态,trg、rel、cont 三个参数都会发生改变。并且在不同的状态,这三个参数改变的也不同。


         Trg:决定了IDR寄存器中哪一位发生了改变  即:按键按下


         Rel:决定了在改变过后,哪一位再次发生变化  即:松开标志位


         Cont:保存上一次对应IO 的状态,当第二次程序运行函数时,使上一次和这一次进行对比,如果没改变对应标志 不变。发生改变(即保存上一次的ReadData) 也发生改变。即:按键长按标志。



推荐阅读

史海拾趣

聚洵(Gainsil)公司的发展小趣事

泰科天润(GPT)公司电子行业发展的五个故事

故事一:初创与早期发展

2011年,正值国内碳化硅产业从2英寸晶圆向4英寸迭代的关键时期,泰科天润半导体科技(北京)有限公司应运而生,成为国内最早一批建设碳化硅晶圆制造工厂的民营企业。公司初创时面临着技术、资金、市场等多方面的挑战,但凭借对碳化硅产业的坚定信念和持续投入,逐步搭建起生产线,完成了设备采购和工艺调控,为后续的快速发展奠定了坚实基础。

故事二:产品线扩展与技术创新

随着技术的不断积累和市场的逐步拓展,泰科天润的产品线日益丰富。公司不仅成功推出了600V至1700V系列的碳化硅肖特基二极管产品,实现了批量生产,还不断向更高端的技术领域迈进。2023年,泰科天润推出了多款新品,包括1200V SiC MOSFET、2000V SiC二极管等,并在市场上取得了显著的销售业绩。这些新产品的推出,不仅丰富了公司的产品线,也进一步巩固了泰科天润在碳化硅功率器件领域的领先地位。

故事三:生产线建设与产能扩张

为了满足日益增长的市场需求,泰科天润不断加大生产线的建设和产能的扩张。2023年,公司启动了北京总部基地6/8英寸生产线的建设,目前正在开展土建及桩基工程相关工作,预计2025年年初可实现通线并正式投产。此外,泰科天润还在湖南等地建设了多条生产线,实现了产能的快速增长。这些生产线的建设和产能扩张,为公司的持续发展提供了有力保障。

故事四:市场布局与业务拓展

泰科天润在市场布局上采取了多元化的战略,不仅深耕国内市场,还积极拓展国际市场。公司积极参与各类行业展会和论坛,与国内外客户和合作伙伴建立了广泛的联系。同时,泰科天润还根据不同行业的需求,推出了多套行业解决方案,进一步拓宽了市场应用领域。这些努力使得泰科天润在碳化硅功率器件市场上占据了重要的位置。

故事五:超级充电站项目

泰科天润不仅在产品研发和生产上取得了显著成绩,还在市场应用上进行了大胆尝试。2023年7月,泰科天润携手浏发集团打造的全国产碳化硅超级充电站正式投入运营。这是湖南县级城市首座集“光伏发电、电池储能、液冷超充”于一体的全碳化硅新能源汽车充电站。该项目的成功实施,不仅展示了泰科天润在碳化硅充电技术上的创新实力,也为新能源汽车充电技术的发展提供了新的思路和解决方案。

德国ACAM公司的发展小趣事

2023年,ACAM公司与上海科技大学智造系统工程中心(CASE)签署了增材制造联合研发、应用研究和教育培训协议。这次合作标志着ACAM公司在增材制造领域的布局进一步深化,双方将共同推动增材制造技术的创新和应用,为行业的发展贡献更多的力量。

这五个故事展示了德国ACAM公司在电子行业中的发展历程和取得的成就。从创立之初的技术突破,到被收购后的技术实力大增,再到超声波计量领域的革命性突破,以及与高校合作推动增材制造发展,ACAM公司始终保持着创新的精神和不断进取的态度,为电子行业的发展做出了重要贡献。

EFINIX公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

芯邦(Chipsbank)公司的发展小趣事

为了进一步扩大业务规模,提升研发实力,芯邦科技于2023年成功在上交所科创板上市,并计划募资6亿元用于投建移动存储控制芯片等项目。这一举措不仅为芯邦提供了更多的资金支持,也为其未来的发展奠定了坚实的基础。

CSB公司的发展小趣事

随着国内市场的饱和,CSB公司开始将目光投向海外市场。公司制定了国际化战略,通过设立海外分支机构、拓展国际市场渠道、加强与国际合作伙伴的合作等方式,逐步实现了全球市场的布局。在国际市场上,CSB公司的产品和服务得到了广泛认可,为公司带来了丰厚的回报。

这些故事虽然是对电子行业企业发展的一般性描述,但可能在一定程度上反映了CSB公司或其他类似企业在电子行业中的发展历程。然而,需要注意的是,每个企业的发展道路都是独特的,具体的故事还需根据企业自身的实际情况来编写。

Harvatek Corporation公司的发展小趣事

背景:随着全球经济的一体化和电子信息产业的快速发展,Hantronix意识到市场拓展的重要性。公司开始积极寻求国际合作机会,拓展其全球业务版图。

发展:Hantronix通过参加国际展会、建立海外销售网络等方式,成功将产品推向全球市场。其高品质的产品和优质的服务赢得了众多国际客户的信赖和好评。同时,公司还加强了与国际知名企业的合作,共同推动电子显示技术的进步和应用。

问答坊 | AI 解惑

旋转时钟,外壳底座制作完毕!增加汉字显示

丑小鸭变成了白天鹅。丑陋的手工板,摇身一变,成了正式PCB: 10元一个的电机,一买就是10个,少了人家还不卖,心痛不如行动: 完美的结合: 指针板头上的项圈,可不是为了装饰哦,那是为了配重(平衡): 侧面看看,靓丽的身影: ...…

查看全部问答>

为什么我的复位电平上不去?

复位芯片采用MAX811,MCU采用C8051F020,上电后,电源电压时3.3V,为什么复位电平只有1.36V? …

查看全部问答>

请教几句2440 NBoot中的汇编代码

    ; Set up the memory control registers.     ;     add     r0, pc, #SMRDATA - (. + 8)     ldr                r1, =BWSCON  ...…

查看全部问答>

如何捕捉MSComm控件的错误异常

如题,如何捕捉MSComm控件的错误异常。    想捕捉MSComm错误异常后,做一些自定义操作,但是好像一般的捕捉异常方法不起作用!    求解!…

查看全部问答>

用了lut1lut的I2C函数,终于搞定,谢谢各位...

                                  …

查看全部问答>

低电平测量对测试夹具有何要求?

对用于低电平测量的测试夹具有几个重要的要求: * 绝缘电阻[1]:所有连接器、内部连线、端子和插座等的绝缘电阻都应当尽可能地高。一般地说,在高质量的测试夹具中,所有的连接器和插座都使用聚四氟乙烯绝缘材料。 * 屏蔽[2]和保护:测试夹具 ...…

查看全部问答>

一段嵌入式代码的理解

int main(void){         // disable JTAG port    DDPCONbits.JTAGEN = 0;           // 3.2 initialization    TRISB = 0;  & ...…

查看全部问答>

问:请解释下面的c程序,最好是详细的解释。谢谢。

#define GPBCON    (*(volatile unsigned long  *)0x56000010) #define GPBDAT    (*(volatile unsigned long  *)0x56000014) # define GPB5_out    (1…

查看全部问答>

ucos在STM32平台上移植的疑惑

最近在学ucosii但遇到很多问题在此向大家请教 1、在可悬挂中断PENDSV的优先级为何要设为最低优先级? 2、systick优先级的设置有没要求,是不是只要比PENDSV高就行了? 2、在别人的移植程序里我看到对于systick的设置都是直接调用库函数里面的SysT ...…

查看全部问答>

步进电机带载问题

步进电机带载,用螺丝把负载固定在步进电机的转轴上,为什么螺丝旋的越紧,步进电机就抖得越厉害,而且速度很慢?有没有什么办法可以解决的吗?急用,大神们帮忙看下,谢谢…

查看全部问答>