找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9658|回复: 6
打印 上一主题 下一主题
收起左侧

用PIC10F202单片机制作两路开关源程序

[复制链接]
跳转到指定楼层
楼主
ID:262 发表于 2016-8-15 01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

完整代码下载:http://www.51hei.com/bbs/dpj-53553-1.html


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

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

  3. //=========================================================================================================









  4. //************************************  以下为代码区,请勿改动!  *****************************************
  5. //************************************  以下为代码区,请勿改动!  *****************************************
  6. //************************************  以下为代码区,请勿改动!  *****************************************
  7. //************************************  以下为代码区,请勿改动!  *****************************************
  8. //************************************  以下为代码区,请勿改动!  *****************************************
  9. //************************************  以下为代码区,请勿改动!  *****************************************
  10. //************************************  以下为代码区,请勿改动!  *****************************************

  11. //=============================================硬件连接示意===============================================
  12. //
  13. //    ___短 _      长   _______
  14. //       |_| |_________|    PIC10F200/202
  15. //                          +---------+
  16. //         KEY 长/短按键 ---|GP0   GP3|---
  17. //                          |         |
  18. //                          |GND   VDD|
  19. //                          |         |                    __      ___
  20. //        长按键翻转输出 ---|GP1   GP2|---短按键翻转输出 _|  |____|   |____
  21. //                          +---------+
  22. //      __________             _____________
  23. //    _|          |___________|             |____
  24. //
  25. //--------------------------------------------------------------------------------------------------------
  26. /*
  27.                
  28.                              长/短按键IO口电平翻转程序


  29.   说明:1.该程序通过检测GP0管脚的有效按键长短,循环翻转GP2和GP1管脚的输出电平高低。
  30.           每检测到一个短按键,则对GP2管脚输出电平进行一次翻转,每检测到一个长按键,
  31.           则对GP1管脚输出电平进行一次翻转。

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

  33.         3.长按键的时间可通过程序顶端的参数进行方便的设置,以满足现场需求。
  34.      
  35.         4.GP1、GP2在单片机默认状态和复位后输出电平为低。

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

  37.         6.已启用内部弱上拉,按键可以不加上拉电阻,如果要保证信号可靠,可以加上拉电阻,
  38.           建议选择>=100K的电阻,以降低长时间按下按键在电阻上的功耗。


  39.        日期:2014/09/04        版本:V2.0
  40.   
  41. */

  42. //=========================================================================================================



  43. #include <pic.h>      //本代码可支持单片机型号:PIC10F200/202

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

  45. #define KEY_IO                GP0         //按键信号输入
  46. #define Short_Out         GP1                //短按按键响应数出口

  47. bit short_out;                                //记录Short_Out当前状态
  48. bit short_IF;                                //短按响应标志

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

  50. bit long_out;                                //记录Long_Out当前状态
  51. bit long_IF;                                //长按响应标志

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


  53. #define NOKEY     0
  54. #define PUSH_KEY  1
  55. #define LONG_PUSH 2

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

  57. /****************************************************************************
  58. * 名    称:Key_ScanIO()
  59. * 功    能:扫描键盘IO口并判断按键事件
  60. * 入口参数:Ticklong:长按键有效时长,单位ms
  61. * 出口参数:无
  62. * 说    明: 该函数需要每隔25(Key_Read_T)ms,调用一次。最好放在定时中断内执行。
  63.             如果中断间隔太长,可能丢键;间隔太短不能消除抖动。
  64. ****************************************************************************/
  65. void Key_ScanIO(int Ticklong)
  66. {
  67.   static unsigned int KeyTimerS;
  68.   
  69. //===============================按键========================================   
  70.   if(KEY_State==PUSH_KEY)  KeyTimerS++;    /*定时器,时间间隔25ms*/
  71.   else                     KeyTimerS=0;
  72.   
  73.   switch(KEY_State)                  //根据按键的状态决定程序分支
  74.   {
  75.      case NOKEY:         //------------------在未按键状态下--------------------------
  76.        {                              //若键被按下,按键状态变为"短按状态"。
  77.           if(KEY_IO==0) KEY_State=PUSH_KEY;
  78.           break;
  79.        }
  80.      case PUSH_KEY:        //-------------按键处于"短按状态"时------------------------
  81.        {
  82.           if(KEY_IO!=0)              //若键被释放,认为是一次短按键
  83.             {
  84.               KEY_State=NOKEY;       //并回到"未按下状态"
  85.                           short_IF  = 0;
  86.                           long_IF  = 0;              
  87.             }
  88.           else if(KeyTimerS>Ticklong) //若按键时间超过Ticks毫秒,认为是一次长按键,
  89.             {
  90.               KEY_State=LONG_PUSH;           // 按键状态变为"长按状态"         
  91.             }      
  92.           break;         
  93.        }
  94.      case LONG_PUSH: //------------按键处于"长按状态"时--------------------
  95.        {
  96.           if(KEY_IO!=0)                //若键被释放,回到未按键状态
  97.             {
  98.               KEY_State=NOKEY;
  99.                           short_IF  = 0;
  100.                           long_IF  = 0;
  101.             }     
  102.           break;            
  103.        }
  104.   }   
  105. }

  106. /****************************************************************************
  107. * 名    称:Key_Answer()
  108. * 功    能:根据按键状态作出响应,控制IO管脚输出电平翻转
  109. * 入口参数:Ticklong:长按键有效时长,单位ms
  110. * 出口参数:无
  111. ****************************************************************************/
  112. void Key_Answer(void)
  113. {
  114.   if((KEY_State==PUSH_KEY)&&(short_IF == 0))  
  115.   {
  116.         short_out = ~short_out;
  117.     Short_Out =  short_out;
  118.         short_IF  = 1;       
  119.   }
  120.   if((KEY_State==LONG_PUSH)&&(long_IF == 0))
  121.   {
  122.         long_out = ~long_out;
  123.         Long_Out =  long_out;
  124.         long_IF  =        1;
  125.   }                 
  126. }

  127. /**************************************************************************************
  128. 名    称:main()
  129. 功    能:主程序
  130. 入口参数:无
  131. 出口参数:无
  132. ***************************************************************************************/
  133. void main()
  134. {
  135.        
  136.      //设置时钟周期Fosc = 4MHz,系统时钟,无法设置
  137.         OPTION = 0x97;                  //复位值0xFF。TIMER0的时钟源是Fosc/4,1us。TIMER0 256预分频,256us
  138. //        CMCON0 = 0xE1;

  139.     TRISGPIO = 0x09;                //GP1、GP2配置为输出。0为输出,1为输入
  140.         short_out = 0;
  141.     Short_Out = short_out;
  142.         long_out = 0;   
  143.         Long_Out = long_out;    //为输出赋初值       

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

  145.         while(1)
  146.         {
  147.                 #asm
  148.                 CLRWDT     
  149.                 #endasm       


  150.                 if(TMR0 < INITIAL_25MS) //1ms 进入1次
  151.                 {
  152.                   TMR0 = INITIAL_25MS;  //增计数,计数周期为256us,计97个数约为25mS。256-125+2=97
  153.                   Key_ScanIO(TIME2/Key_Read_T);//判断按键值
  154.                   Key_Answer();         //根据键值控制输出IO电平翻转
  155.                 }

  156.         }

  157. }

  158. //====================================================代码结束!=================================================
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:156185 发表于 2016-12-20 11:54 | 只看该作者
初学者,学习一下
回复

使用道具 举报

板凳
ID:257739 发表于 2017-12-5 15:51 | 只看该作者
我司有PIC现货,另有可替换的单片机,不需要修改程序跟软件,如有需要请联系颜,13430885511
回复

使用道具 举报

地板
ID:120517 发表于 2017-12-12 15:05 | 只看该作者
学习一下!!!
回复

使用道具 举报

5#
ID:262020 发表于 2017-12-15 14:43 | 只看该作者
能配上电路,更为完善!!!
回复

使用道具 举报

6#
ID:136083 发表于 2018-7-12 11:57 | 只看该作者
功能还能更低吗,传说的2uA呢
回复

使用道具 举报

7#
ID:767774 发表于 2020-6-2 19:09 | 只看该作者
谢谢分享,我是来学习的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表