九、基于定时器的长按与短按

基于定时器的长按与短按

【1】选择内部16MHz时钟的128分频作为计数器1的计数信号。
【2】在定时器1的模模式中实现0.1秒的间隔定时。
【3】当SW1按键长按松开后,切换D4灯的开光状态,当SW1按键短按松开后,切换D6灯的开光状态。
【注】按键按下时间大于0.5秒,可定义为长按,反之为短按。
在这里插入图片描述

# include"ioCC2530.h"
#define D4 P1_1
#define D6 P1_4
#define SW1 P1_2
unsigned int count=0;
unsigned char K_Press=0;
void Delay(unsigned char t)
{
   
  while(t--);
}
void Init_Port()
{
   
  P1SEL &=~0X1B;
  P1DIR |=0X1B;
  P1&=~0X1B<
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用定时器也可以判断按键的按和短按。下面是一个使用定时器的C51程序: ``` #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit key = P3^0; // 定义按键引脚 uint count = 0; // 定义计数器 uchar flag = 0; // 定义标志位 void timer0() interrupt 1 // 定时器0中断服务程序 { TH0 = (65536-50000)/256; // 定时器0重新赋初值 TL0 = (65536-50000)%256; count++; // 计数器自增 } void main() { TMOD = 0x01; // 设置定时器0为模式1 TH0 = (65536-50000)/256; // 设置定时器0初值 TL0 = (65536-50000)%256; ET0 = 1; // 打开定时器0中断允许 EA = 1; // 打开总中断允许 key = 1; // 初始化按键引脚 while(1) { if(key == 0) // 检测按键是否按下 { flag = 1; // 设置标志位为1 while(key == 0); // 等待按键释放 } if(flag == 1) // 如果标志位为1,即检测到按键按下 { if(count >= 1000) // 如果计数器超过一定值,即判断为按 { count = 1000; // 防止计数器溢出 P1 = 0xff; // 按时的操作 flag = 0; // 重置标志位 count = 0; // 重置计数器 } else if(key == 1) // 如果计数器没有超过一定值,且按键已经释放,即判断为短按 { P1 = ~P1; // 短按时的操作 flag = 0; // 重置标志位 count = 0; // 重置计数器 } } } } ``` 这个程序的原理是使用定时器0产生中断,在中断服务程序中将计数器自增,通过比较计数器的值来判断按键按下的时间。如果计数器的值超过一定值,即判断为按,否则判断为短按。需要注意的是,这里使用了一个标志位`flag`来判断是否检测到按键按下,防止重复计数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值