历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2020年01月07日 | 单片机成长之路(51基础篇)- 024 基于 N76E003 的按键按键状态

2020-01-07 来源:eefocus

前端时间要用按键,搞了个状态机(如图):

 main.c


 1 #include

 2 #include                     //N76E003 SFR寄存器设置宏定义

 3 #include             //功能定义

 4 #include "data.h"

 5 #include "interrupt.h"

 6 #include "button.h"

 7 /*--------------------------------------------------------*/

 8 // 初始化所有

 9 void Init_All(void){

10     InitMcu();                // 初始化MCU

11     Init_button();            // 键盘初始化

12 }

13 /*******************************************************************/

14 // 发布版本

15 void main(void){

16     Init_All();

17     while(1){

18         ;

19     }

20 }


data.h


 1 /*--------------------------------------------------------------------------

 2 data.h

 3 --------------------------------------------------------------------------*/

 4 #ifndef __DATA_H__

 5 #define __DATA_H__

 6 

 7 

 8 /*----------------------------------------------------*/

 9 // 按键状态(状态定义)

10 #define  Button_DOWN                0        // 按键按下

11 #define  Button_UP                    1        // 按键抬起

12 // 按键功能模式(软件模式定义)

13 #define  Button_mode_NoOperation        0        // 无动作

14 #define  Button_mode_ShortPress            1        // 短按

15 #define  Button_mode_longPress            2        // 长按

16 #define  Button_mode_evenPress            3        // 连续快按(双击)

17 // 键盘消抖时间

18 #define Button_TimeDebounce                20/2    // 单位 ms 去抖动时间

19 #define Button_TimeShort_even            100/2    // 单位 ms 短按转连续按时间

20 #define Button_TimeEvenPressinterval    5000/2    // 单位 ms 双击判断阈值

21 #define Button_TimeState_reset            60000/2    // 单位 ms 60s 无动作 退出设置

22 // 键盘状态机模式

23 #define  Button_status_S0                0        // 等待按键按下

24 #define  Button_status_S1                1        // 去抖验证

25 #define  Button_status_S2                2        // 按下时间(计算是不是长按)

26 #define  Button_status_S3                3        // 快安判断(判断是不是短按)

27 #define  Button_status_S4                4        // 快安去抖

28 #define  Button_status_S5                5        // 等待快安退出

29 /*----------------------------------------------------*/

30 #define Unit_cycle                    32000        // 中断处理周期

31 /*----------------------------------------------------*/

32 struct Button_data{

33     unsigned int Button_LiftTime;                // 抬起时间

34     unsigned int Button_PressTime;                // 按下时间

35     unsigned char Button_State_machine_mode:3;    // 按键状态模式(状态机)

36     unsigned char Button_statusmode:2;            // 0无动作 1短按 2连发 3长按

37     unsigned char Button_status:1;                // 按键的状态(按键松开,界面刷新)

38 

39 };

40 /*------------------------ 系统时间 ----------------------------*/

41 struct OS_DATA{

42     // 系统初始化

43     unsigned char u8TH0_Tmp;                    // 中断高8位

44     unsigned char u8TL0_Tmp;                    // 中断低8位

45     // 键盘

46     struct Button_data Button0;

47 

48 };

49 

50 extern struct OS_DATA DATA;

51 #endif


data.c


1 #include "data.h" 

3 struct OS_DATA DATA;            // 系统数据


interrupt.h


 1 /*--------------------------------------------------------------------------

 2 interrupt.h

 3 --------------------------------------------------------------------------*/

 4 

 5 #ifndef __INTERRUPT_H__

 6 #define __INTERRUPT_H__

 7 

 8 /*----------------------------------------------------*/

 9 void InitMcu(void);

10 #endif


interrupt.c


 1 #include

 2 #include                     //N76E003 SFR寄存器设置宏定义

 3 #include             //功能定义

 4 #include "data.h"

 5 #include "interrupt.h"

 6 #include "button.h"

 7 

 8 /*--------------------------------------------------------*/

 9 #define T0_INIT        Unit_cycle

