历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | 用PIC10F202单片机制作两路开关源程序

2019-11-08 来源:51hei

//=======================================用户配置区,供用户修改===========================================


#define TIME2  1000            //长按键时间设置,单位ms ,1000 = 1s  范围:1~10s


//=========================================================================================================










//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************

//************************************  以下为代码区,请勿改动!  *****************************************


//=============================================硬件连接示意===============================================

//

//    ___短 _      长   _______ 

//       |_| |_________|    PIC10F200/202

//                          +---------+

//         KEY 长/短按键 ---|GP0   GP3|---

//                          |         |

//                          |GND   VDD|

//                          |         |                    __      ___ 

//        长按键翻转输出 ---|GP1   GP2|---短按键翻转输出 _|  |____|   |____

//                          +---------+

//      __________             _____________ 

//    _|          |___________|             |____

//

//--------------------------------------------------------------------------------------------------------

/*

               

                             长/短按键IO口电平翻转程序



  说明:1.该程序通过检测GP0管脚的有效按键长短,循环翻转GP2和GP1管脚的输出电平高低。

          每检测到一个短按键,则对GP2管脚输出电平进行一次翻转,每检测到一个长按键,

          则对GP1管脚输出电平进行一次翻转。 


        2.按键是带有状态机的键盘扫描程序,可有效对按键消抖,抗干扰能力极强。


        3.长按键的时间可通过程序顶端的参数进行方便的设置,以满足现场需求。

     

        4.GP1、GP2在单片机默认状态和复位后输出电平为低。


        5.待机功耗为400uA(@5V),长按键功耗为500uA(@5V)。


        6.已启用内部弱上拉,按键可以不加上拉电阻,如果要保证信号可靠,可以加上拉电阻,

          建议选择>=100K的电阻,以降低长时间按下按键在电阻上的功耗。



       日期:2014/09/04        版本:V2.0

  

*/


//=========================================================================================================




#include      //本代码可支持单片机型号:PIC10F200/202


#define Key_Read_T 25 //等间隔读取键值,单位ms


#define KEY_IO                GP0         //按键信号输入

#define Short_Out         GP1                //短按按键响应数出口


bit short_out;                                //记录Short_Out当前状态

bit short_IF;                                //短按响应标志


#define Long_Out         GP2                //长按按键响应数出口


bit long_out;                                //记录Long_Out当前状态

bit long_IF;                                //长按响应标志


unsigned char KEY_State=0;        /*按键的状态变量*/



#define NOKEY     0

#define PUSH_KEY  1

#define LONG_PUSH 2


#define INITIAL_25MS 161         //相对于本系统与定时器时钟,本数据为固定值。定时器增计数,计数周期为256us,计97个数约为25mS。256-97+2=161


/****************************************************************************

* 名    称:Key_ScanIO()

* 功    能:扫描键盘IO口并判断按键事件

* 入口参数:Ticklong:长按键有效时长,单位ms

* 出口参数:无

* 说    明: 该函数需要每隔25(Key_Read_T)ms,调用一次。最好放在定时中断内执行。

            如果中断间隔太长,可能丢键;间隔太短不能消除抖动。

****************************************************************************/

void Key_ScanIO(int Ticklong)

  static unsigned int KeyTimerS;

  

//===============================按键========================================    

  if(KEY_State==PUSH_KEY)  KeyTimerS++;    /*定时器,时间间隔25ms*/

  else                     KeyTimerS=0;

  

  switch(KEY_State)                  //根据按键的状态决定程序分支

  {

     case NOKEY:         //------------------在未按键状态下--------------------------

       {                              //若键被按下,按键状态变为"短按状态"。

          if(KEY_IO==0) KEY_State=PUSH_KEY;

          break;

       }

     case PUSH_KEY:        //-------------按键处于"短按状态"时------------------------

       {

          if(KEY_IO!=0)              //若键被释放,认为是一次短按键

            {

              KEY_State=NOKEY;       //并回到"未按下状态" 

                          short_IF  = 0; 

                          long_IF  = 0;              

            }

          else if(KeyTimerS>Ticklong) //若按键时间超过Ticks毫秒,认为是一次长按键,

            {

              KEY_State=LONG_PUSH;           // 按键状态变为"长按状态"          

            }      

          break;          

       }

     case LONG_PUSH: //------------按键处于"长按状态"时--------------------

       {

          if(KEY_IO!=0)                //若键被释放,回到未按键状态

            {

              KEY_State=NOKEY;

                          short_IF  = 0; 

                          long_IF  = 0; 

            }     

          break;            

       }

  }    

}


/****************************************************************************

* 名    称:Key_Answer()

* 功    能:根据按键状态作出响应,控制IO管脚输出电平翻转

* 入口参数:Ticklong:长按键有效时长,单位ms

* 出口参数:无

****************************************************************************/

void Key_Answer(void)

{

  if((KEY_State==PUSH_KEY)&&(short_IF == 0))  

  {

        short_out = ~short_out;

    Short_Out =  short_out;

        short_IF  = 1;        

  }

  if((KEY_State==LONG_PUSH)&&(long_IF == 0)) 

  {

        long_out = ~long_out;

        Long_Out =  long_out;

        long_IF  =        1;

  }                  

}


/**************************************************************************************

名    称:main()

功    能:主程序

入口参数:无

出口参数:无

***************************************************************************************/

void main()

