标题:
如何把的程序加一个长按按键功能?
[打印本页]
作者:
haolong155
时间:
2020-6-28 00:56
标题:
如何把的程序加一个长按按键功能?
要求在原程序上增加 k1 按键的 长按功能。 长按一秒 led 和 led1 灯一起亮。
单片机源程序如下:
#include <AT89X52.H>
unsigned char n = 0;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void delay()
{
unsigned int i, j;
for(i = 0; i < 100; i++) for(j = 0; j < 100; j++);
}
void readkey(void)
{
unsigned char i, j;
if(!k1) {
for(i = 0; i < 10; i++)
for(j = 0; j < 120; j++);
if(!k1) {
while(!k1);
n++;
n %= 2; //n = 0~0
}
}
}
main()
{
while(1) {
switch(n) {
case 0: led = 1;led1 = 1; readkey(); break;
case 1: led1 = 0; delay(); readkey(); led=~led;
}
}
}
作者:
1339337425
时间:
2020-6-28 06:23
需要使用定时器,按键扫描程序可以拓展
#include <reg51.h>
unsigned char n = 0;
unsigned char flag1ms,flag10ms;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void key_led(void);
void Timer0Init(void); //初始化定时器
void main()
{
Timer0Init();
while (1)
{
if(flag1ms) //以1ms为时基
{
flag1ms=0;
flag10ms++;
switch(n) {
case 0: led = 1;led1 = 1;break;
case 1: led1 = 0; led=~led;
}
if(flag10ms>=10) //每10ms进行一次按键扫描
{
flag10ms=0;
key_led();
}
}
}
}
void Timer0() interrupt 1
{
//重装载
flag1ms=1;
TH0=0XFC;
TL0=0X18;
}
void key_led(void)
{
static unsigned int key_press_time = 0; // 记得标为静态变量
if(k1==0)
{
if(++key_press_time <=0 )
--key_press_time; //计量按键时间,并避免数据溢出
if(key_press_time==100) //以10ms为时基 计数100相当于1s,为长按
{
led=0; //添加事件
led1=0;
}
}
else //短按
{
if(2<=key_press_time && key_press_time <100) //按键时长大于20ms,小于1s
{
n++;
n%=2;
}
key_press_time=0;
}
}
void Timer0Init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
IT0=1;
}
作者:
wulin
时间:
2020-6-28 09:36
#include <REG51.H>
unsigned int n = 0;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void readkey(void)
{
if(!k1)
{
if(n<25001)
n++;
if(n==25000) //长按
led1=~led1;
}
else
{
if(n>2500&&n<25000)//短按
led=~led;
n=0;
}
}
void main()
{
while(1)
{
readkey();
}
}
作者:
新昌小徐
时间:
2022-10-19 07:34
if(++key_press_time <=0 )
--key_press_time; //计量按键时间,并避免数据溢出
这里key_press_time被定义成unsigned int了,不会出现小于的情况吧,如果unsigned int是二字节的,那么当它等于0xffff时,再加1就会变成0,并溢出位on,产生溢出。这也没避免数据溢出吧。
是否要写成:
if(++key_press_time==0xffff)
--key_press_time;
作者:
hhh402
时间:
2022-10-19 10:13
楼主的程序是开发板上的程序只适合了解按键的原理,实际按键程序是用定时器来实现的。给你一个参考程序:
http://www.51hei.com/bbs/dpj-208253-1.html
作者:
lkc8210
时间:
2022-10-19 15:02
#include <REG52.H>
unsigned char n = 0;
sbit k1 = P1^0;
sbit led = P0^0;
sbit led1 = P0^1;
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void readkey(void)
{
static unsigned int i=0;
if(!k1)
{
if(i<0xFFFF)i++;
if(i==1000)
{
n = 2; //n = 0~0
}
}else{
if(i>20 && i<1000)n=++n%2;
i=0;
}
}
main()
{
while(1)
{
readkey();
switch(n)
{
case 0:
led = 1;
led1 = 1;
break;
case 1:
led1 = 0;
led=~led;
break;
case 2:
led = 0;
led1 = 0;
break;
}
Delay1ms();
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1