10 #define T0_ms         500

11 /*--------------------------------------------------------*/

12 //初始化单片机

13 void InitMcu(void){

14     TIMER0_MODE1_ENABLE;                         //定时器0的模式1

15     set_T0M;                                    //设置定时器0的时钟为系统时钟

16     //u8TH0_Tmp和u8TL0_Tmp 宏变量 中断可调用

17     //Init_OS_Date();已经初始化 

18     DATA.u8TH0_Tmp = (65536-T0_INIT)/256;            //计算T0高8位数据

19     DATA.u8TL0_Tmp = (65536-T0_INIT)%256;            //计算T0低8位数据

20     TH0 = DATA.u8TH0_Tmp;                            //数据装入定时器0(计数器0)数据

21     TL0 = DATA.u8TL0_Tmp;

22     set_ET0;                                    //开启定时器0中断

23     set_EA ;                                    //开启总中断

24     set_TR0;                                    //启动定时器0

25 }

26 /**************************************************************************

27 Function:    TIM1_UPD_OVF_IRQHandler

28 Description: TIM1溢出中断 10ms

29 Input:       no

30 Output:      no

31 Return:      no

32 **************************************************************************/

33 //定时器 ms

34 void Timer0_ISR ( void ) interrupt 1  //interrupt address is 0x000B

35 {

36     //获取定时器数据

37     TH0 = DATA.u8TH0_Tmp;

38     TL0 = DATA.u8TL0_Tmp;

39     // 按键时间模块

40     All_Buttonrefresh();

41 }

42 /******************************************************************/


button.h


 1 /*---------------------------------------------------------

 2     button.h

 3     按键控制

 4 ---------------------------------------------------------*/

 5 #ifndef _BUTTON_H_

 6 #define _BUTTON_H_

 7 /*----------------------------------------  数据初始化  ------------------------------------------*/

 8 #define button0_Num 5

 9 sbit button0 = P1^button0_Num;        // 按键

10 #define Git_button0 button0

11 /*----------------------------------------  数据获取部分  ------------------------------------------*/

12 

13 /*----------------------------------------  键盘初始化  ------------------------------------------*/

14 void Init_button(void);

15 void All_Buttonrefresh(void);

16 

17 #endif


