標題:
如何把的程序加一個長按按鍵功能?
[打印本頁]
作者:
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; // 記得標為靜態(tài)變量
if(k1==0)
{
if(++key_press_time <=0 )
--key_press_time; //計量按鍵時間,并避免數(shù)據(jù)溢出
if(key_press_time==100) //以10ms為時基 計數(shù)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; //計量按鍵時間,并避免數(shù)據(jù)溢出
這里key_press_time被定義成unsigned int了,不會出現(xiàn)小于的情況吧,如果unsigned int是二字節(jié)的,那么當它等于0xffff時,再加1就會變成0,并溢出位on,產(chǎn)生溢出。這也沒避免數(shù)據(jù)溢出吧。
是否要寫成:
if(++key_press_time==0xffff)
--key_press_time;
作者:
hhh402
時間:
2022-10-19 10:13
樓主的程序是開發(fā)板上的程序只適合了解按鍵的原理,實際按鍵程序是用定時器來實現(xiàn)的。給你一個參考程序:
http://www.torrancerestoration.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();
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1