{

        

     //设置时钟周期Fosc = 4MHz,系统时钟,无法设置

        OPTION = 0x97;                  //复位值0xFF。TIMER0的时钟源是Fosc/4,1us。TIMER0 256预分频,256us

//        CMCON0 = 0xE1;


    TRISGPIO = 0x09;                //GP1、GP2配置为输出。0为输出,1为输入

        short_out = 0;

    Short_Out = short_out;

        long_out = 0;    

        Long_Out = long_out;    //为输出赋初值        


        TMR0 = INITIAL_25MS;                //增计数,计数周期为256us,计97个数约为25mS。256-125+2=97 


        while(1)

        {

                #asm

                CLRWDT     

                #endasm        

推荐阅读

史海拾趣

Beta Dyne Inc公司的发展小趣事

近年来,电子行业面临着技术更新换代迅速、市场竞争激烈的挑战。Beta Dyne也不例外,公司面临着来自同行的竞争压力以及客户需求不断变化的挑战。为了应对这些挑战,Beta Dyne不断调整产品策略,加大研发投入,推出了一系列创新产品,并积极拓展新的应用领域。

EMS GmbH公司的发展小趣事

随着公司技术的不断成熟和产品的不断优化,EMS GmbH公司开始积极拓展市场。公司不仅在欧洲市场取得了显著的成绩,还逐渐将业务拓展至全球范围。通过参加国际展会、与合作伙伴建立战略合作关系等方式,EMS GmbH公司不断提升品牌知名度和影响力。同时,公司还注重产品质量和服务质量的提升,以确保在激烈的市场竞争中保持竞争优势。

Esterline Power Systems公司的发展小趣事

Esterline Power Systems深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的培训体系,为员工提供多元化的培训和发展机会。同时,公司还注重营造良好的企业文化氛围,鼓励员工积极参与团队合作和创新实践。这些举措不仅提高了员工的专业技能和综合素质,也增强了公司的凝聚力和竞争力。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

AIE公司始终将品质管理作为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、销售等各个环节都进行严格的监控和管理。同时,AIE还注重与客户的沟通和反馈,及时了解客户的需求和意见,不断改进产品和服务。这种对品质的执着追求和对客户的尊重赢得了客户的广泛信任和支持。

Emerging Display Technolgies公司的发展小趣事

某新兴显示技术公司,将量子点技术应用于显示屏中,成功提升了显示效果和色彩表现。量子点技术通过精确控制发光材料的尺寸和组成,实现了更广的色域覆盖和更高的色彩准确性。这一技术的应用,使得显示屏在色彩还原、对比度等方面有了显著提升,为用户带来了更加真实、生动的视觉享受。

Daewoo公司的发展小趣事

然而,好景不长。1997年亚洲金融危机的爆发给Daewoo公司带来了前所未有的挑战。由于过度扩张和错误的投资决策,公司背负了巨额债务,资不抵债。面对这一困境,Daewoo公司不得不进行资产重组和裁员等措施,以减轻财务压力。虽然这些措施在短期内带来了痛苦,但也为公司的未来发展奠定了基础。

问答坊 | AI 解惑

MCF52233_CFM

MCF52233_CFM—Coldfire Flash Module   Coldfire的CFM功能是把它的flash当作EEPROM来用。使用起来还是很方便的,只要完成几个小的功能函数就行了:  第一个是CFM的初始化CFM_init(),完成时钟的设置;   第二个是页擦除CFM_Page_eraser(), ...…

查看全部问答>

终身受益啊,手机原来隐藏了这么多功能!

1、隐形的备用电池 你的手机电量不足了,为了让它能够继续使用,按*3370#键,手机会重新启动,启动完毕后,你就会发现电量增加了50%。这部分隐藏的备用电量 用完了你就必须得充电了,再次充电的时候,隐形的备用电池也同时充电,下次电量低的时候 ...…

查看全部问答>

st7单片机

没有人用过ST7的单片机么? 为什么我在网上找不到一点关于意法半导体的资料 有谁有资料,希望传个给我  谢谢 或者告诉网址 要中文的…

查看全部问答>

开关电源中高频磁性元件设计常见错误概念辨析

【转帖】作者:冷昭军 现任深圳茂硕电源科技股份有限公司 电源开发工程师 很多电源工程师对开关电源中高频磁性元件的设计存在错误的概念,其设计出来的高频磁性元件不能满足应用场合的要求,影响了研发的进度和项目的按期完成。基 于开关电源及 ...…

查看全部问答>

初学单片机应该买个什么学习板

本人是个单片机初学者,想要买个学习板,深入学习单片机,加强实际操作能力,请问我应该购买哪款学习板? 最好适合初学者,有视频和教程更好)…

查看全部问答>

CE webbrowser控件

我用的软件是EVC4.0,我创建了Dialog base对话框或者Single document,在控件栏中都没有webbrowser控件。 请问是要怎么样才能加上去呢?…

查看全部问答>

Proteus仿真cpu过载

程序也不大,电路图也不复杂,就是数码管动态显示,用中断搞了一个表,结果mcu的clock设置11.0592MHz时,就过载了,设成300KHz就还可以,可是毕竟是个表啊,查Proteus的帮助说把电阻什么的都数字化,可是还是不行,版本v7.1,求教,谢谢!…

查看全部问答>

ISE11.1使用出现问题

刚装了ISE11.1    安装过程顺利,能打开软件,不过在调试正确的程序源文件时总是不能综合完成,也没有任何错误。只是最后显示                Process \"Synthesis\" failed  &n ...…

查看全部问答>

问一下,想找AC电源,400v输出的,有哪种

谁能告诉我呢   问一下,想找AC电源,400v输出的,有哪种?…

查看全部问答>

二选一开关

设计以芯片内部要一个二选一和四选一开关,哪位大神指导一下…

查看全部问答>