历史上的今天
今天是: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 #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
上一篇:学习pic单片机经验
史海拾趣
|
MCF52233_CFM—Coldfire Flash Module Coldfire的CFM功能是把它的flash当作EEPROM来用。使用起来还是很方便的,只要完成几个小的功能函数就行了: 第一个是CFM的初始化CFM_init(),完成时钟的设置; 第二个是页擦除CFM_Page_eraser(), ...… 查看全部问答> |
|
1、隐形的备用电池 你的手机电量不足了,为了让它能够继续使用,按*3370#键,手机会重新启动,启动完毕后,你就会发现电量增加了50%。这部分隐藏的备用电量 用完了你就必须得充电了,再次充电的时候,隐形的备用电池也同时充电,下次电量低的时候 ...… 查看全部问答> |
|
【转帖】作者:冷昭军 现任深圳茂硕电源科技股份有限公司 电源开发工程师 很多电源工程师对开关电源中高频磁性元件的设计存在错误的概念,其设计出来的高频磁性元件不能满足应用场合的要求,影响了研发的进度和项目的按期完成。基 于开关电源及 ...… 查看全部问答> |
|
我用的软件是EVC4.0,我创建了Dialog base对话框或者Single document,在控件栏中都没有webbrowser控件。 请问是要怎么样才能加上去呢?… 查看全部问答> |
|
程序也不大,电路图也不复杂,就是数码管动态显示,用中断搞了一个表,结果mcu的clock设置11.0592MHz时,就过载了,设成300KHz就还可以,可是毕竟是个表啊,查Proteus的帮助说把电阻什么的都数字化,可是还是不行,版本v7.1,求教,谢谢!… 查看全部问答> |
|
刚装了ISE11.1 安装过程顺利,能打开软件,不过在调试正确的程序源文件时总是不能综合完成,也没有任何错误。只是最后显示 Process \"Synthesis\" failed &n ...… 查看全部问答> |