button.c


  1 #include

  2 #include                     //N76E003 SFR寄存器设置宏定义

  3 #include             //功能定义

  4 #include "button.h"

  5 #include "data.h"

  6 

  7 /*----------------------------------------  数据宏定义  ------------------------------------------*/

  8 

  9 /*----------------------------------------  按键初始化  ------------------------------------------*/

 10 // 初始化按键

 11 void Init_button(void){

 12     //button1

 13     P1M1 |= (0x00 << button0_Num);        // 设置为1

 14     P1M2 &= ~(0x01 << button0_Num);        // 设置为0

 15 }

 16 /*----------------------------------------  功能模块  ------------------------------------------*/

 17 // 获取按键

 18 void Button_Process(struct Button_data* Button,bit status){

 19     switch(Button->Button_State_machine_mode){

 20         case Button_status_S0:{        // 等待按键按下

 21             if(Button_UP == status){        

 22                 Button->Button_status = Button_UP;        // 按键状态抬起

推荐阅读

史海拾趣

ELANTEC (Renesas )公司的发展小趣事

作为一家半导体公司,技术突破和创新是ELANTEC发展的核心动力。在移动通信领域,ELANTEC不断推出具有创新性的产品和技术,如低功耗、高性能的移动通信芯片等。此外,在汽车电子、工业控制等领域,ELANTEC也取得了多项技术突破,为客户提供了更加优质的产品和服务。

Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

BELLING LEE公司的发展小趣事

为了进一步扩大市场份额,BELLING LEE公司开始实施国际化战略。公司首先在欧洲和北美市场设立了分支机构,并逐步拓展到亚洲、非洲等其他地区。在国际化过程中,公司不仅积极推广自己的产品和技术,还加强了与当地企业的合作与交流,从而实现了资源的优化配置和市场的互利共赢。

广芯电子(BROADCHIP)公司的发展小趣事

在电子行业的初期,BELLING LEE公司以其对新技术的敏锐洞察力和强大的研发能力脱颖而出。公司投入大量资源研发出了一款具有革命性的高效能电子芯片,这一创新产品不仅提高了电子设备的性能,还大大降低了能耗。凭借这一技术突破,BELLING LEE公司迅速在电子市场上获得了认可,并逐渐建立起自己的市场地位。

GAPTEC Electronic GmbH & Co. KG公司的发展小趣事

背景:随着全球对环保和可持续发展的重视,Galaxy Microelectronics也开始关注其生产过程中的环保问题。

发展:公司投入巨资建设绿色工厂,采用先进的环保技术和设备,减少生产过程中的能源消耗和废弃物排放。同时,Galaxy Microelectronics还积极推广环保理念,与供应商和客户共同构建绿色供应链。这些举措不仅提升了公司的社会形象,还为其在竞争激烈的市场中赢得了更多客户的青睐。

Genesis Microchip公司的发展小趣事

在电子行业竞争日益激烈的背景下,GI通过一系列的战略并购和整合,进一步巩固了其市场地位。公司精心挑选并收购了多家具有技术实力和市场潜力的企业,通过资源整合和优势互补,实现了技术、产品和市场的全面升级。这些并购不仅为GI带来了更多的技术专利和市场份额,还为其在未来的竞争中奠定了更加坚实的基础。

问答坊 | AI 解惑

寻求小天线的区分范围

  各位高手,有谁能告诉我,具体的小天线是指哪些天线,它的范围包括哪些?谢谢大家的帮助!!…

查看全部问答>

哪位高人能帮我设计一个射基跟随器呀?

我需要一个放大电路,它的要求是把我现有的一个0.6V的开关,放大成3.0V的开关,最后是要控制发光二极管亮灭,可以提供12.0V电源,哪位高人可以帮忙设计或有成品电路可以用请提供一下信息啊?…

查看全部问答>

关于linux设备驱动的书

我是一个嵌入式linux开发的新手,现在想自学驱动开发,但是我一直有个疑问,请您指教: 我到底先读《linux设备驱动程序(第三版)》和宋老师编著的《linux设备驱动开发详解》哪一本书?我很苦恼。。。…

查看全部问答>

WM手机如何与单片机加USB_HOST芯片通信

如题 只考虑手机端。 随便问问,没希望得到答案 呵呵…

查看全部问答>

我给大家特别推荐的一款产品,非常棒!!!

c8051f 单片机(c2 ,jtag)和at89s5x单片机(isp)二合一串口编程下载线,支持3伏(c8051f 单片机),5伏(at89s5x单片机)电源, 目前通过实际验证可编程下载的芯片:c8051f310、c8051f320、c8051f330D、c8051f340、c8051f350、c8051f360、c8051f4 ...…

查看全部问答>

EVC表盘类?

现在evc上作界面开发,用到模拟压力表盘显示压力值,表针可以实时转动,刻度可以自己设置,不知谁用过,能否帮帮忙?…

查看全部问答>

关于STM32L151的几个问题

1. 何处可以得到 STM32L151 的片子; 2. STM32L151 的内部时钟可以支持 USB吗? 3. IAR5.3 +jilink 7 可以支持STM32L151? 谢谢!…

查看全部问答>

请教:我设置了开机密码但是无法弹出软键盘

我设置了开机密码但是无法弹出软键盘,这样没办法进入系统也没办法关机,请教如何关闭密码或者调出软键盘 是windows CE6.0的 谢谢各位大大了! [ 本帖最后由 qty0 于 2011-7-28 20:21 编辑 ]…

查看全部问答>

一个简单的DA应用程序

一个简单的DAC程序,输出正弦波。…

查看全部问答>