完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我做了一个一个按键两种功能的程序,就是一按短时间就亮小灯,长按就亮大灯的程序,但时序时候好困难,希望帮手看看!!!
#include #include "ET18F11.h" __CONFIG(0X3044); #define uchar unsigned char #define uint unsigned int uint num,num1; bit duan_flag,chang_flag1; void delay(uint n) { uint i,j; for(i=n;i>0;i--) for(j=110;j>0;j--); } void init_com() { OPtiON=0X00; WPUA2=1; TRISA=0XFF; TRISC=0X00; ORTA=0X00; ORTC=0X00; //初始化必须置零。 //TMR0=0X06; //T0IE=0; //T0IF=0; //OPTION=0X02; GIE=1; INTCON=0XC0; //PIE1=0X01; //TMR1H=(65536-50000)/256; //TMR1L=(65536-50000)%256; //T1CON=0X01; } void scankey() { if(RA2==0) { delay(10); num++; if(num<200) { duan_flag=1; if(num>200) { chang_flag1=1; duan_flag=0; } } } else if(RA2==1) { num=0; if(duan_flag==1) { duan_flag=1; } } } void display() { if(chang_flag1==1) { RC1=!RC1; chang_flag1=0; duan_flag=0; } if(duan_flag==1) { while(RA2==1) { RC6=!RC6; RC7=!RC7; duan_flag=0; chang_flag1=0; } } } void main() { init_com(); while(1) { scankey(); display(); } } /* void interrupt timer0() { if(TMR1IF=1) TMR1IF=0; TMR1H=(65536-50000)/256; TMR1L=(65536-50000)%256; num++; } */ |
|
相关推荐
7个回答
|
|
设计个局部静态变量,利用延时,并记录下进入的次数就可以判断是长按还是短按了。
|
|
|
|
在定时器中,设置好进入定时的时间,在中断中
/********************************************************************************************************* ** 函数名称: key_driver ** 功能描述: 按键状态机,可以实现消抖、短按、长按 ** ** 输 入: 无 ** ** 输 出: 无 ** ** 全局变量: 无 ** 修改人: 程铭栋 ** 日 期: 2011年10月10日 **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ unsigned char key_driver(void) { static unsigned char key_state = key_state_0, key_time = 0; unsigned char key_press, key_return = N_key; key_press = key_input; // 读按键I/O电平 switch (key_state) { case key_state_0: // 按键初始态 if (key_press) key_state = key_state_1; // 键被按下,状态转换到按键消抖和确认状态 break; case key_state_1: // 按键消抖与确认态 if (key_press) { key_time = 0; // key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件 } else key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。 break; case key_state_2: if(!key_press) { key_return = S_key; // 此时按键释放,说明是产生一次短操作,回送S_key key_state = key_state_0; // 转换到按键初始态 } else if (++key_time >= 10) // 继续按下,计时加10ms(10ms为本函数循环执行间隔) { key_return = L_key; // 按下时间>1000ms,此按键为长按操作,返回长键事件 key_state = key_state_3; // 转换到等待按键释放状态 } break; case key_state_3: // 等待按键释放状态,此状态只返回无按键事件 if (!key_press) key_state = key_state_0; //按键已释放,转换到按键初始态 break; } return key_return; } /********************************************************************************************************* ** 函数名称: key_read ** 功能描述: 先根据key_driver的状态指示,再根据按键的状态,确定到底是不按、短按、双击、长按 ** ** 输 入: key_driver ** ** 输 出: 无 ** ** 全局变量: 无 ** 修改人: 程铭栋 ** 日 期: 2011年10月10日 **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ unsigned char key_read(void) { static unsigned char key_m = key_state_0, key_time_1 = 0; unsigned char key_return = N_key,key_temp; key_temp = key_driver(); switch(key_m) { case key_state_0: if (key_temp == S_key ) { key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击 key_m = key_state_1; } else key_return = key_temp; // 对于无键、长键,返回原事件 break; case key_state_1: if (key_temp == S_key) // 又一次单击(间隔肯定<500ms) { key_return = D_key; // 返回双击键事件,回初始状态 key_m = key_state_0; } else { // 这里500ms内肯定读到的都是无键事件,因为长键>1000ms,在1s前低层返回的都是无键 if(++key_time_1 >= 5) { key_return = S_key; // 500ms内没有再次出现单键事件,返回上一次的单键事件 key_m = key_state_0; // 返回初始状态 } } break; } return key_return; } |
|
|
|
|
|
|
|
我还是没有搞懂,最好在我原来的地方上改好!!!我用的是PIC的!!
|
|
|
|
为什么要静态变量???
|
|
|
|
自己想一下.
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2990 浏览 16 评论
3490 浏览 1 评论
9052 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2332浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 22:28 , Processed in 1.240362 second(s), Total 91, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号