久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
單片機(jī)長短按鍵控制程序
[打印本頁]
作者:
lclbf
時(shí)間:
2021-9-11 11:07
標(biāo)題:
單片機(jī)長短按鍵控制程序
實(shí)際應(yīng)用中很多地方用到按鍵長短按鍵。下面是我寫的代碼,一是作為我自己筆記在這里,二看有沒有朋友有更好的寫法。代碼如下:
#include"stc15w.h"
#define u8 unsigned char
#define u16 unsigned int
sbit LEDR = P1^0;
sbit LEDG = P1^1;
sbit LEDB = P1^2;
sbit KEY = P0^0;
u16 keyTim; //按鍵時(shí)間
u16 sysTim; //系統(tǒng)時(shí)間
u8 keyshort; //短按鍵標(biāo)志
u8 keylong; //長按鍵標(biāo)志
u8 LEDON; //開燈狀態(tài)
u8 flag1ms; //1ms標(biāo)志
void key_Proc(); //按鍵處理
void led_Proc(); //燈處理
void Timer0Init(); //中斷初始化
void main()
{
LEDR = 0; //上電燈全滅(上電燈初始化)
LEDG = 0;
LEDB = 0;
Timer0Init(); //中斷初始化
while(1)
{
key_Proc(); //按鍵處理
led_Proc(); //燈處理
}
}
void key_Proc() //按鍵處理
{
if(flag1ms) //1ms時(shí)間標(biāo)志
{
flag1ms = 0;
if(KEY)
{
if((keyTim>10)&&(keyTim<500)) //按鍵時(shí)間大于10ms小于50ms,是短按鍵
{
keyshort = 1; //短按鍵標(biāo)志
}
keyTim = 0; //按鍵時(shí)間清零
}
else
{
if(keyTim<10001) //按鍵時(shí)間小于10S
keyTim++; //按鍵時(shí)間加
if(keyTim==1000) //按鍵時(shí)間為1S
{
keylong = 1; //長按鍵標(biāo)志
}
}
}
}
void led_Proc() //燈處理
{
static u8 i;
if((LEDON==0)&&(keylong==1)) //關(guān)燈狀態(tài)同時(shí)長按鍵按下就開燈
{
keylong = 0; //長按鍵松開
LEDON = 1; //關(guān)燈時(shí)就開燈
LEDR = 1; //RGB燈亮白光
LEDG = 1;
LEDB = 1;
}
if((LEDON==1)&&(keylong==1)) //開燈狀態(tài)同時(shí)長按鍵按下就關(guān)燈
{
keylong = 0; //長按鍵松開
LEDON = 0; //開燈時(shí)就關(guān)燈
LEDR = 0; //RGB燈滅
LEDG = 0;
LEDB = 0;
}
if((LEDON==1)&&(keyshort==1)) //開燈狀態(tài)同時(shí)短按鍵按下,亮燈模式切換
{
keyshort = 0; //短按鍵松開
switch(i)
{
case 0:LEDR = 1;LEDG = 0;LEDB = 0;break; //紅
case 1:LEDR = 1;LEDG = 1;LEDB = 0;break; //黃
case 2:LEDR = 0;LEDG = 1;LEDB = 0;break; //綠
case 3:LEDR = 0;LEDG = 1;LEDB = 1;break; //青
case 4:LEDR = 0;LEDG = 0;LEDB = 1;break; //藍(lán)
case 5:LEDR = 1;LEDG = 0;LEDB = 1;break; //紫
case 6:LEDR = 1;LEDG = 1;LEDB = 1;break; //白
}
i++;
i = i%7; //7次循環(huán)切換
}
}
void Timer0Init() //中斷初始化
{
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T(12分頻)模式
EA = 1; //開中斷
TMOD &= 0XF0; //中斷0模式1
TMOD |= 0X01;
TH0 = 0XFC; //初值1ms
TL0 = 0X66;
ET0 = 1; //允許T0中斷
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
}
void interruptTimer0() interrupt 1
{
TH0 = 0XFC;
TL0 = 0X66;
flag1ms = 1; //1ms標(biāo)志
sysTim++; //系統(tǒng)時(shí)間
}
作者:
cdiyy
時(shí)間:
2021-9-12 10:04
驗(yàn)證了好像代碼不行,。正在調(diào)試一下看看行不行
作者:
lclbf
時(shí)間:
2021-9-13 08:28
cdiyy 發(fā)表于 2021-9-12 10:04
驗(yàn)證了好像代碼不行,。正在調(diào)試一下看看行不行
我用的STC的單片機(jī),可以的。
作者:
ax6808
時(shí)間:
2022-11-29 19:15
寫的很好,很清晰,很難得!必須暫1個(gè)!
長短按時(shí)長閥值:可根據(jù)實(shí)際調(diào)整; 看過吳堅(jiān)鴻老師的教程.
期間由于受外界干擾或者按鍵抖動,而使 IO 口突然瞬間觸發(fā)成高電平,這個(gè)時(shí)候馬上把延時(shí)計(jì)數(shù)器清零了,這個(gè)過程非常巧妙,可非常有效地去除瞬間的雜波干擾。這是他實(shí)戰(zhàn)中摸索出來的。 以后凡是用到開關(guān)感應(yīng)器的時(shí)候,都可以用類似這樣的方法去干擾。
如果按鍵按下的時(shí)間超過了短按閥值,則馬上把短按標(biāo)=1;
如果還沒有松手,一旦發(fā)現(xiàn)按下的時(shí)間超過長按閥值時(shí)(個(gè)人覺得1-2秒合適了),先把短按標(biāo)志清零,然后觸發(fā)長按。在這段程序里,把自鎖標(biāo)志置位,是為了防止按住按鍵不松手后一直觸發(fā)。
作者:
ax6808
時(shí)間:
2022-12-1 15:06
這里 sysTim=keyTim 可能另有他用吧!
作者:
1478312152
時(shí)間:
2023-9-6 07:56
剛試過可以運(yùn)行,實(shí)測長短按鍵很難區(qū)分開,所以無實(shí)用性
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品成人一区二区三区
|
91超碰人人
|
日日干天天操
|
三级黄色片免费看
|
欧美精品乱码99久久蜜桃
|
日韩中文字幕一区
|
丁香五香天堂网
|
黄色a毛片
|
黄色小视频在线免费观看
|
久久久精品在线
|
酒色成人网
|
国产三级在线观看
|
亚洲成a人片
|
欧美天天
|
午夜99
|
亚洲精品在线视频观看
|
日韩av专区
|
四虎网站在线观看
|
欧美毛片基地
|
9.1成人看片免费版 999在线视频
|
香蕉视频在线观看网站
|
黄色小视频免费看
|
国内av在线
|
国产精品欧美精品
|
特黄网站
|
黄网在线
|
视频一区二区三区在线观看
|
精品久久视频
|
国产福利小视频
|
亚洲不卡视频
|
国产精品麻豆视频
|
国产精品黄色
|
国产精品偷乱一区二区三区
|
免费在线观看av
|
四虎影院免费观看
|
特黄a级片
|
国产毛片在线
|
欧美激情视频在线
|
中文字幕免费
|
一级片在线观看视频
|
av免费在线观看网站
|